在 Metal File 中访问 swift 结构或类

Posted

技术标签:

【中文标题】在 Metal File 中访问 swift 结构或类【英文标题】:access swift Struct or class in Metal File 【发布时间】:2018-10-26 08:10:44 【问题描述】:

在swift文件中,声明了顶点数据:

struct Vertex 
    let position: vector_float4
    let color: vector_float4

我想在金属文件中访问这个结构,可以吗? 如果是,如何制作?

我已经知道如何用Objective-C制作了,只是想用swift。

【问题讨论】:

【参考方案1】:

不能直接从 Metal 使用 Swift 结构。但是,您可以在 Objective-C 标头中声明该结构并在 Swift 和 Metal 中使用它(通过 Objective-C 桥接头)。有关如何执行此操作的示例,请参阅 Xcode 提供的 Metal Game 模板。与 Apple 的最佳实践建议相反,我实际上不想这样做,而是在每种语言中声明这样的结构。

Metal Shading Language 中的等效结构声明为

struct Vertex 
    float4 position;
    float4 color;
;

如果您在管道中使用顶点描述符(在顶点函数中使用 stage_in 参数,而不是通过接收 vertex_id 和指向 Vertex 结构的指针来手动获取顶点),您需要将属性属性添加到结构中,对应于它们在顶点描述符属性数组中的索引。例如,

struct Vertex 
    float4 position [[attribute(0)]];
    float4 color [[attribute(1)]];
;

【讨论】:

是的,我同意你的偏好,用金属编码真的不优雅 与 Apple 的最佳实践建议相反,我实际上不想这样做,而是在每种语言中声明这样的结构。 不是一个好主意,因为结构在 Swift 中声明的内存布局可能不同。从技术上讲,他的结构字段甚至可以重新排序,即使目前还没有发生。 Swift 中(还没有)任何指令来控制内存结构布局。 公平点。在 Swift 流失近五年的时间里,我什至一次都没有受到过这种影响,但这种可能性确实存在。

以上是关于在 Metal File 中访问 swift 结构或类的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 iPad Swift Playground 中使用 Metal 着色器代码?

.self 在 Swift 中的结构类型之后

Swift Metal 将 bgra8Unorm 纹理保存到 PNG 文件

Metal(iOS)中的多重采样/锯齿状边缘

Swift数组中的访问结构

苹果的 Metal 工程