细分四边形上的金属镶嵌

Metal Tessellation on subdivided quad

我是曲面细分的新手,对 Metal 比较陌生 API,一直在参考这个示例代码 https://developer.apple.com/library/archive/samplecode/MetalBasicTessellation/Introduction/Intro.html

我意识到 iOS 上的最大曲面细分因子是 16,与 OSX 上的 64 相比,这对于我的用例来说非常低。 我想我需要在一个四边形上应用镶嵌细分,该四边形首先被细分为 4 x 4 个较小的部分,以便在镶嵌之后它最终会变成镶嵌因子为 64 的东西?

所以,我已经将输入控制点更改为这样的东西

static const float controlPointPositionsQuad[] = {
    -0.8,  0.8, 0.0, 1.0,   // upper-left
     0.0,  0.8, 0.0, 1.0,   // upper-mid
     0.0,  0.0, 0.0, 1.0,   // mid-mid
    -0.8,  0.0, 0.0, 1.0,   // mid-left

    -0.8,  0.0, 0.0, 1.0,   // mid-left
     0.0,  0.0, 0.0, 1.0,   // mid-mid
     0.0, -0.8, 0.0, 1.0,   // lower-mid
    -0.8, -0.8, 0.0, 1.0,   // lower-left

     0.0,  0.8, 0.0, 1.0,   // upper-mid
     0.8,  0.8, 0.0, 1.0,   // upper-right
     0.8,  0.0, 0.0, 1.0,   // mid-right
     0.0,  0.0, 0.0, 1.0,   // mid-mid

     0.0,  0.0, 0.0, 1.0,   // mid-mid
     0.8,  0.0, 0.0, 1.0,   // mid-right
     0.8, -0.8, 0.0, 1.0,   // lower-right
     0.0, -0.8, 0.0, 1.0,   // lower-mid
};

对于 drawPatches,我将其更改为 16 而不是 4。 但结果是它只显示前 4 个点(左上角)。 如果我将顶点布局步幅更改为此:

vertexDescriptor.layouts[0].stride = 16*sizeof(float);

它仍然显示相同。

我真的不知道我在做什么,但我要做的类似于镶嵌 3d 网格,但对我来说只是一个带有细分的四边形。 我无法找到任何使用 Metal API 教授此内容的教程/代码示例。

有人能给我指出正确的方向吗?谢谢!

以下是一些需要检查的事项:

  1. 确保您的细分因子计算内核通过调度适当大小的计算网格为所有补丁生成 inside/edge 因子。
  2. 当调度线程组来执行你的细分因子内核时,使用一维线程组计数和大小(这样总线程数就是补丁的数量,并且传递给调度方法的两个大小的高度都是 1)。
  3. 绘制面片时,第一个参数(numberOfPatchControlPoints)应等于每个面片中的控制点数(三角形为3个;四边形为4个),第三个参数为要绘制的面片数画.