Образец массива текстуры 2D в шейдере
Чтобы взять образец массива текстур в пользовательском шейдере, выполните следующие действия:
-
Чтобы создать свойство материала массива текстур, добавьте объявление свойства материала
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); }
Целевые платформы, поддерживающие массивы текстур 2D
Чтобы нацелить настраиваемые шейдеры только на платформы, поддерживающие массивы текстур, используйте одно из следующих действий:
#pragma target 3.5для моделей шейдеров 3.5 и выше.#pragma require 2darrayдля целевых GPUs, которые поддерживают массивы текстур.
Пример
Следующий пример шейдера семплирует массив текстуры, используя позиции вершин объектного пространства в качестве координат, и работает только на GPUs, которые поддерживают массивы текстуры.
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
{
HLSLPROGRAM
#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);
}
ENDHLSL
}
}
}