2017-02-08 13 views
0

Я работаю с SceneKit на iOS. В вершинных шейдеров OpenGL ES Я пытаюсь прочитать следующую форму:Можно ли передать массив с плавающей точкой в ​​модификатор вершинного шейдера iOS SceneKit?

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") 

Однако, что бы я ни делал, кажется, что униформа просто инициализируется массивом нулей.

Проходит ли поддержка массивов для модификаторов шейдеров? Если да, то какой правильный синтаксис?

ответ

2

NO, проходя NSArray к равномерному не поддерживается, на основе этой таблицы из 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 из NSValue «s init(bytes:objCType:), и теоретически должны работы, пока значение правильно закодированы.