Version: 2019.4
ShaderLab:子着色器 LOD 值
使用 Visual Studio 来调试 DirectX 11/12 着色器

在着色器中使用纹理数组

类似于常规 2D 纹理(Texture2D 类,着色器中的 sampler2D__)、立方体贴图(Cubemap 类,着色器中的 samplerCUBE__)和 3D 纹理(Texture3D 类,着色器中的 __sampler3D__),Unity 也支持 2D 纹理数组

由于纹理数组并非适用于所有平台,因此着色器需要使用适当的编译目标或功能要求来访问纹理数组。支持纹理数组的最低着色器模型编译目标为 3.5,功能名称为 2darray

使用以下可声明和采样纹理数组:

  • UNITY_DECLARE_TEX2DARRAY(name) 在 HLSL 代码中声明纹理数组采样器变量。
  • UNITY_SAMPLE_TEX2DARRAY(name,uv) 使用 float3 UV 采样纹理数组;坐标的 z 分量是数组元素索引。
  • UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) 使用显式 Mipmap 级别采样纹理数组。

示例

以下着色器示例通过使用对象空间顶点位置作为坐标来采样纹理数组:

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 页面已修订
  • 在 Unity 2018.1 中添加了着色器 #pragma 指令
ShaderLab:子着色器 LOD 值
使用 Visual Studio 来调试 DirectX 11/12 着色器