2017-07-27 3 views
0

Ich habe einen einfachen Shader, der es mir erlaubt, Knotenfarbe basierend auf den lokalen Achsen des Knotens (x> 0) -> grün, aber wie es funktioniert basierend auf den Weltkoordinaten.SceneKit, Shader zum Überlagern von Farbe basierend auf Weltkoordinaten auf Knoten basierend

(mögliche Shader-basierte nicht durch ein paar Punkte von Szene konvertieren und es zu Shader vorbei)

Shader demo

vec4 pos = u_inverseModelTransform * u_inverseViewTransform * vec4(_surface.position, 1.0); 

if (pos.x > 0.0) { 
    _output.color.rgb = vec3(0.0, 0.8, 0.0); 
} 

Antwort

0

Sie wollen nicht von u_inverseModelTransform multiplizieren, die Sie wieder aus der Welt Raum bewegt zu Objektraum.

vec4 pos = u_inverseViewTransform * vec4(_surface.position, 1.0); 
0

Als logische Folge richtige Antwort ‚mnuages‘ ich, dass endlich herausgefunden, wenn Sie in MetalSL sind und Sie sollten scn_frame.inverseViewTransform nicht GLSL verwenden nicht u_inverseViewTransform.

Das ist schwierig, weil SceneKit automatisch versucht, GLSL ShaderModifiers in MetalSL zu kompilieren, so dass es schwer ist zu wissen, welche Sie manchmal verwenden. (Z. B. können Sie Ihre SceneKit-Ansicht anstelle von OpenGL- oder GLES-Backed Metal-Backed verwenden und Ihre Shader-Modifizierer weiterhin in GLSL und SceneKit schreiben.)

Verwandte Themen