夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedReality-GraphicsTools-Unityを触る その⑦ StandardShaderでURP、ビルドイン両方のパイプラインにおける処理の流れを追う

本日はMRTK3調査枠です。

現在GraphicsToolsに関して調査しています。

前回まではドキュメントを読み解いていました。

redhologerbera.hatenablog.com

 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が指定されたパッケージのもとで動作することを定義します。

docs.unity3d.com

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