Frage

Ich versuche, Punktlichter in OpenGL mit GLSL zu implementieren. Ich schicke alle erforderlichen Daten an den Shadern. Die Einfachheit halber verwende ich nur das diffuse Licht hier.

Mein Beispiel zeigt ein riesiges Dreieck, das ich mit einer einzigen Lichtquelle beleuchten will. Die Lichtquelle wird als kleines blaues Dreieck angezeigt.

Für diffuses Licht brauche ich den Winkel zwischen dem Licht und der Oberfläche kennen. Daher berechnen ich die Normalen und die Richtung des Lichts. Der Punkt-Produkt wird dann geben Sie mir eine Zahl zwischen -1 und 1, während alles zwischen 0 und 1 beleuchtet wird.

Doch hier bin ich fest, da dieser Winkel falsch in meinem Beispiel berechnet wird. Da es zu debuggen Shadern hart ist, habe ich mehrere Ausgänge als die Farbe meiner Oberfläche. Ich benutzen die normalen als Farbe für das Dreieck und überall dort, wo das Licht war, war die Oberfläche immer grün. Das heißt, daß die Normalen der y-Achse nach oben zeigen und daher werden sie berechnet rechts. Das heißt, dass das Licht der Richtung falsch sein. Ich kann aber nicht den Grund, warum es falsch ist. Die Position des Lichts und der Scheitelpunkt-Position in Welt-Raum an den Vertex-Shader übergeben, der sie dann in Auge Raum verwandelt, das Licht der Richtung berechnen und übergeben diese an das Fragment-Shader:

Vertex-Shader:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

Fragment-Shader:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

Ich habe ein paar Bilder von diesem Beispiel angehängt, die auf jeden Fall zeigen, dass die Interpolation wirklich seltsam ist. Ich weiß, möchte wissen, ob der Code, den ich klebte richtig ist oder ob Sie brauchen mehr von dem Code kennen. Darüber hinaus ist dieses Interpolationsverhalten normal oder ist es ein Fehler in meinem Code?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

Vor allem das erste Bild zeigt, dass die Mittelpunkt des Lichts nicht direkt unter dem Licht, sondern bewegte sich leicht auf die Mitte des Dreiecks.

Wenn ich "po" an den Fragment-Shader übergeben (das heißt, es wird interpoliert) und dann berechnen "lightDir" in den Fragment-Shader, alles funktioniert.

War es hilfreich?

Lösung

Ich denke, dass Ihre lightDir in der Vertex-Shader-Normalisierung des Ergebnisses beeinflusst Sie erhalten, wenn die Vektoren interpoliert, da sie die Länge aus der Gleichung herausnimmt und somit wirkt sich auf die „Geschwindigkeit“ der Interpolation.

Wenn Sie eine (visuell) Erklärung wollen, versuchen Sie es in 2D auf Papier zu zeichnen. zeichnet zunächst eine Linie (Ihr Dreieck) und einen Punkt (Lichtquelle). Fügen zwei Leitungen (lightDir) für beide Enden der Leitung mit der Lichtquelle und dann schrumpfen (normalisiert) jene lightDir Linien, so dass sie die gleiche Länge haben und beide treffen sich an der Lichtquelle. Wenn Sie beide Enden der normalisierten lightDir Linien verbinden Sie eine nicht-parallele Linie (wenn die Lichtquelle nicht genau in der Mitte der ersten Zeile). Nun, wenn Sie eine Linie zeichnen, die genau durch die Mitte von einem der Linien geht, werden Sie sehen, dass es nicht durch die Mitte der anderen Linie geht aber trifft es ein wenig nach links oder rechts.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top