gpt4 book ai didi

ios - XCode Metal 模板 : Where is VertexAttribute. 位置定义了吗?

转载 作者:行者123 更新时间:2023-11-28 15:07:49 26 4
gpt4 key购买 nike

在 XCode 9 的 Metal 模板中,有一部分是在 MTLVertexDescriptor 上设置 attributeslayouts

let mtlVertexDescriptor = MTLVertexDescriptor()
mtlVertexDescriptor.attributes[VertexAttribute.position.rawValue].format = ...
mtlVertexDescriptor.attributes[VertexAttribute.texcoord.rawValue].format = ...

我努力了,但无法弄清楚神奇的关键字positiontexcoord和后来的meshPositionsmeshGenerics 来自。

我猜它不是来自源代码,但我没有找到任何指定这些内容的文档。对于 VertexAttribute,我得到的是 the reference page , 没有提及 positiontexcoord

XCode 将我指向 ShaderTypes.h,即这一部分:

typedef NS_ENUM(NSInteger, VertexAttribute) {
VertexAttributePosition = 0,
VertexAttributeTexcoord = 1,
};

我觉得这是理解这一点的关键,但我有多个问题:

  • 作为一名开始使用 Swift 的开发人员,在 Swift 项目模板中,这个 Obj-C 部分有点令人困惑。你能清楚地解释一下它到底做了什么吗?

  • NS_ENUM 中的 VertexAttributePosition 如何添加神奇的属性 .positionVertexAttributeTexcoord -> .texcoord?

  • 为什么这些都没有记录(Google 发现主要是 OpenGL 相关页面),XCode 也找不到任何帮助/跳转到它们的定义?

最佳答案

了解这里发生的事情的线索可以在 ShaderTypes.h 文件的这一行中找到:

//  Header containing types and enum constants shared between Metal shaders and Swift/ObjC source

ShaderTypes.h 的明确意图是声明着色器(用 Metal 着色语言,C++ 的一种方言编写)和渲染器类(用 Objective-C 或 Swift 编写)都可以使用的类型,具体取决于您在打开模板时选择的)。实现这一点的方法是构建一个可以包含在两者中的头文件。使用 Swift 时出现了转折,因为 Swift 缺少头文件的概念,除了一种特殊情况:桥接头

将 C 或 Objective-C 代码合并到 Swift 应用程序时,您需要提供一个桥接 header ,用于导入或声明您要在 Swift 中使用的类型和方法。在 Xcode 中,您可以使用项目build设置的“Swift 编译器 - 常规”部分中的“Objective-C Bridging Header”设置对其进行配置。它有点被埋没了,但如果你去那里,你会看到它填充了模板中的“ShaderTypes.h” header 。这就是您的 Swift 代码了解 VertexAttribute 枚举类型的方式。

在 Objective-C 中,要获取属性索引,您将直接使用定义的枚举值之一:VertexAttributePosition,它在功能上等同于文字 0 .当它被导入到 Swift 中时,枚举的名称 (VertexAttribute) 被从前面剥离,并且值被转换为小驼峰大小写,按照 Swift 风格,例如位置。您可以阅读更多详情 here .

这样做的结果是,即使代码中的任何地方都没有名为“position”的枚举值,当您使用 Swift 中的 Objective-C 枚举时,该名称也会为您合成。 rawValue 属性是与特定枚举值关联的整数值,然后可以将其用作属性或顶点描述符的索引(同样,在这种情况下,它等于 0)。

这些都没有记录,因为它们是在此模板中专门定义的。它们不是 Metal API 的一部分,也不是任何 API 的一部分;它们只是为底层常量提供方便标签的名称,目的是使着色器和应用程序代码彼此一致。

关于ios - XCode Metal 模板 : Where is VertexAttribute. 位置定义了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48227353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com