SceneKit将均匀矢量传递给着色器修改器

时间:2016-09-08 23:40:35

标签: swift shader scenekit

我试图将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")

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

1 个答案:

答案 0 :(得分:2)

所以你必须使用NSValue,它具有SCNVector4的便利初始化,所以:

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

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