在GLSL或Metal Shading Language中,可以执行以下操作
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中通过操作符重载来实现这一点。有没有人尝试过?我不太清楚该如何解决这个问题。
发布于 2016-10-07 02:29:12
下面是一个示例,说明如何为float2执行两个组件的swizzle。float3和float4的实现是相似的。
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)的swizzle;事实上,这是没有意义的,所以这些都是作为只读属性实现的。(2)对于每个向量类型,都有一个属性以升序出现每个组件一次,并且该属性对应的getter/setter分别退化为return self和self = newValue,如上面的xy所示。
https://stackoverflow.com/questions/39799521
复制相似问题