Version: Unity 6.0 (6000.0)
言語 : 日本語
色の入力を備えた URP の Unlit シェーダーの記述
URP のシェーダーでの法線ベクトルの可視化

URP のシェーダーでのテクスチャの描画

この例の Unity シェーダーは、メッシュ上にテクスチャを描画します。

色の入力を備えた URP Unlit シェーダー セクションの Unity シェーダーソースファイルを使用し、ShaderLab コードに以下の変更を加えます。

  1. Properties ブロックで、既存のコードを _BaseMap プロパティの定義に置き換えます。

    Properties
    {
        [MainTexture] _BaseMap("Base Map", 2D) = "white" {}
    }
    

    Properties ブロックでテクスチャプロパティを宣言すると、Unity では _BaseMap プロパティが Base Map というラベルでマテリアルに追加され、Tiling コントロールおよび Offset コントロールが追加されます。

    テクスチャプロパティの Tiling コントロールおよび Offset コントロール
    “テクスチャプロパティの Tiling コントロールおよび Offset コントロール”

    [MainTexture] 属性のプロパティを宣言すると、Unity ではそのプロパティがマテリアルの メインテクスチャ として使用されます。

    ノート: 互換性を確保するため、_MainTex というプロパティ名はあらかじめ予約されています。Unity では、[MainTexture] 属性がなくても _MainTex という名前のプロパティが メインテクスチャ として使用されます。

  2. struct Attributesstruct Varyings で、テクスチャ上の UV 座標用に uv 変数を追加します。

    float2 uv           : TEXCOORD0;
    
  3. テクスチャを 2D テクスチャとして定義し、そのためのサンプラーを指定します。CBUFFER ブロックの前に以下の行を追加します。

    TEXTURE2D(_BaseMap);
    SAMPLER(sampler_BaseMap);
    

    TEXTURE2D マクロおよび SAMPLER マクロは Core.hlsl 内で参照されているファイルの 1 つに定義されています。

  4. タイリングとオフセットを機能させるには、テクスチャプロパティを _ST サフィックスとともに ‘CBUFFER’ ブロック内で宣言する必要があります。_ST サフィックスが必要なのは、一部のマクロ (TRANSFORM_TEX など) で使用されるからです。

    ノート: Unity シェーダーと SRP Batcher の互換性を確保するため、マテリアルのすべてのプロパティを単一の CBUFFER ブロック内で UnityPerMaterial という名前で宣言します。SRP Batcher について詳しくは、SRP (スクリプタブルレンダーパイプライン) Batcher のドキュメントを参照してください。

    CBUFFER_START(UnityPerMaterial)
        float4 _BaseMap_ST;
    CBUFFER_END
    
  5. タイリングとオフセットの変換を適用するには、以下の行を頂点シェーダーに追加します。

    OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
    

    TRANSFORM_TEX マクロは Macros.hlsl ファイル内に定義されています。#include 宣言には、そのファイルへの参照が含まれます。

  6. フラグメントシェーダーで、SAMPLE_TEXTURE2D マクロを使用してテクスチャをサンプリングします。

    half4 frag(Varyings IN) : SV_Target
    {
        half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
        return color;
    }
    

これで、Inspector ウィンドウの Base Map フィールドでテクスチャを選択できるようになりました。選択したテクスチャがシェーダーによってメッシュ上に描画されます。

マテリアルの Base Map テクスチャ
マテリアルの Base Map テクスチャ

以下は、この例の完成した ShaderLab コードです。

// This shader draws a texture on the mesh.
Shader "Example/URPUnlitShaderTexture"
{
    // The _BaseMap variable is visible in the Material's Inspector, as a field
    // called Base Map.
    Properties
    {
        [MainTexture] _BaseMap("Base Map", 2D) = "white" {}
    }

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

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

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

            struct Attributes
            {
                float4 positionOS   : POSITION;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            // This macro declares _BaseMap as a Texture2D object.
            TEXTURE2D(_BaseMap);
            // This macro declares the sampler for the _BaseMap texture.
            SAMPLER(sampler_BaseMap);

            CBUFFER_START(UnityPerMaterial)
                // The following line declares the _BaseMap_ST variable, so that you
                // can use the _BaseMap variable in the fragment shader. The _ST
                // suffix is necessary for the tiling and offset function to work.
                float4 _BaseMap_ST;
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // The TRANSFORM_TEX macro performs the tiling and offset
                // transformation.
                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // The SAMPLE_TEXTURE2D marco samples the texture with the given
                // sampler.
                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
                return color;
            }
            ENDHLSL
        }
    }
}

法線ベクトルの可視化 セクションには、メッシュ上に法線ベクトルを可視化する方法が記載されています。

色の入力を備えた URP の Unlit シェーダーの記述
URP のシェーダーでの法線ベクトルの可視化