夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityでShaderを勉強する その⑬ 頂点・フラグメントShaderを書く

本日は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の間の台形の領域を指します。

 f:id:Holomoto-Sumire:20200429093305p:plain

docs.unity3d.com

 この拡大率がwを表すようです。   (参考にさせていただきました。)

www.marupeke296.com

●return mul (UNITY_MATRIX_MVP, v);

 vert関数の処理では、3D の座標が 2D ウィンドウに投影しています。

 この処理では、3D 位置にモデルビュープロジェクション(UNITY_MATRIX_MVP)と呼ばれる行列を乗算する必要があります。

 この[UNITY_MATRIX_MVP]はUnityで用意されている組み込みの変数で、現在のモデルビュー行列×射影行列 を行うという意味です。

docs.unity3d.com

●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で見ると次のようになります。

f:id:Holomoto-Sumire:20200429091415j:plain

 今回は頂点・フラグメントシェーダーの基本的なものを単色Shaderを見ながら勉強しました。

〇過去のShaderに関する記事

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com