ich habe es schon mit vielen Shadern - Programmen versucht, korrekte Lichtberechnungen durchzuführen. Jedoch ohne Erfolgt . Immer wenn ich meine Kamera drehe/bewege sind die Lichteffekt verschoben oder schon garnicht mehr zu sehen. Ich verwende momentan folgende Shader:
Wie setzt du den die Position der Lichtquelle? Die Lichtquelle muss in den View-Space transformiert werden, da deine Normale ja durch gl_NormalMatrix ebenfalls dahin geschoben wird.
Am besten setzt du den Lichtvektor nachdem du die Kamera mit gluLookAt gesetzt hast, dann sollte OpenGL sie automatisch richtig transformieren.
gl_LightSource[0].halfVector hab ich noch nie benutzt, sicher das der richtig ist? Du kannst den auch via reflect(lightvec, normal) berechnen. lightvec muss dabei vom Fragment zum Licht zeigen.
Diese Funktion wird als allerstes bei jedem Rendervorgang ausgeführt. Das Licht wird ohne Shader auch fehlerfrei angezeigt, egal wie meine Kameraposition/rotation ist.
Wie man sieht ist das Licht rundlich abgehackt :/. Wenn ich meine Kamera weiter weg vom Licht bewege ist mehr vom Licht zu sehen (Radius ist groeßer). Wie beim Shader beschrieben habe ich auch das Licht mit glDisable(GL_LIGHTING) vor dem Aufruf dess Shaders deaktiviert.
Scheinbar muss ich wohl die Lichtquellenposition im Shader mit einer Matrix multiplizieren. Aber wie und mit welcher?
normal = normalize(gl_NormalMatrix * gl_Normal); v = vec3(gl_ModelViewMatrix * gl_Vertex);
// ##### G E Ä N D E R T ##### vec3 lightPos = gl_NormalMatrix * gl_LightSource[0].position.xyz; lightvec = normalize(lightPos.xyz - v); // #######################
Soll das so aussehen? Sorry, ich bin noch ziemlich neu in der Shader - Programmierung. Will einfach nur das das mit der Lichtposition richtig hinhaut, denn ohne Licht kann man nicht gerade die besten Shadereffekte erzielen .
Also leider klappts immer noch nicht. Hab das OpenGL - Licht auch aktiviert, aber jetzt verfolgt mich das Licht.... Also es is so, dass das Licht zwar abgeschwächt wird je weiter man sich von der Lichtquellenposition entfernt, aber das Licht ist nur in einem bestimmten Radius um die Kameraposition sichtbar, und der Licht - Radius wird immer groeßer, je weiter ich mich von der Lichtposition entferne. Hoffe du verstehst, was ich meine .
// ### H I E R ### vec4 ISpecular = gl_LightSource[0].specular * pow(dot(Reflected, Eye), gl_FrontMaterial.shininess) * gl_FrontMaterial.specular; // ############
Wenn ich statts der pow(...) - Funktion z.B. den Wert "1" eintrage, klappt alles wunderbar (Licht wird korrekt dargestellt, auch wenn ich glDisable(GL_LIGHTING); verwende). Eigentlich ist das dann aber nicht korrekt, weil der Specular - Wert immer der selbe ist. Komischerweise sieht man da aber keinen Unterschied ob Specular jetzt 0 oder nen Maximalwert hat...
Also es is so, dass das Licht zwar abgeschwächt wird je weiter man sich von der Lichtquellenposition entfernt, aber das Licht ist nur in einem bestimmten Radius um die Kameraposition sichtbar, und der Licht - Radius wird immer groeßer, je weiter ich mich von der Lichtposition entferne. Hoffe du verstehst, was ich meine .
Da dürfte dein Problem liegen. Der Shader ist für eine direktionale Lichtquelle, offensichtlich gibst du ihm aber eine Position wie für eine Punktlichtquelle
Im Fall einer Punktlichtquelle musst du den Vektor von der Fragmentposition zur Lichtquelle berechnen.
Zitat:
Jetzt is es aber ganz klar wo der Fehler liegt:
Ja, siehe oben. Aus "-lightvec" muss dann ggf. auch einfach "lightvec" werden....wie gesagt bei mir ist lightvec die Richtung in die die direktionale Lichtquelle scheint.
Thx, aber das hab ich ja gehabt, aber ich brauch ja den Richtungswinkel, weil ich kein Directionslicht sondern ein Punktlich habe.
Ups...hab ich irgendwie nicht gesehen. Jedenfalls damit das korrekt ist musst du den Lichtvektor im Fragmentshader berechnen, sonst könnte es Helligkeitsschwankungen geben, weil die Länge des Lichtvektors variiert. Auch könnte es Probleme bei der Interpolation geben wenn die Lichtquelle sehr nahe an deinem Dreieck bzw. das Dreieck sehr groß ist. Diese ganzen Effekte treten nur auf, wenn du Vektoren interpolierst => darum die Position interpolieren.
Wenn du den Lichtvektor einmal hast berechnet sich der Richtungswinkel (*) beim Punktlicht genauso wie beim Direktionslicht, also dot-Produkt.
(*) Streng genommen berechnest du hier nicht den Winkel sondern nur den Kosinus desselben.
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.