本日はShader勉強枠です。
先日までSurfaceShaderを勉強していきました。
本日は頂点Shaderやフラグメントシェーダーを扱います。
●VertexShader(頂点シェーダー)・フラグメントシェーダーとは?
それぞれのオブジェクトのメッシュの頂点・ピクセルデータを扱うことができるShaderです。
頂点シェーダーは頂点1つ1つを処理するときに呼ばれます。
フラグメントシェーダーは1つ1つのピクセルを処理するときに呼ばれます。
サーフェースシェーダー同様
Subshader{ Pass{ CGPROGRAM ENDCG } }
内に記述されます。
〇単色な頂点シェーダーの例
Shader "Custom/SolidColor" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag float4 vert(float4 v:POSITION) : POSITION { return mul (UNITY_MATRIX_MVP, v); } fixed4 frag() : COLOR { return fixed4(1.0,0.0,0.0,1.0); } ENDCG } } }
●pragma vertex vert
サーフェースShader同様 #pragma vertex vertで頂点シェーダーをvert関数を使用してコンパイルするコンパイル命令です。
●pragma fragment frag
フラグメントシェーダーをfrag関数を使用してコンパイルするコンパイル命令です。
●float4 vert(float4 v:POSITION) : POSITION
頂点シェーダーの関数です。
ここでvはオブジェクトの各頂点を意味します。 :POSITIONはセマンティクスと呼ばれ返された値を何に使用するかを指定します。 ここで返される値として各頂点の位置x,y,zにくわえwの浮動小数点を扱います。
このwとはローカル座標にある状態で1の値を取る数値です。
このwがあることでオブジェクトの移動が行えるようになるようです。
wは[視錐台の拡大率]を意味します。 視錐台というものはUnityのカメラでオブジェクトを描画するNearClipの面NearClippingPlaneとFarClippingの面FarClippingPlaneの間の台形の領域を指します。
この拡大率がwを表すようです。 (参考にさせていただきました。)
●return mul (UNITY_MATRIX_MVP, v);
vert関数の処理では、3D の座標が 2D ウィンドウに投影しています。
この処理では、3D 位置にモデルビュープロジェクション(UNITY_MATRIX_MVP)と呼ばれる行列を乗算する必要があります。
この[UNITY_MATRIX_MVP]はUnityで用意されている組み込みの変数で、現在のモデルビュー行列×射影行列 を行うという意味です。
●fixed4 frag() ; COLOR
フラグメントシェーダーの関数fragを記述しています。
ここではカラーを指定しています。
●return fixed4(1.0,0.0,0.0,1.0);
フラグメントシェーダーで処理される各ピクセルの色を指定しています。
これはRGBに透過率Alphaを含んだ数値が使用され0~1で記述します。
つまりreturn fixed4(0.0,1.0,0.0,1.0);と記述した場合色は緑に変化します。
このShaderを扱うマテリアルをUnityで見ると次のようになります。
今回は頂点・フラグメントシェーダーの基本的なものを単色Shaderを見ながら勉強しました。