Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.10.2015, 13:36

OpenGL: kein Licht in meiner Szene

Hi,


vermutlich habe ich nur was saublödes vergessen...mein Problem: die Objekte in meiner Szene sind alle schwarz, sie reflektieren kein Licht. Das habe ich bisher:

C-/C++-Quelltext

1
2
3
4
5
6
// Licht aktivieren und eine Lichtquelle setzen
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

GLfloat lightpos[] = {.5, 1., 1., 0.};
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// vor dem Zeichnen der Quads/Faces: Material zuweisen

GLfloat mat_specular[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { 1.0, 0.0, 0.0, 0.0 };
GLfloat diffuse[] = {1.0f, .0f, .0f, 1.f};
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glColor3f(1.0f,0.0f,0.0f);


Das sollte jetzt ja eigentlich irgend was rotes ergeben, allerdings sind die Elemente immer noch komplett schwarz:

C-/C++-Quelltext

1
2
3
4
5
6
7
glBegin(GL_QUADS);
 glNormal3f( 0.0f, 1.0f, 0.0f);
 glVertex3f(-0.5f,-0.5f,-0.5f);
 glVertex3f(-0.5f, 0.5f,-0.5f);
 glVertex3f( 0.5f, 0.5f,-0.5f);
 glVertex3f( 0.5f,-0.5f,-0.5f);
glEnd();


Was fehlt hier?

(Ich weiß, kein glBegin()/glEnd(), das fliegt auch noch raus)

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

06.10.2015, 15:51

Auf Anhieb sieht die Normale merkwürdig aus. Zum einen steht sie normalerweise senkrecht zur Fläche, was bei deinem Dreieck auf der XY-Ebene die Z-Richtung bedeuten würde. Zum Anderen bestimmt sich die Stärke der diffusen Reflexion aus dem Winkel zwischen Lichtstrahl und der Normalen. Umso größer der Winkel, umso flacher/schwächer der Lichteinfall. Zwischen Lichtstrahl auf XZ-Ebene und Y-Achse als Normale hast du ein 90 Grad Winkel, was gar kein Licht entspricht, da du das Objekt von der Seite anstrahlst.


(Ich weiß, kein glBegin()/glEnd(), das fliegt auch noch raus)

Hier wird es sogar noch schlimmer, weil du zudem fixed function pipeline drin hast ;)

Das ganze lighting und material Zeug ist alles veraltet und wird seit langem über Shader deutlich schneller und flexibler erledigt.

3

07.10.2015, 07:25

Das ganze lighting und material Zeug ist alles veraltet und wird seit langem über Shader deutlich schneller und flexibler erledigt.


Arrrgh...danke für den Hinweis. Irgendwie sind scheinbar 90% aller Treffer veraltet, die Google auf OpenGL Suchanfragen ausspuckt :-(

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

07.10.2015, 07:50

Das ganze lighting und material Zeug ist alles veraltet und wird seit langem über Shader deutlich schneller und flexibler erledigt.

Arrrgh...danke für den Hinweis. Irgendwie sind scheinbar 90% aller Treffer veraltet, die Google auf OpenGL Suchanfragen ausspuckt :-(

Ja, das ist ein ziemliches Problem, weshalb das Thema auch immer wieder aufkommt. Legacy OpenGL gibt es halt schon länger und alte Artikel und Tutorials verschwinden nicht einfach, nur weil sie veraltet sind. Unter https://www.opengl.org/wiki/Legacy_OpenGL gibt es eine recht kompakte Auflistung was alles als veraltet gewertet wird. Die einzige Ausnahme die du da wohl machen musst, ist GLSL 1.2, weil du bei OpenGL 2.1 nur bis max GLSL 1.2 nutzen kannst.

Werbeanzeige