Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 21:26

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [gelöst] Probleme mit Licht
BeitragVerfasst: Mi Dez 24, 2008 11:17 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Hallo,

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 :shock:

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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 24, 2008 11:47 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 24, 2008 12:21 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Leider noch nicht ganz klar :(

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 :shock:, 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 13:16 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Ich hab jetzt gelesen, dass man Normalen für jedes Objekt definieren muss, z.B. mit glNormal3f();

Stimmt das? Und was sind denn jetzt Normalen genau, hab ich leider noch nicht ganz verstanden

Danke für Erlärungen schon mal im Vorraus
glmatt

P.S.: Ja ich weiß, dass Anfängerfragen immer nervig sind, aber ohne Einsteiger keine Profis :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 13:25 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Und da kommt unser Wiki wieder ins Spiel: Normale

Quasi gibt die an, in welche Richtung die Fläche "guckt".

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 13:58 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Danke für die Hilfe!

Den Eintrag im Wiki hatte ich wohl übersehen, da findet man ja immer wieder sehr interessante Sachen... :)

Die Berechnung der Normalen ist ziemlich kompliziert :shock: , 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 :D

Also, vielen Dank für die Hilfe! (Ich werd's gleich mal ausprobieren, wird dann wahrscheinlich funktionieren 8) )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 16:07 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
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 ? :wink:

Dann habe ich auch noch eine Frage zu Normalen:
Wenn ich die Funktionen gluSphere, gluDisk etc. benutze, die einem ja viel Arbeit abnehmen :wink: 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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 16:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Moin,

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.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 17:01 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Das Problem, dass bei weit entfernten Objekten alles schwarz war, lag nicht am Licht!
Ich hatte nur bei gluPerspective einen zu geringen Wert angegeben :D

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 :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 25, 2008 20:18 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du die Farbe bei Licht sehen willst must du glEnable(GL_COLOR_MATERIAL) setzen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 26, 2008 00:01 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Danke, jetzt klappt endlich alles (auch mit den Farben)!
glEnable(GL_LIGHTING) und mir ging ein Licht auf :D

Jetzt habe ich auch endlich meine eigene richtige Glühbirne im PC :idea:

Und das beste daran ist: Mit OpenGL braucht Licht gar nicht mehr so viel Strom, das ist doch sehr Umweltfreundlich und vermindert den CO2-Ausstoß 8)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]