5 Stimmen

Was ist ein Halbvektor in modernem GLSL?

http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2 berichtet, dass der halbe Vektor im OpenGL-Kontext "Augenposition - Lichtposition" ist, aber dann heißt es weiter: "Zum Glück berechnet OpenGL das für uns" [was jetzt veraltet ist].

Wie kann das praktisch berechnet werden (ein einfaches Beispiel wäre sehr willkommen) [vor allem ist es mir ein Rätsel, was "Auge" ist und wie es abgeleitet werden kann].

Im Moment habe ich es geschafft, dass die Spiegelungsberechnungen funktionieren (mit einem guten visuellen Ergebnis), wenn der halbe Vektor gleich dem Licht ist, wobei das Licht

vec3 Light = normalize(light_position - vec3(out_Vertex));

Ich habe keine Ahnung, warum das funktioniert hat.

(Wenn ich wenigstens wüsste, was "Auge" ist und wie man es praktisch ableiten kann.)

7voto

pyj Punkte 1469

Der Halbvektor wird bei spiegelnder Beleuchtung verwendet und stellt die Normale an Mikrofehlern in der Oberfläche dar, die dazu führen würden, dass das einfallende Licht zum Betrachter reflektiert wird. Je näher der Halbvektor an der Oberflächennormale liegt, desto mehr Unebenheiten werden mit der tatsächlichen Oberflächennormale ausgerichtet. Glattere Oberflächen haben weniger Unvollkommenheiten, die von der Oberflächennormalen wegzeigen, und führen zu einem schärferen Glanzlicht mit einem stärkeren Lichtabfall, wenn sich der Halbvektor von der tatsächlichen Normalen entfernt, als eine rauere Oberfläche. Die Stärke des Lichtabfalls wird durch den Spiegelungsterm gesteuert, der die Potenz ist, mit der der Kosinus zwischen dem Halbvektor und dem Normalenvektor genommen wird, so dass glattere Oberflächen eine höhere Potenz haben.

Wir nennen ihn den Halbvektor (H), weil er auf halbem Weg zwischen dem Vektor, der zum Licht zeigt (Lichtvektor, L), und dem Vektor, der zum Betrachter zeigt (Augenposition (0,0,0) minus Scheitelpunktposition im Augenraum; Sichtvektor, V), liegt. Bevor Sie H berechnen, vergewissern Sie sich, dass der Vektor zum Licht und der zum Auge im gleichen Koordinatenraum liegen (das alte OpenGL verwendet den Augenraum).

H = normalize( L + V )

Sie haben die richtige Berechnung durchgeführt, aber Ihre Variablen könnten angemessener benannt werden. Der Begriff light_position ist hier nicht ganz korrekt, da es sich bei dem von Ihnen zitierten Tutorial um das Tutorial für gerichtete Lichter handelt, die per Definition keine Position haben. Der Lichtvektor für gerichtete Lichter ist unabhängig vom Scheitelpunkt, also haben Sie hier ein paar Gleichungen kombiniert. Denken Sie daran, dass der Lichtvektor in Richtung des Lichts verläuft, also entgegengesetzt zum Photonenfluss des Lichts.

// i'm keeping your term here... I'm assuming
// you wanted to simulate a light coming from that position
// using a directional light, so the light direction would
// be -light_position, making
// L = -(-light_position) = light_position
vec3 L = light_position;
     // For a point light, you would need the direction from
     // the point to the light, so instead it would be
     // light_position - outVertex
vec3 V = -out_Vertex;
     // really it is (eye - vertexPosition), so (0,0,0) - out_Vertex
vec3 H = normalize(L + V);

5voto

Daniel Punkte 3621

Im Fragment-Shader können die Vertex-Koordinaten als ein Vektor betrachtet werden, der von der Kamera (oder dem "Auge" des Betrachters) zum aktuellen Fragment führt. Wenn man die Richtung dieses Vektors umkehrt, erhält man den gesuchten "Eye"-Vektor. Bei der Berechnung des Halbvektors muss man sich auch der Richtung des Lichtpositionsvektors bewusst sein, auf der von Ihnen verlinkten Webseite zeigt dieser in Richtung der Oberfläche, auf http://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_shading_model Sie zeigt von der Oberfläche weg.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X