2017-03-16 5 views
1

Ich versuche, meinen Shader zu schreiben und Lichtquellen hinzuzufügen, ich habe es irgendwie herausgefunden und es getan.Three.js shader pointLight position

Aber es gibt ein Problem, die Position der Lichtquelle ist falsch bestimmt, wenn sich die Kamera dreht oder bewegt, geschieht etwas unvorstellbares.

So bekomme ich die Position des Vertex-Shader

vec3 vGlobalPosition = (modelMatrix * vec4(position, 1.0)).xyz 

Jetzt versuche ich, eine beleuchtete Fläche

float lightDistance = pointLights[ i ].distance; 
vec3 lightPosition = pointLights[ i ].position; 

float diffuseCoefficient = max( 
    1.0 - (distance(lightPosition,vGlobalPosition)/lightDistance), 0.0); 

gl_FragColor.rgb += color.rgb * diffuseCoefficient; 

zu machen Aber wie ich bereits schrieb, wenn Sie die Kamera drehen, die Beleuchtung Bereich bewegt sich zu verschiedenen Positionen.

Ich legte die Lichtposition manuell und alles wurde normal.

vec3 lightPosition = vec3(2000,0,2000); 
... 

Die Frage ist, wie man die richtige Position der Lichtquelle erhält? Ich brauche eine globale Position, welche Position in der Lichtquelle steckt, die ich nicht kenne.

Hinzugefügt ein Beispiel: http://codepen.io/korner/pen/XMzEaG

+0

Können Sie eine Geige oder einen Codepen machen, der das Problem demonstriert? – gromiczek

+0

@gromiczek, bitte fragen Sie nicht Leute, Codepen oder Jsfiddle zu verwenden. ** Setzen Sie den Code in die Frage selbst. Verwenden Sie [ein Snippet] (https://stackoverflow.blog/2014/09/16/introducing-runnable-javascript-css-and-html-code-snippets/), wenn es ausgeführt werden soll ** – gman

+0

Ein Beispiel hinzugefügt: http://codepen.io/korner/pen/XMzEaG – user2783211

Antwort

0

Ihr Problem mit vPos liegt. Derzeit tun Sie:

vPos = (modelMatrix * vec4(position, 1.0)).xyz 

Stattdessen müssen Sie die Position mit modelViewMatrix multiplizieren:

vPos = (modelViewMatrix * vec4(position, 1.0)).xyz; 

Sie verwenden müssen modelViewMatrix weil PointLight.position ist relativ zur Kamera.

+0

Danke, geholfen, aber verursacht ein anderes Problem) Ist es möglich, in eine globale Position zu konvertieren? Weil ich einen Nebel gemacht habe und dort 'modelMatrix' verwendet habe – user2783211

+0

Gern geschehen! Ich sehe im aktuellen Beispiel keinen Nebel, also statt die Kommentare zu überfrachten. Ich möchte Sie stattdessen ermutigen, eine neue Frage zu stellen. :) – Vallentin

+0

Bitte werfen Sie einen Blick auf diesen Beitrag, vielleicht können Sie mir wieder helfen :) http://stackoverflow.com/questions/42873013/three-js-shader-pointlight-to-global-position – user2783211

Verwandte Themen