Ios 使用GLSL阵列的SceneKit着色器修改器

Ios 使用GLSL阵列的SceneKit着色器修改器,ios,macos,swift,glsl,scenekit,Ios,Macos,Swift,Glsl,Scenekit,我试图将一组点传入SceneKit中的着色器修改器,但我无法计算出正确的语法。在我的着色器扩展代码中,我有: uniform vec2 points[100]; 如果我打电话 material.setValue(NSValue(point: CGPoint(x: 100.5, y: 50.5)), forKey: "points") …然后它设置了点[0]的值,这使我认为这可能是不可能的。我尝试了很多其他组合,包括键和值,但似乎都不起作用 有更好的方法吗?我的最终目标是修改阵列中一组点的曲面

我试图将一组点传入SceneKit中的着色器修改器,但我无法计算出正确的语法。在我的着色器扩展代码中,我有:

uniform vec2 points[100];
如果我打电话

material.setValue(NSValue(point: CGPoint(x: 100.5, y: 50.5)), forKey: "points")
…然后它设置了
点[0]
的值,这使我认为这可能是不可能的。我尝试了很多其他组合,包括键和值,但似乎都不起作用

有更好的方法吗?我的最终目标是修改阵列中一组点的曲面漫反射颜色,否则使用默认渲染。在着色器中有没有比在
vec2
s数组上循环更好的方法


感谢您的帮助。

着色器数组变量只是从GL客户端传递到GPU的一组数据,其大小和布局在着色器代码中已达成一致

因此,要在SceneKit中执行此操作,首先需要设置blob,然后将其包装在
NSData
中以传递到着色器。e、 g

// 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只知道这是一个数据块。。。它无法查看内部并调整GPU可能期望的布局,因为它不知道您提供的布局是什么


因此,应该使用与GPU着色器中所需的大小和布局明确匹配的类型。这意味着没有
CGPoint
——它的组件是
CGFloat
,并且这种类型的大小在CPU架构之间会发生变化。SIMD库中的
float2
类型与GL
vec2
非常匹配,与Metal
float2
完全匹配,谢谢@rickster。但是我对此有一些问题-首先,Swift 1.2中的SIMD似乎不完整,因此我没有
float2
类型。因此,我尝试创建一个一维数组
GLfloat
s,并将统一更改为
float[]
类型,然后创建数据并尝试如上所述设置值,但即使这样也没有效果(着色器渲染时,所有值都是0)。你知道会出什么问题吗?Swift中只有Swift 2.0版本(目前为beta版,Xcode 7 beta版)提供SIMD类型。使用
float
数组是可以的(并且您不需要更改着色器声明,因为200
float
s的数组与100
vec2
s的数组具有相同的布局)。不确定NSData到着色器部分是否失败,但是。。。我会再调查一下。