版本:Unity 6 (6000.0)
语言:英语
渲染到 2D 纹理数组
立方体贴图

在着色器中采样 2D 纹理数组

要在自定义的 着色器在 GPU 上运行的程序。 更多信息
请参阅 术语表
中采样纹理数组,请按照以下步骤操作

  1. 要创建纹理数组材质属性,请添加 2DArray 材质属性声明。例如

    Properties
    {
        _MainTex ("Texture array", 2DArray) = "" {}
    }
    
  2. 要将纹理数组设置为着色器输入,请添加 UNITY_DECLARE_TEX2DARRAY 宏。例如

    UNITY_DECLARE_TEX2DARRAY(_MainTex);
    
  3. 要采样纹理数组的切片,请使用 UNITY_SAMPLE_TEX2DARRAY 方法。例如,要采样纹理数组的切片 1

    half4 frag (v2f i) : SV_Target {
        float4 color = UNITY_SAMPLE_TEX2DARRAY(_MainTex, float3(0, 0, 1));
    }
    
  4. 要采样纹理数组切片的 mipmap 级别,请使用 UNITY_SAMPLE_TEX2DARRAY_LOD 方法。例如,要采样纹理数组的切片 1 处的 mipmap 级别 0

    half4 frag (v2f i) : SV_Target {
        float4 color = UNITY_SAMPLE_TEX2DARRAY_LOD(_MainTex, float3(0, 0, 1), 0);
    }
    

支持 2D 纹理数组的目标平台

要将自定义着色器仅定位到支持纹理数组的平台,请使用以下任一方法

  • #pragma target 3.5 用于定位着色器模型 3.5 及更高版本。
  • #pragma require 2darray 用于定位支持纹理数组的 GPU。

示例

以下着色器示例使用对象空间顶点位置作为坐标采样纹理数组,并且仅在支持纹理数组的 GPU 上运行。

Shader "Example/Sample2DArrayTexture"
{
    Properties
    {
        // Create material properties for the 2D texture array and the slices to sample 
        _MyArr ("Tex", 2DArray) = "" {}
        _SliceRange ("Slices", Range(0,16)) = 6

        _UVScale ("UVScale", Float) = 1.0
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            // Compile the shader only on platforms that support texture arrays
            #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;

                // Set the z coordinate to the slice indices
                o.uv.z = (vertex.z + 0.5) * _SliceRange;

                return o;
            }
            
            // Set the texture array as a shader input
            UNITY_DECLARE_TEX2DARRAY(_MyArr);

            half4 frag (v2f i) : SV_Target
            {
                // Sample the texture array
                return UNITY_SAMPLE_TEX2DARRAY(_MyArr, i.uv);
            }

            ENDCG
        }
    }
}

其他资源

渲染到 2D 纹理数组
立方体贴图