我在 iOS 上使用 SceneKit。在 OpenGL ES 顶点着色器中,我正在尝试读取以下制服:
uniform float floats[8];
我将我的数组传递给顶点着色器修改器,使用 Swift 中的以下调用:
let floats = [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0]
material.setValue(NSArray(array: floats), forKey: "floats")
但是,无论我做什么,制服似乎都只是初始化为一个零数组。
是否支持将数组传递给着色器修改器?如果是这样,正确的语法是什么?
最佳答案
不,不支持将 NSArray
传递给 uniform,基于 SCNShadable
中的此表手册:
但你可以使用两个 vec4 (SCNVector4)
或 mat4 (CATransform3D)
,但记得将它们包裹在 NSValue
中。
另一种方法是尝试这样的事情:
let vec1 = SCNVector4(x: 10.0, y: 20.0, z: 30.0, w: 40.0)
let vec2 = SCNVector4(x: 50.0, y: 60.0, z: 70.0, w: 80.0)
let unival = NSValue(bytes: [vec1, vec2], objCType: "[2{SCNVector4=ffff}]")
material.setValue(unival, forKey: "floats")
这利用了type encoding NSValue
的 init(bytes:objCType:)
,理论上应该只要值被正确编码就可以工作。
关于ios - 是否可以将 float 组传递给 iOS SceneKit 顶点着色器修改器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109613/