使用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库中的float2types与GL vec2紧密匹配,并与Metal float2完全匹配。