docs.unity3d.com
    目次を表示する/隠す

    URP の基本的な Unlit シェーダー

    この例は、URP 互換の基本的なシェーダーを示しています。このシェーダーは、シェーダーコード内に事前定義されている色でメッシュ形状を塗りつぶします。

    シェーダーの実際の動作を確認するには、以下の ShaderLab コードをコピーしてシェーダーアセット内に貼り付けます。

    // このシェーダーはコード内に事前定義されている色でメッシュ形状を塗りつぶします。
    Shader "Example/URPUnlitShaderBasic"
    {
        // Unity シェーダーのプロパティブロック。この例では出力の色がフラグメントシェーダーの
        // コード内に事前定義されているため、このブロックは空です。
        Properties
        { }
    
        // シェーダーのコードが含まれる SubShader ブロック。
        SubShader
        {
            // SubShader Tags では SubShader ブロックまたはパスが実行されるタイミングと条件を
            // 定義します。
            Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
    
            Pass
            {
                // HLSL コードブロック。Unity SRP では HLSL 言語を使用します。
                HLSLPROGRAM
                // この行では頂点シェーダーの名前を定義します。
                #pragma vertex vert
                // この行ではフラグメントシェーダーの名前を定義します。
                #pragma fragment frag
    
                // Core.hlsl ファイルには、よく使用される HLSL マクロおよび関数の
                // 定義が含まれ、その他の HLSL ファイル (Common.hlsl、
                // SpaceTransforms.hlsl など) への #include 参照も含まれています。
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    
                // この構造体定義では構造体に含まれる変数を定義します。
                // この例では Attributes 構造体を頂点シェーダーの入力構造体として
                // 使用しています。
                struct Attributes
                {
                    // positionOS 変数にはオブジェクト空間内での頂点位置が
                    // 含まれます。
                    float4 positionOS   : POSITION;
                };
    
                struct Varyings
                {
                    // この構造体内の位置には SV_POSITION セマンティクスが必要です。
                    float4 positionHCS  : SV_POSITION;
                };
    
                // Varyings 構造体内に定義されたプロパティを含む頂点シェーダーの
                // 定義。vert 関数の型は戻り値の型 (構造体) に一致させる
                // 必要があります。
                Varyings vert(Attributes IN)
                {
                    // Varyings 構造体での出力オブジェクト (OUT) の宣言。
                    Varyings OUT;
                    // TransformObjectToHClip 関数は頂点位置をオブジェクト空間から
                    // 同種のクリップスペースに変換します。
                    OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                    // 出力を返します。
                    return OUT;
                }
    
                // フラグメントシェーダーの定義。
                half4 frag() : SV_Target
                {
                    // 色変数を定義して返します。
                    half4 customColor = half4(0.5, 0, 0, 1);
                    return customColor;
                }
                ENDHLSL
            }
        }
    }
    

    フラグメントシェーダーによってゲームオブジェクトがダークレッド (RGB 値 (0.5, 0, 0)) に塗られます。

    シェーダーによってゲームオブジェクトがダークレッドに塗られる

    以下のセクションでは、この基本的な Unity シェーダーの構造を紹介します。

    ShaderLab の基本構造

    Unity シェーダーは、ShaderLab という Unity 固有の言語で記述します。

    この例の Unity シェーダーには、以下のブロックが含まれています。

    • Shader
    • Properties
    • SubShader
    • Pass
    • HLSLPROGRAM

    Shader ブロック

    ShaderLab コードは、Shader 宣言から始まります。

    Shader "Example/URPUnlitShaderBasic"
    

    この宣言内のパスにより、マテリアルの Shader メニューにおける Unity シェーダーの表示名と場所が決まります。Shader.Find メソッドにもこのパスが使用されます。

    マテリアルの Shader メニューにおけるシェーダーの場所

    Properties ブロック

    Properties ブロックには、ユーザーがマテリアルの Inspector ウィンドウで設定できるプロパティの宣言が含まれます。

    この例の場合、この Unity シェーダーではユーザーが定義できるマテリアルのプロパティが公開されないので、Properties ブロックは空です。

    SubShader ブロック

    Unity シェーダーのソースファイルには、1 つ以上の SubShader ブロックが含まれています。メッシュのレンダリング時に、Unity によって対象デバイスの GPU と互換性のある最初の SubShader が選択されます。

    SubShader ブロックには、必要に応じて SubShader Tags ブロックを含めることができます。SubShader Tags ブロックを宣言するには、Tags キーワードを使用します。

    Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
    

    RenderPipeline という SubShader タグには、どのレンダーパイプラインでこの SubShader を使用するかを Unity に伝える役割があり、UniversalPipeline という値は、Unity が URP でこの SubShader を使用する必要があることを示しています。

    同じシェーダーを異なるレンダーパイプラインで実行するには、RenderPipeline タグ値が異なる複数の SubShader ブロックを作成します。SubShader ブロックを HDRP で実行するには、RenderPipeline タグを HDRenderPipeline に設定し、ビルトインレンダーパイプラインで実行するには、RenderPipeline を空の値に設定します。

    SubShader Tags の詳細については、ShaderLab: SubShader Tags を参照してください。

    Pass ブロック

    この例には、1 つの Pass ブロックがあり、HLSL プログラムのコードが含まれています。Pass ブロックの詳細については、ShaderLab: Pass を参照してください。

    Pass ブロックには、必要に応じて Pass Tags ブロックを含めることができます。詳細については、URP ShaderLab の Pass tags を参照してください。

    HLSLPROGRAM ブロック

    このブロックには HLSL プログラムのコードが含まれます。

    ノート: HLSL 言語は URP シェーダーの推奨言語です。

    ノート: URP は CG 言語に対応しています。CGPROGRAM/ENDCGPROGRAM ブロックをシェーダーに追加すると、Unity ではビルトインレンダーパイプラインライブラリのシェーダーが自動的に含まれます。SRP シェーダーライブラリのシェーダーを含めた場合は、SRP シェーダーのマクロや関数の一部がビルトインレンダーパイプラインシェーダーの関数と競合することがあります。CGPROGRAM ブロックのあるシェーダーは SRP Batcher との互換性がありません。

    このブロックには、Core.hlsl ファイルへの参照を使用した #include 宣言が含まれています。

    # include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    

    Core.hlsl ファイルには、よく使用される HLSL マクロおよび関数の定義が含まれ、その他の HLSL ファイル (Common.hlsl や SpaceTransforms.hlsl など) への #include 参照も含まれています。

    例えば、HLSL コード内の頂点シェーダーでは、SpaceTransforms.hlsl ファイルの TransformObjectToHClip 関数を使用します。この関数によって頂点位置がオブジェクト空間から同種の空間に変換されます。

    Varyings vert(Attributes IN)
    {
        Varyings OUT;
        OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
        return OUT;
    }
    

    この基本的な HLSL コード内のフラグメントシェーダーからは、コード内に事前定義されている単一の色が出力されます。

    half4 frag() : SV_Target
    {
        half4 customColor;
        customColor = half4(0.5, 0, 0, 1);
        return customColor;
    }
    

    色の入力を備えた URP Unlit シェーダー セクションには、マテリアルの Inspector ウィンドウで編集可能な色プロパティを追加する方法が記載されています。

    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)