Unity计算着色器生成无法计算所有三角形索引的网格数据

Unity compute shader to generate mesh data failing to calculate all triangle indexes

我最近一直在为由 Unity3d 中的 6 个细分平面构成的球形行星生成网格数据 (like this)。我在 C# 中创建了一个算法,让我可以在 CPU 上制作网格,出于学习目的,我决定使用计算着色器将该算法移植到 GPU。虽然看起来好像所有的顶点和法线都得到了正确的计算,但填充的三角形数组最终是半空的,从而产生了不希望出现的混乱的网格。

由于我将地球上的每个平面都视为顶点的二维网格(即使它们被扭曲成球体),我通过遍历宽度和高度来计算 CPU 上的三角形,获取由当前顶点及其后面和上面的 3 个顶点(左上角、右上角、左下角、当前顶点)创建的四边形,并将适当的顶点索引分配给三角形数组。在 GPU 上,我几乎逐行复制我的代码,因为语法非常相似,但它似乎在某个点后停止计算三角形。

为了测试这是否是三角形或顶点的错误,我用 C# 算法计算的三角形顶点索引覆盖了 GPU 计算的三角形顶点索引。这给了我想要的形状,表明它确实只是我的三角形的问题。

CPU 上生成的网格数据正确如下所示: Correct CPU implementation

GPU 错误生成的网格如下所示: Incorrect GPU implementation

CPU计算的三角形数组和GPU计算的三角形数组之间的区别可以在这张图中看到,GPU在左边,CPU在右边: Triangle array difference

我相信我的问题很可能是误解了计算着色器实际上是如何执行它们的线程计算/索引的,但可能是我的实现有问题。任何帮助理解为什么我的计算着色器实现失败的帮助都会真正帮助我。我在 GitHub 上包含了指向我的源代码的链接,而不是将代码片段放在这里,因为它们可能很难脱离上下文来理解。

CPU实现源码:Source

GPU 着色器调度程序源代码:Source

GPU 计算着色器源代码:Source

您刚刚在此处犯了一个简单的 copy/paste 缓冲区计数错误:

ComputeBuffer vb = new ComputeBuffer (v.Length, 3 * sizeof(float)); //3 floats * 4 bytes / float
ComputeBuffer nb = new ComputeBuffer (n.Length, 3 * sizeof(float));
ComputeBuffer ub = new ComputeBuffer (n.Length, 2 * sizeof(float));
ComputeBuffer tb = new ComputeBuffer (n.Length, sizeof(int));

改成这样应该没问题:

ComputeBuffer vb = new ComputeBuffer (v.Length, 3 * sizeof(float)); //3 floats * 4 bytes / float
ComputeBuffer nb = new ComputeBuffer (n.Length, 3 * sizeof(float));
ComputeBuffer ub = new ComputeBuffer (u.Length, 2 * sizeof(float));
ComputeBuffer tb = new ComputeBuffer (t.Length, sizeof(int));