【问题标题】:SceneKit pass uniform vector to shader modifiersSceneKit 将统一向量传递给着色器修改器
【发布时间】:2017-01-17 00:30:57
【问题描述】:

我正在尝试将GLKVector4 传递给应该将其作为vec4 接收的着色器。我正在使用片段着色器修改器:

material.shaderModifiers = [ SCNShaderModifierEntryPoint.fragment: shaderModifier ]

shaderModifier 在哪里:

// color changes
uniform float colorModifier;
uniform vec4 colorOffset;

vec4 color = _output.color;

color = color + colorOffset;
color = color + vec4(0.0, colorModifier, 0.0, 0.0);

_output.color = color;

(我只是添加了一个颜色偏移)我试过了:

material.setValue(GLKVector4(v: (250.0, 0.0, 0.0, 0.0)), "colorOffset")

这不起作用(没有添加偏移,着色器使用默认值,即 (0, 0, 0, 0))。如果我将GLKVector4 替换为SCNVector4,也会发生同样的情况

关注this我也试过了:

let points: [float2] = [float2(250.0), float2(0.0), float2(0.0), float2(0.0)]
material.setValue(NSData(bytes: points, length: points.count * sizeof(float2)), "colorOffset")

但是,我可以通过以下方式轻松地将浮点值传递给统一 colorModifier

material.setValue(250.0, forKey: "colorModifier")

这将增加绿色通道作为例外

【问题讨论】:

    标签: swift shader scenekit


    【解决方案1】:

    所以你必须使用 NSValue,它对 SCNVector4 有一个方便的初始化,所以:

    let v = SCNVector4(x: 250.0, y: 0.0, z: 0.0, w: 0.0)
    material.setValue(NSValue(scnVector4: v), "colorOffset")
    

    如果 SceneKit 可以直接处理它自己的类型就太好了...

    【讨论】:

    • NSValue 中包装结构以传递给接受对象的 API 是 ObjC 的产物。 Swift 目前提供了一些自动桥接功能,但并非针对所有内容(通常也不针对高级框架(如 SceneKit)提供的类型)。看起来像that might be changing, though...
    • 非常有趣的阅读。我以某种方式希望 SceneKit 不那么依赖 Swift 处理这些事情,而是定义了有意义的 setValue 函数,例如 set(value: Float, for key: String)set(value: SCNVector4...) 等,因此排除了所有其他无论如何都不会通过的事情到着色器程序,而不是接受 Any 类型输入
    猜你喜欢
    • 2017-01-24
    • 2021-09-16
    • 2016-02-06
    • 2021-01-07
    • 2017-06-25
    • 2013-07-26
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多