在使用Metal时,我发现类型令人困惑,而且我并不总是清楚在哪种情况下应该使用哪种类型。
在Apple的Metal Shading语言规范中,Metal着色器文件中支持哪种类型的表非常清楚。但是,有许多示例代码似乎使用了SIMD一部分中的其他类型。在macOS(Objective-C)方面,Metal类型不可用,但SIMD类型可用,我不确定应该使用哪种类型。
例如:
在《金属规格》中,float2
它被描述为代表两个浮动成分的“向量”数据类型。
在应用程序方面,以下所有功能似乎都得到了使用或表示:
float2
,typedef ::simd_float2 float2
位于vector_types.h中
注意:“在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
,
有人可以说明为什么这么多的typedef具有看似重叠的功能吗?如果您今天(2018年)使用Objective-C / Objective-C ++编写一个新应用程序,则应使用哪种类型来表示两个浮点值(x / y),以及可以在应用程序代码和Metal之间共享的矩阵转换的类型?
不推荐使用带有vector_
和matrix_
前缀的类型,而推荐使用带有前缀的类型simd_
,因此一般指导(float4
以示例为例)为:
在C代码中,使用simd_float4
类型。(除非您提供自己的前缀,否则必须包括前缀typedef
,因为C没有命名空间。)
与Objective-C相同。
在C ++代码,使用simd::float4
类型,它可以缩短到float4
通过using namespace simd;
。
与Objective-C ++相同。
在Metal代码中,使用float4
类型,因为它float4
是Metal Shading Language [1]中的基本类型。
在Swift代码中,使用float4
类型,因为simd_
类型被别名化为较短的名称。
更新:在Swift 5中,float4
不赞成使用相关类型,而赞成SIMD4
和相关类型。
这些类型从根本上都是等效的,并且都具有相同的大小和对齐特征,因此您可以跨语言使用它们。实际上,这就是simd框架的设计目标之一。
由于您没有询问,我将把打包类型的讨论推迟到另一天。
[1] Metal是一种不寻常的情况,因为它float4
在全局名称空间中定义,然后将其导入metal
名称空间,该名称空间也作为simd
名称空间导出。此外float4
,它的别名为vector_float4
。因此,您可以将以上任何名称用于此向量类型(除外simd_float4
)。更喜欢float4
。