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

Aktuelle Zeit: Do Mai 16, 2024 01:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 09:43 
Offline
DGL Member

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:
Zitat:
void Viewport::OnPaint3D()
{
/////////////////
// initial stuff
/////////////////
glEnable(GL_DEPTH_TEST); // Enable Depth Testing
glEnable(GL_SCISSOR_TEST); // Enables Scissor Testing
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_COLOR_MATERIAL);

// set the viewport dimension
glViewport(m_rctVp.x, m_rctVp.y, m_rctVp.w, m_rctVp.h);
glScissor(m_rctVp.x, m_rctVp.y, m_rctVp.w, m_rctVp.h);

// clear the background
glClearColor(m_rgbBg.r, m_rgbBg.g, m_rgbBg.b, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_LIGHTING);


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


/////////////////
// set the light
/////////////////
GLfloat arPos[] = {0, 0, 1, 1};
GLfloat arCol[] = {1, 1, 0, 1};
GLfloat arAmbient[] = {0.2, 0.2, 0.2, 1};

glEnable(GL_LIGHT0);

glPushMatrix();
glLightfv(GL_LIGHT0, GL_POSITION, arPos);
glLightfv(GL_LIGHT0, GL_AMBIENT, arAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, arCol);
//glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 15.); // Frage 2 !!!
glPopMatrix();


////////////////
// set the plane
////////////////
GLfloat arColor[] = {1, 1, 1, 1};
GLfloat ar000[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat arNormal[] = {0, 0, 1};

glPushMatrix();
glMaterialfv(GL_FRONT, GL_AMBIENT, arColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, arColor);
glMaterialfv(GL_FRONT, GL_SPECULAR, ar000);
glMaterialfv(GL_FRONT, GL_EMISSION, ar000);

glBegin(GL_QUADS);
glNormal3fv(arNormal);
glVertex3d(-1, -1, -0);
glVertex3d(+1, -1, -0);
glVertex3d(+1, +1, -0);
glVertex3d(-1, +1, -0);
glEnd();
glPopMatrix();
} // Viewport::OnPaint3D



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 09:53 
Offline
DGL Member
Benutzeravatar

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 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: Re: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 10:00 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 10:05 
Offline
DGL Member
Benutzeravatar

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 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: Re: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 11:19 
Offline
DGL Member

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

Wieder einmal "Danke im vorraus"!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 11:47 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtungsfragen
BeitragVerfasst: Mi Jun 12, 2013 13:31 
Offline
DGL Member
Benutzeravatar

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 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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

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