objective-c – 解释Metal和SIMD中的不同类型

使用Metal时,我发现有一些令人眼花缭乱的类型,我并不总是清楚我应该在哪种类型的上下文中使用哪种类型.

在Apple的Metal Shading语言规范中,有一个非常清晰的表格,其中包含Metal Shader文件中支持的类型.但是,有大量可用的示例代码似乎使用属于SIMD的其他类型.在macOS(Objective-C)方面,Metal类型不可用,但是SIMD类型,我不确定我应该使用哪些.

例如:

在Metal Spec中,float2被描述为表示两个浮动组件的“向量”数据类型.

在应用程序方面,以下所有内容似乎都以某种身份使用或表示:

> float2,它是vector_types.h中的typedef :: simd_float2 float2

注意:“在C或Objective-C中,此类型可用作simd_float2.”

> vector_float2,它是typedef simd_float2 vector_float2

注意:“此类型已弃用;您应该使用simd_float2或simd :: float2”

> simd_float2,它是typedef __attribute __((__ ext_vector_type __(2)))float simd_float2

> :: simd_float2和simd :: float2?

矩阵类型存在类似的情况:

> matrix_float4x4,simd_float4x4,:: simd_float4x4和float4x4,

有人可以请说明为什么有这么多类型的dedef具有看似重叠的功能?如果您今天(2018)在Objective-C / Objective-C中编写了一个新的应用程序,那么您应该使用哪种类型来表示两个浮点值(x / y)以及哪些类型可以在应用程序代码和Metal之间共享矩阵变换?

具有vector_和matrix_前缀的类型已被弃用,有利于具有simd_前缀的类型,因此一般指导(使用float4作为示例)将是:

>在C代码中,使用simd_float4类型. (除非您提供自己的typedef,否则必须包含前缀,因为C没有名称空间.)
> Objective-C相同.
>在C代码中,使用simd :: float4类型,您可以使用命名空间simd;缩短为float4.
> Objective-C相同.
>在Metal代码中,使用float4类型,因为float4是Metal Shading Language [1]中的基本类型.
>在Swift代码中,使用float4类型,因为simd_类型的类型是较短的名称.

这些类型基本上都是等效的,并且都具有相同的大小和对齐特性,因此您可以跨语言使用它们.实际上,这就是simd框架的设计目标之一.

因为你没有问,我会把关于打包类型的讨论留到另一天.

[1] Metal是一种不寻常的情况,因为它在全局命名空间中定义了float4,然后将其导入到金属命名空间中,该命名空间也被导出为simd命名空间.它还将float4别名为vector_float4.因此,您可以对此向量类型使用上述任何名称(simd_float4除外).喜欢float4.

相关文章
相关标签/搜索