[英]Corresponding Swift Data types for Metal data types?
我正在传递我的金属内核和着色器函数一个参数结构。 在任何地方都找不到指定用于与Metal中的数据类型匹配的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
那些是正确的吗? 参数数据类型是否有记载的地方?
Swift中Int
类型的大小取决于目标平台。 它可能等于Int32
或Int64
,尽管Int64
它们几乎总是Int64
。 因此,您应该使用更明确的Int32
类型来匹配Metal的32位int
类型。
从Swift 5开始,不推荐使用float2
和float4
而推荐使用SIMD2<Float>
和SIMD4<Float>
。 这些与Metal的float2
和float4
完全对应。
我相信您的其余信件都是正确的。
但是,首先在Swift中定义这些结构可能并不明智。 Swift对于结构布局(填充,对齐和成员顺序)不提供任何保证。 因此,您可能会发现Swift和MSL之间的布局不匹配(我还没有看到这种情况发生,但关键是它可以 )。
我认为,当前的指南是在C / Objective-C中定义此类结构,然后通过桥接标头将其导入。 这使得将memcpy
样式的结构副本复制到Metal缓冲区中的可能性更大。 始终要特别注意大小和对齐方式,尤其是由于手动重新排序结构成员可能会更改结构的大小和/或步幅。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.