UnityのURPで、Texture2DArrayをサンプリングするシェーダを作る方法についてまとめました。
Unity2021.1.11f1
Universal RP 11.0.0 (シェーダはURP用のものとなります)
はじめに
Texture2DArrayは同じサイズとフォーマットのテクスチャを一つにまとめたアセットです。
シェーダではインデックスを指定してサンプリングできます。
この記事ではこのTexture2DArrayをURP用のシェーダでサンプリングする方法をまとめます。
Texture2DArrayを作る
まずTexture2DArrayを作ります。
Unity2020.2からはインポート設定から作れるようになりました。
この辺りは以下の記事にまとめていますので、必要に応じて参照してください。
サンプリングするシェーダを書く
次にこれをサンプリングするシェーダを記述します。
Shader "Texture2DArrayExample" { Properties { _TexArray ("Texture Array", 2DArray) = "" {} _TexArrayIndex ("Texture Array Index", float) = 0.0 } SubShader { Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "IgnoreProjector" = "True" } Pass { Tags { "LightMode" = "UniversalForward" } HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma require 2darray #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; }; struct Varyings { float4 positionHCS : SV_POSITION; float2 uv : TEXCOORD0; }; TEXTURE2D_ARRAY(_TexArray); SAMPLER(sampler_TexArray); float4 _TexArray_ST; float _TexArrayIndex; Varyings vert(Attributes IN) { Varyings OUT; OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz); OUT.uv.xy = TRANSFORM_TEX(IN.uv, _TexArray); return OUT; } half4 frag(Varyings IN) : SV_Target { return SAMPLE_TEXTURE2D_ARRAY(_TexArray, sampler_TexArray, IN.uv.xy, _TexArrayIndex); } ENDHLSL } } }
Texture2DArray用の各種マクロが用意されているのでそれを使用しています。
URPに対応したシェーダの基本的な書き方については以下の記事を参照してください。
結果
今回は以下のテクスチャをTexture2DArrayにして上記のシェーダにセットしました。
_TexArrayIndexを動かした結果は以下の通りです。
正常にTexture2DArrayからサンプリングできていることを確認できました。