Version: 2020.1
ShaderLab: SubShader LOD value
Visual Studio を使った DirectX 11/12 シェーダーのデバッグ

Using texture arrays in shaders

Similar to regular 2D textures (Texture2D class, sampler2D in shaders), cube maps (Cubemap class, samplerCUBE in shaders), and 3D textures (Texture3D class, sampler3D in shaders), Unity also supports 2D texture arrays.

テクスチャ配列はすべてのプラットフォームで動作するわけではないので、テクスチャ配列にアクセスするために、シェーダーは適切な コンパイルターゲット や機能要件を必要とします。テクスチャ配列をサポートする最小のシェーダーモデルのコンパイルターゲットは 3.5 で、機能名は 2darray です。

テクスチャ配列を宣言してサンプリングするには、以下の マクロ を使用します。

  • UNITY_DECLARE_TEX2DARRAY(name) は HLSL コード内のテクスチャ配列サンプラー変数を宣言します。
  • UNITY_SAMPLE_TEX2DARRAY(name,uv) は float3 UV のテクスチャ配列をサンプリングします。座標の z 成分は配列要素です。
  • UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) はミップマップレベルのテクスチャ配列をサンプリングします。

参考例

以下のシェーダーの例は、オブジェクトの空間の頂点位置を使用してテクスチャ配列をサンプリングしています。

Shader "Example/Sample2DArrayTexture"
{
    Properties
    {
        _MyArr ("Tex", 2DArray) = "" {}
        _SliceRange ("Slices", Range(0,16)) = 6
        _UVScale ("UVScale", Float) = 1.0
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // テクスチャ配列はどこででも使用可能なわけではありません
            // テクスチャ配列の位置するプラットフォームのコンパイルシェーダーのみです
            #pragma require 2darray
            
            #include "UnityCG.cginc"

            struct v2f
            {
                float3 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            float _SliceRange;
            float _UVScale;

            v2f vert (float4 vertex : POSITION)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, vertex);
                o.uv.xy = (vertex.xy + 0.5) * _UVScale;
                o.uv.z = (vertex.z + 0.5) * _SliceRange;
                return o;
            }
            
            UNITY_DECLARE_TEX2DARRAY(_MyArr);

            half4 frag (v2f i) : SV_Target
            {
                return UNITY_SAMPLE_TEX2DARRAY(_MyArr, i.uv);
            }
            ENDCG
        }
    }
}

関連項目


  • 2018–03–20 Page amended
  • シェーダー #pragma ディレクティブは Unity 2018.1 で追加
ShaderLab: SubShader LOD value
Visual Studio を使った DirectX 11/12 シェーダーのデバッグ