[英]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.