本日はシェーダー学習枠です。
現在MRTKやMRGTでグラフィックを担当されているMicrosoftのCameronさんによるMR向けのShader解説セッションを読み解いています。
前回までは§2のシェーダーの実行をコードを読み解きながら見ていました。
今回からは§3です。
〇セクションの内容
セッションは次の8つのセクションで区切られています。
§1Shaderとは何か?
§ 2 Shaderの実行
§3 マテリアルとレンダーモード
§4 MixedReality における注意点
§5 パフォーマンスと最適化ツール
§6 デバッグ
§7 その他のリファレンス
§8 Q&A
〇MixedReality用アプリで、シェーダーを作成するうえで注意すべき事項
HoloLens 2などに向けてシェーダーを作成するうえではパフォーマンスにおいていくつかの注意が必要になることがあります。
具体的にはフィルレートの削減によって最終的なピクセルを描画する際の工程数を削減します。
フィルレート(Fill rate)は概要だけ見るとピクセルをレンダリングするためにかかる工程数になります。
主に次のような要素で変化します。
・レンダリング/処理を行う数(Unityの場合オブジェクト数)
・Shaderの処理数
・GPUステージ数(ポストプロセスやアンチエイリアシング、ジオメトリシェーダーなど)
・描画されるピクセル数=解像度
このためによりシンプルなシェーダーを使用することがMR開発に求められています。
例えばUnityに標準搭載されているものだと光の演算を行わないUnlitやモバイル用に開発されたMobile Shaderなどがあります。
またMRに特化したものとしてMixedRealityGraphicsToolsで提供されているStandardShaderもあります。
〇MRデバイスの描画(シングルパスインスタンシング)
HoloLensをはじめとするMRデバイスのレンダリングでは、2つの画面を持っています。(右目、左目)
つまり右目左目でそれぞれ2回の描画を行っていますが、Shaderによっては片目のみしか描画されないことがあります。
この際たいていは左目のみが描画されることになります。
これは2眼デバイスでパフォーマンスを向上させるプロセスにおいてShader側が対応していない場合発生します。
これをシングルパスインスタンシングレンダリングと呼んでいます。
また律儀に2回レンダリングする方式をMulti Pass レンダリングと呼びます。
シングルパスインスタンシングレンダリングはマルチパスに比べ、レンダリング工数を下げることができるので、パフォーマンスの向上につながります。
シングルパスインスタンシングレンダリングにShaderを対応させるためにはShaderに変更を加える必要があります。
①appdata構造体に一行追加を行います。
struct appdata { float4 vertex: POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID //追加 }
②v2f構造体に一行追加を行います。
struct v2f { float uv : TEXCOORD0; float4 vertex : SV_POSITION; UNITY_VERTX_OUTPUT_STEREO;//追加 }
インスタンスIDマクロをデータ構造体に追加して、V2f構造体に出力マクロを追加しています。
ここまでのイメージとしては左目に描画した際にキャッシュを残しておくといったところでしょうか?
③最後に頂点シェーダーに処理を加えます。
v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); //追加 UNITY_INITIALIZE_PUTPUT(v2f , o);//追加 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);//追加 ・・・ }
ここでは頂点出力構造を初期化しています。
この3点でShaderがシングルパスインスタンシングに対応します。
本日は以上です。
次回パフォーマンスと最適化ツールのセクションを読み解きます。