本日は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は今回初めて知ったので今後使用していきたいです。