要在自定义的 着色器在 GPU 上运行的程序。 更多信息
请参阅 术语表 中采样纹理数组,请按照以下步骤操作
要创建纹理数组材质属性,请添加 2DArray
材质属性声明。例如
Properties
{
_MainTex ("Texture array", 2DArray) = "" {}
}
要将纹理数组设置为着色器输入,请添加 UNITY_DECLARE_TEX2DARRAY
宏。例如
UNITY_DECLARE_TEX2DARRAY(_MainTex);
要采样纹理数组的切片,请使用 UNITY_SAMPLE_TEX2DARRAY
方法。例如,要采样纹理数组的切片 1
half4 frag (v2f i) : SV_Target {
float4 color = UNITY_SAMPLE_TEX2DARRAY(_MainTex, float3(0, 0, 1));
}
要采样纹理数组切片的 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);
}
要将自定义着色器仅定位到支持纹理数组的平台,请使用以下任一方法
#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
}
}
}