2016-09-16 10 views
3

Ich versuche, Shader Modifier mit Metall zu verwenden. Ich kann keine Uniformen zu erklären, herauszufinden, ... So weit mein Fragment Modifikator:SCN Shader Modifier in Metall - pass uniform zu Shader

// color changes 
#pragma arguments 
float4x4 u_color_transformation; 

#pragma body 
_output.color.rgb = vec3(1.0) - (u_color_transformation * _output.color).rgb; 

Dies gibt eine lilae Textur, ohne lügt .. Wenn ich nur _output.color.rgb = (u_color_transformation * _output.color).rgb, sind die Dinge in Ordnung. Ich denke ich folge dem doc aber vielleicht nicht!

ist die einheitliche Satz mit:

material.shaderModifiers = 
     [ SCNShaderModifierEntryPoint.fragment: theShaderAbove ] 

material.setValue(NSValue(mat4: GLKMatrix4Identity), forKey: "u_color_transformation") 

dies war die Arbeit mit openGL fein All

Update:

SceneKit Shader-Modifikatoren GLSL-Code verwendet Offenbar, und kümmert sich um sie von der Umstellung auf Metall. Also änderte ich den Shader:

// color changes 
#pragma arguments 
uniform mat4 u_color_transformation; 

#pragma body 
_output.color.rgb = vec3(1.0) - (u_color_transformation * _output.color).rgb; 

Der Ausgang jetzt weiß ist (was darauf hindeutet, dass es zumindest kompiliert), was darauf hindeutet, dass u_color_transformation nicht an den Shader übergeben wird, und wird auf eine Nullmatrix im Shader aufgelöst, die gibt Schwarz, das, einmal invertiert, weiß ist.

Antwort

2

SceneKit nahm an, dass Sie Glsl verwenden, weil Sie vec3 (1.0) in Ihrem Shader-Körper hatten. Wenn Sie das in float3 (1.0) geändert hätten, hätte es Metall verwendet und ohne das einheitliche Schlüsselwort funktioniert.