今回はShader学習枠です。
MRGTのプロジェクトリーダーであり、筆者の尊敬しているエンジニアでもあるCameronさんによるShaderに関する講座がYoutube上で公開されています。
全編が英語なのと、若干読み解きにくいところもあったため読み解いています。
公開されている動画はこちらになります。
〇セッションの内容
セッションは次の8つのセクションで区切られています。
§1Shaderとは何か?
§ 2 Shaderの実行
§3 マテリアルとレンダーモード
§4 MixedReality における注意点
§5 パフォーマンスと最適化ツール
§6 デバッグ
§7 その他のリファレンス
§8 Q&A
現在は§2を見てShaderLabの構造を理解しています。
今回は引き続き続きを見てShaderの処理と実行を見ていきます。
〇Appdata
Shaderの処理はデフォルトでstruct appdataから始まります。
Pass { CGPROGRAM ... #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; ... ENDCG }
この構造体はメッシュデータから頂点シェーダーで使用するものを定義します。
一般的に最低限メッシュの頂点は定義されています。
float4 vertex : POSITION;
float4型でvertexを定義していますが、その次の:POSITIONという属性はセマンティックと呼ばれるものです。
これは型のようにある程度定義されたものが提供されており、定義したデータがShader内でどのように使用されるのかを指定します。
POSITONというのは座標として使用されるという意味になります。
〇V2f
次にstruct v2fがappdataと同じようにあります。
struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; };
これはフラグメントシェーダーで使用されるデータを格納する構造体で、頂点シェーダーからフラグメントシェーダーに渡すデータをしています。
float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION;
Shaderではそのまま頂点シェーダーでの出力が返されるように見えますが、実際のグラフィックスパイプライン上ではラフタライズの処理が行われ、頂点がピクセルに変換されています。
〇変数宣言
次にプロパティ変数の宣言が行われています。
ここは普通のC#などと同様に関数内で使用される変数が格納されます。
sampler2D _MainTex; float4 _MainTex_ST;
C#などではクラス(ファイル)で一回定義を行います。
ShaderではPropertiesブロックでパブリックな変数を定義していますが、HLSL文内では別に宣言する必要があります。
今回はここまでです。
次回いよいよ頂点シェーダーの処理を行います。