텍스처 배열은 GPU에 단일 오브젝트처럼 보이는 같은 크기/형식/플래그 2D 텍스처의 컬렉션이며 텍스처 요소 인덱스를 사용하여 셰이더에서 샘플링할 수 있습니다. 텍스처 배열은 커스텀 터레인 렌더링 시스템 또는 기타 크기와 형식이 같은 많은 텍스트처에 효율적으로 액세스하는 방법이 필요한 특수 이펙트를 구현하는 데 유용합니다. 2D 텍스처 배열의 요소는 슬라이스 또는 레이어라고도 합니다.
텍스처 배열은 기본 그래픽스 API 및 GPU의 지원을 받아야 하며, 다음에서 사용할 수 있습니다.
다른 플랫폼(OpenGL ES 2.0 or WebGL 1.0)은 텍스처 배열을 지원하지 않습니다. 런타임 시점에 텍스처 배열 지원 여부를 확인하려면 SystemInfo.supports2DArrayTextures를 사용해야 합니다.
셀로 분할된 소스 텍스처 파일에서 텍스처 배열을 임포트할 수 있습니다. 이를 플립북 텍스처라고 합니다. 이렇게 하려면 다음 단계를 따르십시오.
1.소스 텍스처를 Unity 프로젝트로 임포트합니다. 2. 프로젝트 뷰에서 결과 텍스처 에셋을 선택합니다. 그러면 인스펙터에 텍스처 임포트 설정이 표시됩니다. 3. 인스펙터에서 Texture Shape를 2D Array로 설정합니다. 그러면 Columns 및 Rows 프로퍼티가 표시됩니다. 4. Columns 및 Rows를 플립북 텍스처에 적합한 값으로 설정합니다. 5. Apply를 클릭합니다.
자세한 내용은 텍스처 임포트 설정을 참조하십시오.
C# 스크립트에서 텍스처 배열을 생성하려면 Texture2DArray 클래스를 사용하여 텍스처를 초기화하고 픽셀 데이터를 설정하고, AssetDatabase.CreateAsset을 사용하여 오브젝트를 에셋 파일로 저장하십시오.
일반적으로 텍스처 배열은 GPU 메모리 내에서만 사용되지만 Graphics.CopyTexture, Texture2DArray.GetPixels 및 Texture2DArray.SetPixels를 사용하여 시스템 메모리와의 사이에 픽셀을 이동할 수 있습니다.
텍스처 배열 요소는 렌더 타겟으로 사용할 수도 있습니다. 렌더 타겟이 2D 텍스처 배열이 될지 여부를 미리 지정하려면 RenderTexture.dimension을 사용해야 합니다. Graphics.SetRenderTarget의 depthSlice 인수는 렌더링할 밉맵 레벨 또는 큐브 맵 면을 지정합니다. “레이어드 렌더링”(즉 지오메트리 셰이더)을 지원하는 플랫폼에서 depthSlice 인수를 –1로 설정하여 전체 텍스처 배열을 렌더 타겟으로 설정할 수 있습니다. 지오메트리 셰이더를 사용하여 개별 요소로 렌더링할 수도 있습니다.
텍스처 배열은 모든 플랫폼에서 작동하지는 않으므로 셰이더에서 텍스처 배열에 액세스하려면 적절한 컴파일 타겟(compilation target) 또는 기능 요구 사항을 사용해야 합니다. 텍스처 배열을 지원하는 최소 셰이더 모델 컴파일 타겟은 3.5
이고 기능 이름은 2darray
입니다.
텍스처 배열을 선언하고 샘플링하려면 다음 매크로를 사용해야 합니다.
다음 셰이더 예제에서는 오브젝트 공간 버텍스 포지션을 좌표로 사용하여 텍스처 배열을 샘플링합니다.
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
// texture arrays are not available everywhere,
// only compile shader on platforms where they are
#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
}
}
}