ドキュメント

Unity Engine

Unity Engine

シェーダーで 2D テクスチャ配列をサンプリングする

Sample a 2D texture array in ShaderLab and High-level Shader Language (HLSL).
読み終わるまでの所要時間 4 分最終更新 1ヶ月前

カスタムシェーダーでテクスチャ配列をサンプリングするには、以下の手順に従います。
  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. テクスチャ配列のスライスのミップマップレベルをサンプリングするには、
    UNITY_SAMPLE_TEX2DARRAY_LOD
    メソッドを使用します。以下の例は、ミップマップレベル 0 でのテクスチャ配列のスライス 1 のサンプリングです。
    half4 frag (v2f i) : SV_Target { float4 color = UNITY_SAMPLE_TEX2DARRAY_LOD(_MainTex, float3(0, 0, 1), 0);}

2D テクスチャ配列をサポートするプラットフォームをターゲットにする

テクスチャ配列をサポートするプラットフォームのみでカスタムシェーダーをターゲットにするには、以下のいずれかを使用します。
  • シェーダーモデル 3.5 以降をターゲットにするには
    #pragma target 3.5
    。
  • テクスチャ配列をサポートする GPU をターゲットにするには
    #pragma require 2darray
    。

例

以下のサンプルシェーダーは、オブジェクト空間の頂点位置を座標として使用してテクスチャ配列をサンプリングし、テクスチャ配列をサポートする 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 } }}

追加リソース