本日はMRTK3調査枠です。
現在GraphicsToolsに関して調査しています。
前回まではドキュメントを読み解いていました。
GraphicsToolsStandardシェーダーはURP、ビルドインの両方のグラフィックパイプラインに対応しています。
今回は一つのシェーダーで複数のパイプラインに対応させる処理の仕組みを見ていきます。
〇GraphicsStandardシェーダーのレンダーパイプラインの処理の流れ
今回はGraphicsStandardシェーダーの処理の流れを見ていきます。
GraphicsStandardシェーダーは二つのPassを含むSubShaderが二つ、合計4つのPassブロックで構成されています。
それぞれURP、ビルドイン用のメインの処理とエディタ上で動くSubShaderとなります。
Shader "Graphics Tools/Standard" { Properties { } ///URPのサブシェーダー SubShader { PackageRequirements { "com.unity.render-pipelines.universal": "10.6.0" } Tags { "RenderPipeline" = "UniversalPipeline" "RenderType" = "Opaque" } // Default pass (only pass outside of the editor). Pass { ... Stencil { ... } HLSLPROGRAM #define _URP ... #include_with_pragmas "GraphicsToolsStandardProgram.hlsl" ENDHLSL } Pass { Name "Meta" ... HLSLPROGRAM #define _URP #include_with_pragmas "GraphicsToolsStandardMetaProgram.hlsl" ENDHLSL } } ///ビルドインレンダーパイプラインのサブシェーダー ///URPでは動きません。 SubShader { ... Pass { Name "Main" ... HLSLPROGRAM ... #include_with_pragmas "GraphicsToolsStandardProgram.hlsl" ENDHLSL } Pass { Name "Meta" ... HLSLPROGRAM #include_with_pragmas "GraphicsToolsStandardMetaProgram.hlsl" ENDHLSL } } CustomEditor "Microsoft.MixedReality.GraphicsTools.Editor.StandardShaderGUI" }
メインとなる処理はGraphicsToolsStandarProgram.hlslおよび GraphicsToolsStandardMetaProgram.hlslをincludeしています。
URPとビルドインシェーダーの区別はURP用となる最初のパスでPackageRequirements{}ブロックがあることで区別されています。
PackageRequirements { "com.unity.render-pipelines.universal": "10.6.0" }
PackageRequirementsはパスおよびSubShaderが指定されたパッケージのもとで動作することを定義します。
これはShaderエラーを回避するほか、今回のようにURP、ビルドイン両方に対応したシェーダーを一つのシェーダーで作成できるメリットがあります。
これによってURPとビルドインを区別し、URP上での処理では
#define _URP
でURPのキーワードを定義することでhlslファイルの中で処理を分岐させています。
一例をとるとalbedoはURPの場合はSAMPLE_TEXTURE2D()ビルドインではtex2D()の関数が分岐で使用されます。
#if defined(_URP) half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv); #else half4 albedo = tex2D(_MainTex, input.uv); #endif
今回は以上です。
PackageRequirementsは今回初めて知ったので今後使用していきたいです。