我对计算着色器不太有经验,但现在为了性能我必须编写一些。我的计算着色器中有一个简单的内核方法,它只是将
struct
的缓冲区重新解释为几个缓冲区,以便与 Unity 网格一起使用(我知道 triData_out
毫无意义,它是早期开发中的遗留物)我想在删除它之前解决这个问题):
#define THREADS_X 64
#define THREADS_Y 1
#define THREADS_Z 1
[numthreads(THREADS_X, THREADS_Y, THREADS_Z)]
void MMMesh(uint3 id : SV_DispatchThreadID)
{
int index = id.x + (id.y * THREADS_X) + (id.z * THREADS_Y * THREADS_X);
if (index >= allTrisCount)
return;
int destIndex = index * 3;
MMTriangle srcTri = triData_in[index];
vertData[destIndex] = srcTri.vertA.pos;
vertData[destIndex + 1] = srcTri.vertB.pos;
vertData[destIndex + 2] = srcTri.vertC.pos;
uvData[destIndex] = srcTri.vertA.uv;
uvData[destIndex + 1] = srcTri.vertB.uv;
uvData[destIndex + 2] = srcTri.vertC.uv;
triData_out[destIndex] = destIndex;
triData_out[destIndex + 1] = destIndex + 1;
triData_out[destIndex + 2] = destIndex + 2;
}
当我的
.Dispatch()
调用看起来像 .Dispatch(allTrisCount,1,1)
时,此方法效果很好,但是一旦 destIndex >= 65535
突然,Unity 网格开始损坏,tris 到处都是(不确定这是否与之前的一致)尺寸 .Dispatch()
尺寸大小限制也为 65535
但尺寸本身只能在 65535/3
调用(其中 .Dispatch()
)上达到最小值 destIndex >= 65535
。
在将其编写为计算着色器之前,我从未遇到过此问题,因为这曾经是多线程 Unity Jobs 代码,因此我可以将问题隔离到此内核方法。有什么问题吗?