使用Compute Shader生成共享顶点平面网格时三角形错乱问题排查
错误点及修复方案
1. 三角形索引ID计算逻辑错误
这是最核心的问题。你当前的trID计算逻辑完全不符合网格四边形的线性排布规则,导致所有三角形的写入位置错乱,正确的计算方式应该是直接通过当前四边形的网格坐标计算偏移:
你每个quad对应6个三角形顶点数据,当前线程对应的quad坐标是(id.x - 1, id.y - 1)(因为跳过了第一行第一列),高度方向的四边形总数是yColumnHeight - 1,所以正确的trID计算为:
int quadX = id.x - 1; int quadY = id.y - 1; int quadCountY = yColumnHeight - 1; int trID = (quadX * quadCountY + quadY) * 6;
替换你原来那三行subtractFirstYColumn相关的计算即可。
2. Compute Shader调度参数没有向上取整
你当前用的是整数除法计算Dispatch的线程组数量,如果你的顶点数不是线程组大小(8)的整数倍,边缘的顶点/四边形会完全没有被计算,导致网格残缺,修复方法是改用向上取整:
// 原来的写法 // Mathf.Max(1, (widthInVertices) / (int)threadsx) // 修改为 Mathf.Max(1, Mathf.CeilToInt(widthInVertices / (float)threadsx))
高度方向的调度参数同理修改。
3. 三角形绕序可能存在问题
你当前第二个三角形的顶点顺序是d -> a -> c,如果你的渲染管线开启了背面剔除,这个顺序很可能和你需要的正面绕序相反,导致部分面不可见,可以尝试修改第二个三角形的顶点顺序为:
triangleBuffer[trID + 3] = vertexBuffer[tri_d]; triangleBuffer[trID + 4] = vertexBuffer[tri_c]; triangleBuffer[trID + 5] = vertexBuffer[tri_a];
额外优化建议
你现在的triangleBuffer直接存储顶点数据,完全没有实现你预期的顶点复用效果,相当于生成的网格还是每个三角形独占3个顶点,浪费了大量显存和带宽。建议把triangleBuffer改成存储uint类型的顶点索引,最终Mesh的顶点数组直接用你生成的vertexBuffer,索引数组用triangleBuffer,才能真正实现边缘顶点复用的效果。
内容的提问来源于stack exchange,提问作者averagescripter
相关产品推荐
相关产品推荐

