今回はShader学習枠です。
MRGTのプロジェクトリーダーであり、筆者の尊敬しているエンジニアでもあるCameronさんによるShaderに関する講座がYoutube上で公開されています。
全編が英語なのと、若干読み解きにくいところもあったため読み解いています。
公開されている動画はこちらになります。
〇セッションの内容
セッションは次の8つのセクションで区切られています。
§1Shaderとは何か?
§ 2 Shaderの実行
§3 マテリアルとレンダーモード
§4 MixedReality における注意点
§5 パフォーマンスと最適化ツール
§6 デバッグ
§7 その他のリファレンス
§8 Q&A
現在は§2を見てShaderLabの構造を理解しています。
今回は引き続き続きを見てShaderの処理と実行を見ていきます。
〇頂点シェーダー
頂点シェーダーはグラフィックスパイプラインの頂点シェーダーブロックで実行される処理です。
v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; }
関数名はvertという名前ですが、これは
HLSL文頭で頂点シェーダーのエントリーポイントとして定義されていました。
#pragma vertex vert
すべての頂点に対して処理が行われ、それらはv2f構造体に出力されます。
頂点シェーダーで最初に行われていることは出力構造体を定義しています。
v2f o;
デフォルトではOutputからoと置き換えられていますが、任意に変更できます。
次に頂点をUnityのローカル空間に変換しています。
o.vertex = UnityObjectToClipPos(v.vertex);
UnityObjectToClipPos()はUnityCG.cgincで定義されているシェーダーマクロで、与えられた頂点をUnityの軸に合わせて変換しています。
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
次にテクスチャ座標などで用いられるuvを渡しています。
おこなわれている重要なことは上記の二つです。
最低限頂点の変換が行われていればUnity側でオブジェクトの描画自体は正常に行われています。
頂点の変換に関しては動画内の図がわかりやすかったです。
通常モデルをアプリごとの環境に合わせて配置するためには軸などの関連で行列を使用して座標を変換しています。
UnityObjectToClipPos()はMVP行列と呼ばれるモデルをビュー(見た目)に応じて投影する行列が使用されています。
ShaderではマクロとしてMATRIX_MVPなどの表記も見ることがありますが、これは同義の意味を持ちます。
モデル行列が作成したメッシュをシーンのどこに配置するか?
ビュー行列を掛け合わせることで、カメラに対しての位置や向きなどを定義
最後の投影行列で、カメラに対してのアスペクト比(奥行)を決めます。
頂点シェーダーは以上になります。
頂点を変換する際に変数をかけ合わせたりすることで頂点の移動が行われモデルの変形なども行えます。
次回はフラグメントシェーダーを見ていきます。