次のように、グループの Id を使用して Texture2DArray からデータを取得する計算シェーダーがあるとします。
Texture2DArray<float4> gTextureArray[2];
[numthreads(32, 1, 1)]
void Kernel(uint3 GroupID : SV_GroupID, uint3 GroupThreadID : SV_GroupThreadID)
{
float3 tmp = gTextureArray[GroupID.x].Load(int4(GroupThreadID.x,GroupThreadID.x,0,0)).rgb;
....
}
そして、このように起動するとしましょうdeviceContext->Dispatch(2, 0, 0);
つまり、Texture2DArray からピクセル値を読み取る 2 つのグループ、それぞれ 32 のスレッドです。GroupID.x = 0 のすべてのスレッドは gTextureArray[0] から値を読み取り、GroupID.y = 0 のすべてのスレッドは gTextureArray[1] から値を読み取ります。その単純なコードをコンパイルできないことがわかりました。代わりに、このコンパイルエラーが発生しますerror X3512: sampler array index must be a literal expression
今、私は代わりにこれを行うことができることを知っています:
Texture2DArray<float4> gTextureArray[2];
[numthreads(32, 1, 1)]
void Kernel(uint3 GroupID : SV_GroupID, uint3 GroupThreadID : SV_GroupThreadID)
{
float3 tmp = float3(0,0,0);
if(GroupID.x == 0)
tmp = gTextureArray[0].Load(int4(GroupThreadID.x,GroupThreadID.x,0,0)).rgb;
else if(GroupID.x == 1)
tmp = gTextureArray[1].Load(int4(GroupThreadID.x,GroupThreadID.x,0,0)).rgb;
....
}
または、グループがたくさんある場合はスイッチを使用して、それほどひどく見えないようにします(それでもそうです)
各グループのすべてのスレッドがいずれかのブランチに移動するため、ワープの発散がないことに注意してください。私の質問は、ここで何か不足していますか? 少なくともこの場合、発散やその他の問題が見られないのに、HLSL がそのようなインデックス作成をサポートしていないのはなぜですか?