今回もShader学習枠です。
MRGTのプロジェクトリーダーであり、筆者の尊敬しているエンジニアでもあるCameronさんによるShaderに関する講座がYoutube上で公開されています。
全編が英語なのと、若干読み解きにくいところもあったため読み解いています。
公開されている動画はこちらになります。
〇セッションの内容
セッションは次の8つのセクションで区切られています。
§1Shaderとは何か?
§ 2 Shaderの実行
§3 マテリアルとレンダーモード
§4 MixedReality における注意点
§5 パフォーマンスと最適化ツール
§6 デバッグ
§7 その他のリファレンス
§8 Q&A
現在は§2を見てShaderLabの構造を理解しています。
今回は引き続き続きを見てShaderの処理と実行を見ていきます。
〇フラグメントシェーダー
フラグメントシェーダーはグラフィックスパイプラインのフラグメントブロックで実行されるシェーダーです。
ここでの役割はラフタライゼージョン(ラフタライズ)によってピクセルに変換された画面をピクセルごとに色を決めて塗りつぶす作業です。
fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; }
フラグメントシェーダーはfragという名前のエントリーポイントとして定義されています。
#pragma fragment frag
フラグメントシェーダーの出力はRGBAの四次元であらわされる色情報のためfixed4型が使用されます。
また入力情報として頂点シェーダーより引き継がれるv2fが使用されています。
fixed4 col = tex2D(_MainTex, i.uv);
処理では_MainTexのテクスチャをサンプリングしています。
tex2DはUnityCG.cgincで定義される関数で第一引数にテクスチャ(Sampler2D)、第二引数に座標(fixed2)を指定することでサンプリングが行われます。
Fogに関しても処理がされていますが、これは遠くの山などの遠景オブジェクトに対して聞いてくる効果のためあまりMRで使用されることはありません。
以上で光の影響を受けないシェーダーの中身を見ていきました。
この基本的なシェーダーにUnity内のライト情報を取得し、影をつける処理を加えることでLitなシェーダーになります。
以上で§2を読み解けました。
次回から§3のレンダリングモードに関してみていきます。
実のところ筆者は§2の内容はほぼ知っているものだったもののレンダリングモードに関しては、カンペなしで説明できるくらいの知識量が無かったりするので楽しみです。