ich habe mal wieder eine Frage, dieses mal zum Thema Licht.
Ich habe ein kleines Programm geschrieben (eine Art 3D Labyrinth) und wollte jetzt, damit es einfach besser aussieht, noch Licht hinzufügen. Und zwar Licht, das in der Entfernung abnimmt.
In dem Tutorial zum Thema Licht habe ich dann gelesen, dass ich diffuses Licht brauche. Außerdem soll es, wie im Tutorial beschrieben, am "Kopf" befestigt sein.
Da ich in C/C++ und Qt (Linux) programmiere, beschreibe ich den Code am besten einfach mal:
Ich habe ein Array zur Position (0,0,0,1) und eines zur Farbe (1,1,1,1), also weiß definiert.
Bei der Initialisiserung schalte ich dann Licht ein:
glEnable(GL_LIGHTNG), bestimme den Typ mit
glLightfv(GL_LIGHT0,GL_DIFFUSE,Pointer_zu_diffuse_array) und die Position mit glLightfv(GL_LIGHT0,GL_POSITION,Pointer_zu_position_array).
Um mehr habe ich mich nicht gekümmert, da ich dachte das würde genügen.
Mit Materialeigenschaften kenne ich mich noch nicht aus, aber auch das Hinuzufügen hat nichts an folgendem Problem geändert:
Sobald ich (bzw. die Welt) sich gedreht hat, war nicht vorne hell und weiter weg dunkel, sondern auf einer Seite hell und zur anderen Seite hin wurde es dunkel
Muss ich das Licht in meine Render-Funktion schreiben?
In dem Programm habe ich statt Licht einfach Nebel benutzt, sieht auch sehr gut aus, aber ich würde gerne für weitere Programme wissen, wie ich es richtig mache.
Außerdem habe ich die Normalen nicht ganz verstanden (braucht man die auch ???). Sind das einfach Senkrechte auf der Oberfläche von den Objekten?
Ich würde mich sehr über (einfache) Erklärungen freuen,
glmatt
Zuletzt geändert von glmatt am Fr Dez 26, 2008 12:34, insgesamt 1-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich vermute mal, dass dein Problem darin lag, dass das OpenGL Licht standardmäßig nur "Pro Vertex" berechnet wird. Das heißt, es tut im prinzip nichts weiter, als den Farbwert eines Vertex zu ändern. Wenn deine Szene also nur aus wenig Vertices besteht, hast du auch sehr schlecht aufgelöstes licht und dann kann das schonmal sehr komisch aussehen.
Die Normalen sind wichtig ja. Denn sie sagen OpenGL, in welche Richtung die Fläche eigentlich zeigt. Und um das Licht zu berechnen, muss OpenGL den Winkel zwischen Lichtquelle, Fläche und Betrachter kennen.
Klar soweit?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Erstens: Was sind denn jetzt Normalen genau? Muss ich die setzen, damit Licht funktioniert?
Leider sieht mein Licht nicht nur komisch aus!
Sondern wenn ich mich drehe, behält es seine Richtung, ein Beispiel:
Startposition und -richtung: Licht nimmt mit Entfernung ab.
Drehung nach links, 90° (Welt dreht sich nach rechts): Das Licht ist rechts hell, links aber dunkel.
Weitere Linksdrehung (insg. 180°): Alles ist dunkel (vermutlich hinter mir hell).
Die Welt dreht sich zwar, das Licht aber auch , sodass man immer dasselbe sieht, würde das Licht sich nicht mit drehen, würde es ja immer mit der Entfernung von der Position (0,0,0) abnehmen
Liegt wahrscheinlich daran, dass ich mein Licht schon bei der Initialisierung definiere und in der Renderfunktion das Licht nicht weiter beachte. Kann es sein, dass ich es eben in der Renderfunktion bestimmen muss?
Ansonsten ist das Licht ja nicht so schwer zu verstehen, nur mit der Drehung klappt's eben nicht
Den Eintrag im Wiki hatte ich wohl übersehen, da findet man ja immer wieder sehr interessante Sachen...
Die Berechnung der Normalen ist ziemlich kompliziert , aber für den Anfang benutze ich sowiso erstmal nur einfache, flache Quads (höchstens mal um 90° gedreht), da kann man sich ja noch denken, wie die Normalen verlaufen.
Und die Länge muss man ja auch nicht angeben
Also, vielen Dank für die Hilfe! (Ich werd's gleich mal ausprobieren, wird dann wahrscheinlich funktionieren )
Das mit den Normalen habe ich jetzt (bis auf die genaue mathematische Berechnung) verstandern, aber die braucht man ja bei einfachen Objekten nicht immer. Nur würde ich gerne wissen, ob man glEnable(GL_NORMALIZE); auch noch benötigt.
Allerdings ist mir aufgefallen, dass auch bei Ambientem Licht (1,1,1,1) nicht alles hell ist (was ich ertwartet hatte):
In einiger Entfernung ist alles schwarz, bis es dann auf einmal (bei 1 Einheit mehr) hell erleuchtet ist. Woran liegt das? Gibt es einen Wert, bis zu dem das Licht maximal reicht, so ähnlich wie bei Nebel?
Oder hab ich da mal wieder einen Fehler gemacht ?
Dann habe ich auch noch eine Frage zu Normalen:
Wenn ich die Funktionen gluSphere, gluDisk etc. benutze, die einem ja viel Arbeit abnehmen Gibt es da auch einen Weg, die Normalen berechnen zu lassen? Oder muss man Kugeln, Scheiben, Zylinder u.s.w immer selber rendern, wenn man Normalen, also Licht, benutzen will?
EDIT:
Nur zur Information, falls das was ausmacht, ich habe noch keine Materialeigenschaften benutzt, dann müsste OpenGL ja die Standard Eigenschaften nehmen, oder?
GL_NORMALIZE bewirkt, dass alle von dir gesetzten Normalen auf die Länge 1 gebracht werden (kostet natürlich Rechenleistung). Wenn du das also selbst machst, kannst du es auslassen.
gluDisk sollte die Normalen selbst setzen.
Das Problem, dass bei weit entfernten Objekten alles schwarz war, lag nicht am Licht!
Ich hatte nur bei gluPerspective einen zu geringen Wert angegeben
Zu den gluDisk etc. Funktionen:
Habe einen grünen Zylinder gezeichnet, der hatte ohne Licht auch Farbe, mit Ambient Licht 1,1,1,1 war er aber nur grau!
(fehlende Materialeigenschaften ???)
Alle anderen Probleme habe ich jetzt dank diesem Forum und den Erklärungen gelöst
Mitglieder in diesem Forum: 0 Mitglieder und 14 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.