【发布时间】:2014-04-24 20:37:19
【问题描述】:
假设我有一个计算着色器,它使用组的 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);
因此,2 组,32 个线程,每组从 Texture2DArray 读取像素值。 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 不支持这种索引,因为我看不到任何分歧或其他问题,至少在这种情况下是这样?
【问题讨论】:
标签: hlsl directx-11 compute-shader directcompute