ios - 分割四边形上的 Metal 镶嵌

标签 ios metal tessellation

我对曲面分割完全陌生,对 Metal API 也比较陌生,一直在引用这个示例代码 https://developer.apple.com/library/archive/samplecode/MetalBasicTessellation/Introduction/Intro.html

我意识到 iOS 上的最大曲面分割因子是 16,与 OSX 上的 64 相比,这对于我的用例来说非常低。 我想我需要在一个四边形上应用镶嵌分割,该四边形首先被分割为 4 乘以 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. 通过分派(dispatch)适当大小的计算网格,确保您的镶嵌因子计算内核为所有补丁生成内部/边缘因子。
  2. 当分派(dispatch)线程组来执行您的分割因子内核时,使用一维线程组计数和大小(这样总线程数就是补丁的数量,并且传递给分派(dispatch)方法的两个大小的高度都是 1)。
  3. 绘制面片时,第一个参数 (numberOfPatchControlPoints) 应等于每个面片中控制点的数量(三角形为 3;四边形为 4),第三个参数应为面片数量画画。

关于ios - 分割四边形上的 Metal 镶嵌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59476610/

相关文章:

ios - 如何从库及其地址列表中进行符号化?

ios - 由于信号 : Segmentation fault: 11 occurred with Eureka 1. 5.0,命令失败

ios - 将数据加载到 Metal 中的 3D 纹理中

python - 如何对这个形状进行分割?

c++ - 为什么 Tessellation control shader 被多次调用?

ios - 当用户快速显示屏幕键盘时,如何向上移动我的容器?

ios - swift 3 : Instance Member cannot be used on type “View Controller”

ios - Swift 数组访问器比原生数组慢 5 倍——哪些是推荐的?

ios - Metal 着色器文件中除顶点|片段|内核之外的函数的 Synax

c++ - GLSL 中曲面 segmentation 着色器的链接错误