首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift中,可以像在GLSL或Metal Shading Language中那样"swizzle“向量的字段吗

在Swift中,可以像在GLSL或Metal Shading Language中那样"swizzle“向量的字段吗
EN

Stack Overflow用户
提问于 2016-10-01 04:21:50
回答 1查看 316关注 0票数 2

在GLSL或Metal Shading Language中,可以执行以下操作

代码语言:javascript
复制
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)

也是

代码语言:javascript
复制
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中通过操作符重载来实现这一点。有没有人尝试过?我不太清楚该如何解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2016-10-07 02:29:12

下面是一个示例,说明如何为float2执行两个组件的swizzle。float3float4的实现是相似的。

代码语言:javascript
复制
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 selfself = newValue,如上面的xy所示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39799521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档