2016-09-08 2 views
4

Я пытаюсь передать GLKVector4 шейдеру, который должен получить его как vec4. Я использую фрагмент шейдеров модификатор:SceneKit передает единый вектор модификаторам шейдера

material.shaderModifiers = [ SCNShaderModifierEntryPoint.fragment: shaderModifier ] 

где shaderModifier является:

// color changes 
uniform float colorModifier; 
uniform vec4 colorOffset; 

vec4 color = _output.color; 

color = color + colorOffset; 
color = color + vec4(0.0, colorModifier, 0.0, 0.0); 

_output.color = color; 

(я просто добавить цвет смещение) Я пробовал:

material.setValue(GLKVector4(v: (250.0, 0.0, 0.0, 0.0)), "colorOffset") 

который не работает (смещение не добавляется, и шейдер использует значение по умолчанию (0, 0, 0, 0)). То же самое происходит, если я заменю GLKVector4 по SCNVector4

После this Я также попытался:

let points: [float2] = [float2(250.0), float2(0.0), float2(0.0), float2(0.0)] 
material.setValue(NSData(bytes: points, length: points.count * sizeof(float2)), "colorOffset") 

Однако, я могу передать значение с плавающей точкой в ​​равномерном colorModifier легко делать:

material.setValue(250.0, forKey: "colorModifier") 

и это приведет к увеличению зеленого канала за исключением

ответ

2

Таким образом, вы должны использовать NSValue, который имеет инициализация удобства для SCNVector4, так:

let v = SCNVector4(x: 250.0, y: 0.0, z: 0.0, w: 0.0) 
material.setValue(NSValue(scnVector4: v), "colorOffset") 

Было бы слишком хорошо, если SceneKit может обрабатывать свои собственные типы непосредственно ...

+0

оборачивать в 'Структуры NSValue' для перехода к API, которые принимают объекты артефакт ObjC. В настоящее время Swift предоставляет некоторые автоматические мосты, но не для всех (и обычно не для типов, предоставляемых инфраструктурами более высокого уровня, такими как SceneKit). Похоже, [что может измениться, хотя] (https://github.com/apple/swift-evolution/blob/master/proposals/0139-bridge-nsnumber-and-nsvalue.md) ... – rickster

+0

Очень интересно читать , Я как-то пожелал, чтобы SceneKit не слишком полагался на Swift, обрабатывая эти вещи, и вместо этого определял функции 'setValue', которые имеют смысл, например' set (значение: Float, для ключа: String) ',' set (значение: SCNVector4 .. .) 'и т. д. и, следовательно, выявить все другие вещи, которые в любом случае не будут переданы в программу шейдеров, вместо того, чтобы принимать вход типа« Любой » – Guig

+1

Это [может быть хорошая обратная связь для отправки в Apple] (http: // bugreport .apple.com). – rickster