计算着色器 - 整数 >= 65535 问题?

问题描述 投票:0回答:1

我对计算着色器不太有经验,但现在为了性能我必须编写一些。我的计算着色器中有一个简单的内核方法,它只是将

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 代码,因此我可以将问题隔离到此内核方法。有什么问题吗?

c# unity-game-engine buffer mesh compute-shader
1个回答
0
投票

不确定是否与着色器代码有关。

这可能是你的

Mesh.indexFormat
=> 默认情况下单位网格仅限于 65535 个三角形

© www.soinside.com 2019 - 2024. All rights reserved.