我正在传递我的金属内核和着色函数的参数结构。我找不到任何地方指定要使用什么Swift数据类型来匹配金属中的数据类型。
我已经尽了最大的努力来猜测在Swift方面使用哪些数据类型,但是我在结构中定义变量的顺序似乎很挑剔。这让我相信他们是不一致的。
例如,以下是我在Metal中使用的数据类型:
struct ComputeParameters {
bool yesNo;
int count;
float scale;
float2 point;
float4 color;
};这是我在Swift中的对应结构:
struct ComputeParameters {
var yesNo: Bool = false
var count: Int32 = 0
var scale: Float32 = 1.0
var point: float2 = float2(0.0, 0.0)
var color: float4 = float4(0.0, 0.0, 0.0, 1.0)
}下面是我从上面使用的数据类型表。
Metal _________ Swift
bool Bool
int Int32
float Float32
float2 float2
float4 float4这些是对的吗?参数数据类型是否有文档化的地方?
发布于 2019-08-01 18:22:35
Swift中Int类型的大小取决于目标平台。它可能等于Int32或Int64,尽管现在几乎总是Int64。因此,您应该使用更显式的Int32类型来匹配金属的32位int类型。
从Swift 5开始,float2和float4分别被反对为SIMD2<Float>和SIMD4<Float>。这与金属的float2和float4完全一致。
我相信你的其他信件都是正确的。
然而,在Swift中定义这些结构可能并不明智。Swift不保证结构布局(填充、对齐和成员顺序)。因此,您可能会遇到Swift和MSL之间的布局不匹配(我还没有看到这种情况,但关键是它可以)。
我认为,当前的指导方针是在C/Objective中定义此类结构,并通过桥接头导入它们。这使得将结构的memcpy-style复制到金属缓冲区的可能性更大。始终要注意大小和对齐,特别是因为手动重新排序结构成员可以更改结构的大小和/或步幅。
https://stackoverflow.com/questions/57299520
复制相似问题