ios - 是否可以将 float 组传递给 iOS SceneKit 顶点着色器修改器?

标签 ios swift opengl-es scenekit glsles

我在 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 中的此表手册:

enter image description here

但你可以使用两个 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 NSValueinit(bytes:objCType:) ,理论上应该只要值被正确编码就可以工作。

关于ios - 是否可以将 float 组传递给 iOS SceneKit 顶点着色器修改器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109613/

相关文章:

ios - 以编程方式调整 UITabBarItem 中的图像大小?

iOS - 如何检测可能的内存泄漏提示

ios - Swift - 转换为绝对值

ios - 应用启动时的插页式广告

swift - 用另一个字符串替换一个字符串

ios - 在 xCode 6.1 (Swift) 中为 UITextField 创建通用填充/插入

ios - 如何让键盘位于 UITextField 的正下方?

ios - 在 iOS 4.3 中将 YpCbCr iPhone 4 相机帧渲染为 OpenGL ES 2.0 纹理

没有引擎的 Android 2D 游戏开发

android - OpenGL ES 2.0 渲染不正确