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

Swift SceneKit将均匀向量传递给着色器修改器,swift,shader,scenekit,Swift,Shader,Scenekit,我正在尝试将GLKVector4传递给应该作为vec4接收它的着色器。我正在使用片段着色器修改器: material.shaderModifiers = [ SCNShaderModifierEntryPoint.fragment: shaderModifier ] 其中shaderModifier是: // color changes uniform float colorModifier; uniform vec4 colorOffset; vec4 color = _output.co

我正在尝试将
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
替换为
sconvector4

以下我也尝试过:

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")
但是,我可以通过执行以下操作轻松地将浮点值传递给统一的
颜色修改器

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

除此之外,这将增加绿色通道

,因此您必须使用NSValue,它可以方便地初始化SCInvector4,因此:

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等高级框架提供的类型)。看起来…读起来很有趣。我希望SceneKit不要太依赖Swift处理这些事情,而是定义了有意义的
setValue
函数,比如
set(value:Float,代表key:String)
set(value:scinvector4…)
etc,从而确定无论如何都不会传递给着色器程序的所有其他内容的范围,而不是接受
Any
类型inputThat。