为什么MDLMesh具有未命名的默认属性?

时间:2016-06-30 14:38:29

标签: metal metalkit

我发现Model I/O并且我想用它来生成顶点来创建一个球体,所以我使用这个类方法创建了一个MDLMesh对象:

let sphere = MDLMesh.newEllipsoidWithRadii(vector_float3(1, 1, 1), radialSegments: 300, verticalSegments: 300, geometryType: MDLGeometryType.KindTriangles, inwardNormals: false, hemisphere: false, allocator: MTKMeshBufferAllocator(device: device))  

然后,要了解它是如何工作的,我想检查我的MDLMesh的属性,所以我这样读它们:

for attribute in sphere.vertexDescriptor.attributes {
            if let vertexAttribute = attribute as? MDLVertexAttribute {
                print("Attribute named : \(vertexAttribute.name), of format \(vertexAttribute.format.rawValue)")
            }
        }

这是输出:

  

名为:position的格式,格式为786435
  属性名称:normal,格式为786435
  名为:textureCoordinate的属性,格式为786434
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0
  属性名为:,格式为0的属性名为:,格式为0

我相信位置和法线是自动生成的,但为什么会有纹理坐标?用什么规则来产生这些规则? 最重要的是,为什么有无效格式的所有未命名属性?

谢谢

编辑:似乎有固定数量的属性(在我的情况下为31),因为即使我添加新的自定义属性(例如通过生成法线),无效的属性也会被这些新属性替换并且属性总数仍为31。

1 个答案:

答案 0 :(得分:1)

似乎Apple配置了要使用前3个属性准备创建的默认vertexDescriptor。它们恰好也是人们需要使用的最常见属性。你有28个属性“持有者”,以防你需要使用超过那些3.顺便说一句,它们的格式无效,它们目前只占用0个字节,因为它们尚未创建和命名。总的来说,您可以创建15种类型的顶点属性,如果需要,您还可以使用更多相同类型的顶点属性。有关nameformat的详细信息,请参阅MDLVertexAttribute Class Reference文档。