我对计算着色器不是很有经验,但现在为了性能,我不得不写一些。我在计算着色器中有一个简单的内核方法,它只是重新解释的缓冲区
struct
s分为几个缓冲区,用于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代码,所以我可以将问题隔离到这个内核方法。怎么了?