使用GLSL数组的SceneKit着色器修改器
我正在尝试在SceneKit中将一些点传入一个着色器修改器,但我无法制定出正确的语法。 在我的着色器扩展代码中,我有:
uniform vec2 points[100];
如果我打电话…
material.setValue(NSValue(point: CGPoint(x: 100.5, y: 50.5)), forKey: "points")
…然后它设置points[0]
的值,这使我认为这也许是不可能的。 我已经尝试了许多其他的组合键和值,但似乎没有任何工作。
有一个更好的方法吗? 我的最终目标是修改arrays中一组点的表面漫reflection颜色,否则使用默认渲染。 有没有更好的方法来做这个在着色器比循环vec2
的数组?
谢谢你的帮助。
着色器数组variables只是从GL客户端传递给GPU的一个数据块,在着色器代码中约定了一些大小和布局。
因此,要在SceneKit中执行此操作,需要首先设置blob,然后将其包装在NSData
以传递给着色器。 例如
// warning: coded in Safari and untested import simd let points: [float2] = [[100.5, 50.5], [110.5, 60.5], /* ... */ ] // make sure you have 100... let data = NSData(bytes: points, length: points.count * sizeof(float2)) material.setValue(data, forKey: "points")
此外,当您使用单点时,SceneKit将处理从CGPoint
到GPU vec2
的布局转换,但是当您传递一个数据块时,所有SceneKit知道的是它是一个数据blob …它不能看并调整GPU的预期布局,因为它不知道你提供的布局是什么。
所以,你应该使用显式匹配GPU着色器中所需大小和布局的types。 这意味着没有CGPoint
-its组件是CGFloat
,并且该types的大小在CPU架构之间改变。 SIMD库中的float2
types与GL vec2
紧密匹配,并与Metal float2
完全匹配。