【Unity】【URP】Texture2DArrayをシェーダでサンプリングする

UnityのURPで、Texture2DArrayをサンプリングするシェーダを作る方法についてまとめました。

Unity2021.1.11f1
Universal RP 11.0.0 (シェーダはURP用のものとなります)

はじめに

Texture2DArrayは同じサイズとフォーマットのテクスチャを一つにまとめたアセットです。
シェーダではインデックスを指定してサンプリングできます。

docs.unity3d.com

この記事ではこのTexture2DArrayをURP用のシェーダでサンプリングする方法をまとめます。

Texture2DArrayを作る

まずTexture2DArrayを作ります。
Unity2020.2からはインポート設定から作れるようになりました。
この辺りは以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

サンプリングするシェーダを書く

次にこれをサンプリングするシェーダを記述します。

Shader "Texture2DArrayExample"
{
    Properties
    {
        _TexArray ("Texture Array", 2DArray) = "" {}
        _TexArrayIndex ("Texture Array Index", float) = 0.0
    }

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

        Pass
        {
            Tags
            {
                "LightMode" = "UniversalForward"
            }

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma require 2darray

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

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            TEXTURE2D_ARRAY(_TexArray);
            SAMPLER(sampler_TexArray);
            float4 _TexArray_ST;
            float _TexArrayIndex;

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                OUT.uv.xy = TRANSFORM_TEX(IN.uv, _TexArray);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                return SAMPLE_TEXTURE2D_ARRAY(_TexArray, sampler_TexArray, IN.uv.xy, _TexArrayIndex);
            }
            ENDHLSL
        }
    }
}

Texture2DArray用の各種マクロが用意されているのでそれを使用しています。
URPに対応したシェーダの基本的な書き方については以下の記事を参照してください。

light11.hatenadiary.com

結果

今回は以下のテクスチャをTexture2DArrayにして上記のシェーダにセットしました。

f:id:halya_11:20210816201155p:plain
元のテクスチャ

_TexArrayIndexを動かした結果は以下の通りです。

f:id:halya_11:20210816201127g:plain
結果

正常にTexture2DArrayからサンプリングできていることを確認できました。

関連

light11.hatenadiary.com

参考

docs.unity3d.com

docs.unity3d.com