2016-09-30 45 views
1

在GLSL或金屬着色語言,這是可以做到以下在斯威夫特是否有可能「調酒」載體的領域中GLSL或金屬着色語言

float4 pos = float4(1.0f, 2.0f, 3.0f, 4.0f); 
float4 swiz = pos.wzyx; // swiz = (4.0f, 3.0f, 2.0f, 1.0f) 
float4 dup = pos.xxyy; // dup = (1.0f, 1.0f, 2.0f, 2.0f) 

float4 pos = float4(1.0f, 2.0f, 3.0f, 4.0f); 
// pos = (5.0, 2.0, 3.0, 6.0) 
pos.xw = float2(5.0f, 6.0f); 

// pos = (8.0, 2.0, 3.0, 7.0) 
pos.wx = float2(7.0f, 8.0f); 

// pos = (3.0, 5.0, 9.0, 7.0) 
pos.xyz = float3(3.0f, 5.0f, 9.0f); 

這被稱爲組件攪拌和排列。我想通過操作符重載在Swift中實現這一點。有沒有人試過這個?我有點不清楚如何解決這個問題。

+0

所以,你想方便能夠引用陣列中的一個位置與一個字母,並能夠重新排列數組的方式?關於你想複製的「swizzling」究竟是什麼? – ColGraff

+0

Swizzling對於處理着色器中的矢量組件非常方便。它在Swift級別上可以同樣方便。例如,在從UIKit View空間 - 2D轉換爲金屬3D空間時,在拾取/拖動時。 – dugla

回答

1

下面是如何爲float2執行雙組分混合的示例。 float3float4的實現類似。

extension float2 { 
    var xx: float2 { get { return float2(x, x) } } 
    var xy: float2 { get { return self } set { self = newValue } } 
    var yx: float2 { get { return float2(y, x) } set { y = newValue.x; x = newValue.y } } 
    var yy: float2 { get { return float2(y, y) } } 

    // ...336 additional swizzles... 
} 

幾個觀察:(1)它不是在GLSL允許分配到包含重複的組件(例如xxyz)一個拌和;實際上,它沒有任何意義,所以這些實現爲只讀屬性。 (2)對於每個矢量類型,有一個屬性按照詞彙順序升序確切地出現每個組件,並且對於該屬性,相應的屬性getter/setter分別退化爲return selfself = newValue,如上面的xy所示。