■ はじめに
聞いていた話ではテクスチャ配列の利便性っていうものは、
複数のテクスチャを1つの変数(名)で扱えて便利だよって感じでした。
また大抵の場合、使用されるテクスチャの集合(セット)はユニークであるし、
そういった場合にはそれら集合をまとめて変更できるから良いって話でした。
* 例
あるモデルに付いているテクスチャは複数の種類存在します。
- ディフューズマップ
- スペキュラマップ
- ノーマルマップ
だけどもモデルのデータにおいて、その中身はすべて異なるわけです。
よってそのテクスチャ配列を1つ交換するだけで、上記の例だと3つのテクスチャが交換でき、便利。
という話を聞いていたわけです。
■ 疑問点はどこか
テクスチャ配列は1つの変数名となっています。
これのインデックス値を変えることで、参照先テクスチャを変えてサンプリングしてくるわけです。
しかし、サンプリングしてくるのにサンプラーユニットは共通しているわけで、
そうなると、サンプラーのほうに負担がかかってしまうのではないかと思ったのです。
よって、サンプラーがボトルネックになってしまい、
この機能のうまみはないのでは?と疑問に思いました。
■ DirectX10でのアクセス方法
DirectX10ではシェーダーファイル内で次のようにして、
指定された配列番号のテクスチャを参照することができます。
Texture2DArray gTexArray; SamplerState gSamp; float2 texUV; // 従来のUV値が格納されるつもり float index; // テクスチャ配列内のアクセスしたい序数 float3 loc = float3( texUV.x, texUV.y,index ); float4 color = gTexArray.Sample( gSamp, loc ); // テクスチャから読み出す
※ 今までにテクスチャ配列から値を読み出すコードって見たことがないので、書いてみました。
配列内での序数は、UV値設定の最後の要素に入れる、というのさえ分かってしまえば、
他何も難しいことはなさそうです。
■ まとめ
このコード例を書いていて、気付いてしまいました。
そう、DirectX10以降ではサンプラーはテクスチャと別に設定できるようになったのでした。
だから、テクスチャ配列内序数ごとに使用するサンプラーを切り替えてあげれば、
危惧していた問題点も無くなるというわけです。
このように、サンプラーの設定は N個必要だけど、
テクスチャについては、テクスチャ配列を用いるようにした場合1つの切り替えだけで済むということになりそうです。
* 補足
とりあえずテクスチャ配列のサンプルを作成中です。
サンプラー使い回しの例で、軽くやってみる予定です。