Registriert: Mi Jun 12, 2013 08:46 Beiträge: 4
Programmiersprache: c++
Hallo zusammen,
ich verzweifle gerade an der OpenGL-Beleuchtung. 2 Fragen drängen sich auf. Ich beschreibe zunächst was ich mache (bzw. was ich glaube zu machen), dann die beiden Fragen, am Ende poste ich den Code:
Ich initialisiere OpenGL, definiere eine gelb leuchtende Lampe bei (0, 0, 1) des Koordinatensystem (also bei 1 auf der Z-Achse). Dann erstelle ich eine weiße Ebene bei z=0, der Richtungsvektor zeigt in positive Z-Richtung.
Lampe und Fläche sind mit der GL_MODELVIEW-Matrix eingegeben, müßten sich nach meinem Verständnis also drehen, wenn ich die Szene drehe - das heißt also, Lampe und Fläche sind fix in der Szene. Die Szene kann ich beliebig mit der Maus drehen (GluLookAt()..., das funktioniert problemlos.
Frage 1: ====== zunächst ist die Zeile glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 15.); auskommentiert, ich habe eine Punkt-Lichtquelle.
Ich erwarte eine Ebene die vorne gelb angestrahlt ist, und deren Rückseite dunkel ist. Ich sehe jedoch eine vorne und hinten gelbe Fläche. Müßte die Rückseite nicht Dunkel sein?
Frage 2: ===== die Zeile glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 15.); wird aktiviert.
Der Defaultwert für die Lichtrichtung ist ja laut OpenGL-Dokumentation (0, 0, -1), also entlang der negativen Z-Achse.
Ich erwarte einen gelben Spot-Kreis im Zentrum der Ebene, unabhängig von der Drehung der Szene (die Objekte drehen sich ja mit). Ich erhalte jedoch einen Spotkreis mal links oben auf der Fläche, mal rechts oben etc, je nachdem wie die Szene gedreht ist. zudem verschwindet der gelbe Spotfleck plötzlich, das heißt ich sehe ihn z.B. links oben auf der Fläche, und wenn ich die Szene nur ganz wenig weiter drehe, ist die Fläche schlagartig dunkel.
Vielen Dank für eure Hilfe....
Hier der Code, reduziert auf die benutzen OpenGL-Befehle:
///////////////// // set the camera ///////////////// const Vector3D &v3dEye = m_pCamera->GetEyePoint(); const Vector3D &v3dView = m_pCamera->GetViewPoint();
glMatrixMode (GL_PROJECTION); glLoadIdentity();
// Prevent a divide by zero, when window is too short // (you cant make a window of zero width). s32 s32H = Max<s32>(1, m_rctVp.h); float fRatio = ((flt) m_rctVp.w) / ((flt) s32H);
// Set the correct perspective. gluPerspective(45, fRatio, 0.1, 1000);
// gluLookAt on modelview stack glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(v3dEye.x, v3dEye.y, v3dEye.z, // eye position v3dView.x, v3dView.y, v3dView.z, // look at position 0.0f, 1.0f, 0.0f); // up-vector
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Zu Frage 2 gilt auf jeden Fall, dass OpenGL nur per-Vertex beleuchtet. Für einen echten Kreis müsstest du entweder Shader verwenden oder die Ebene in mehr vertices unterteilen.
Wegen der Lichtrichtung: Die musst du dann glaube ich explizit setzen, wenn du die Modelview-Matrix gesetzt hat. Sonst ist die Z-Richtung nicht die, die du erwartest. Die anderen Artefakte bei der Drehung könnten wegen des per-Vertex-Lightings entstehen.
Zu Frage 1: Da bin ich etwas ratlos… Irgendwo kann man glaube ich bestimmen, wie front/backfaces beleuchtet werden.
grüße
ps.: Warum die glPushMatrix()/glPopMatrix()-Aufrufe um glLight und glMaterial herum?
_________________ 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
Registriert: Mi Nov 30, 2011 21:41 Beiträge: 136 Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Du zeichnest ja nur eine Fläche, auch wenn sie von der Rückseite gezeichnet wird, wird deine definierte Normale zur Berechnung herangezogen.
Also müsstest du 2 Quads rendern, das zweite dann mit der invertierten Normale und vielliecht um 0.1 nach hinter verschoben, oder du aktivierst Culling und passt auf, das dass dann richtig herum gezeichnet wird.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
OpenGL weiß definitiv, ob es sich um die vorder- oder rückseite handelt. Weiß aber nicht so recht, ob und wie man das bei Licht berücksichtigen kann.
grüße.
_________________ 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
Registriert: Mi Jun 12, 2013 08:46 Beiträge: 4
Programmiersprache: c++
Hier im Forum wird einem ja echt geholfen! Vielen Dank für die Hilfe!
Ich habe nun die Fläche unterteilt, und habe jetzt einen vernünftigen Spot!
Aber entstehen neue Fragen:
Frage 3: Ich verstehe nicht, warum ich die Rictung des Lichtes explizit angeben muß
Lord Horazont hat geschrieben:
ps.: Warum die glPushMatrix()/glPopMatrix()-Aufrufe um glLight und glMaterial herum?
Frage 5: glLight: Ich setzt doch die Lichtposition. Muß ich das nicht mit Push/Pop umschließen, da die ja mit der gluLookAt mit verschoben werden soll
Frage 6: glMaterial: Der Code ist auf die OpenGL-AUfrufe reduziert. Im vollständigen Code werden die einzelnen unterschiedlich Objekte transformiert (unterschiedlich verschoben, rotiert und skaliert. Daher bekommt jedes Objekt ein eigenes Push/Pop mit. Ist das falsch oder nicht optimal
Registriert: Mi Nov 30, 2011 21:41 Beiträge: 136 Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Push und Pop befehle brauchst du nur wenn du auch explizit die Matrix veränderst mit glTranslate/glRotate/glScale usw. Es bekommt zwar jedes Obekt normalerweise einen eigenen Push/Pop aber nur wenn das Objekt überhaupt verschoben/gedreht usw wird, was du ja mit den genannten Befehlen erreichst.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
PoetikBiker hat geschrieben:
Lampe und Fläche sind mit der GL_MODELVIEW-Matrix eingegeben, müßten sich nach meinem Verständnis also drehen, wenn ich die Szene drehe - das heißt also, Lampe und Fläche sind fix in der Szene.
Eben damit das gilt, musst du auch die Lichtrichtung unter einfluss der korrekten GL_MODELVIEW-Matrix angeben. Die beeinflusst ja auch die richtung der Achsen. Wenn die Standardrichtung negativ-Z ist, dann ist das das negativ-Z mit der Identitätsmatrix. Wenn du deine Szene drehst, aber die Lichtrichtung nicht setzt, dann „dreht“ sich das Licht relativ zur Szene.
grüße
_________________ 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
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.