我对计算着色器不太有经验,但现在为了性能我必须编写一些。我的计算着色器中有一个简单的内核方法,它只是将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 代码,因此我可以将问题隔离到此内核方法。有什么问题?
不确定是否与着色器代码有关。
它可能是您的
Mesh.indexFormat
=> 默认情况下,Unity 中的网格仅限于 65536 个(=> 最大索引 65535)个顶点。