代码之家  ›  专栏  ›  技术社区  ›  Spring E. Thing

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

  •  -1
  • Spring E. Thing  · 技术社区  · 2 年前

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

    1 回复  |  直到 2 年前
        1
  •  1
  •   derHugo    2 年前

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

    这可能是你的 Mesh.indexFormat =>默认情况下,Unity中的网格被限制为65536(=>最大索引65535)个顶点。

    索引缓冲区可以是16位(支持网格中最多65536个顶点),也可以是32位(支持最多40亿个顶点)。默认索引格式是16位,因为这样占用的内存和带宽更少。

    请注意,并非所有平台都保证GPU支持32位索引;例如具有Mali-400 GPU的Android设备不支持它们。当在这样的平台上使用32位索引时,将记录一条警告消息,并且不会渲染网格。

    推荐文章