openGL Belichtung
-
Hallo,
ich hätte 2 Fragen zur Belichtung in openGL:
-
In meinem Programm habe ich ein Positionslicht (Sonne), welches um das Objekt (die Erde) kreist und quasi einen Tag/Nacht-Zyklus simulieren soll. Leider scheint mein Licht durch die Erde durch, so dass es immer auf der ganzen Erdkugel hell ist und die Sonne scheint :p . Gibt es ein openGL-Kommando, um zu verhindern, dass Licht durch das Objekt durchgeht?
-
Meine zweite Lichtquelle ist "direktional" und ist quasi unendlich weit von der Erde entfernt. Mittels glNormal3f() habe ich jedem Knoten eine Normale zugeordnet. Diese Normalen würde ich gerne als "kleine Linien" zeichnen. Dabei soll jedem Knoten der Mittelwert seiner zugehörigen "Flächen-Normalen" zugeordnet werden. Hat jemand eine schlaue Idee, wie man dies bewerkstelligen könnte?
Falls ich mich zu undeutlich ausgedrückt haben sollte, einfach nachfragen. Danke!
MfG Siegfried
-
-
- nochmal die Grundlagen durchlesen.
- Zeichne eine Linie von der Eckpunktposition nach Eckpunktposition+Normale.
-
Den Mittelwert von mehreren Normalen könntest du bilden indem du die Summe der Normalen normalisierst.
-
Danke!
Die Grundlagen habe ich mir durchgelesen und mir ist auch klar, dass sich dies mit entsprechendem Kommando
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
einstellen lässt (was aber nach default sowieso so eingestellt ist...). Trotzdem wird bei mir ALLES beleuchtet und ich sehe gerade einfach nicht den Grund dafür.
Meine Belichtungs-Klasse sieht folgendermaßen aus:
#include "OrbitLight.h" OrbitLight::OrbitLight( GLint id, PhongColour *colours, float *position ) { this->id = id; for ( int i=0; i<4; i++ ) { this->clr.amb[i] = colours->amb[i]; this->clr.dif[i] = colours->dif[i]; this->clr.spec[i] = colours->spec[i]; this->pos[i] = position[i]; } angle = 0.0; glLightfv( id, GL_AMBIENT, clr.amb ); glLightfv( id, GL_DIFFUSE, clr.dif ); glLightfv( id, GL_SPECULAR, clr.spec ); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); } void OrbitLight::enable() { glEnable( id ); } void OrbitLight::disable() { glDisable( id ); } void OrbitLight::setPosition() { glPushMatrix(); glRotatef( angle, 0.0, 0.0, 1.0 ); glLightfv( id, GL_POSITION, pos ); glPopMatrix(); } // Update the position of the light if necessary void OrbitLight::update( InputState input ) { angle += 1.0; } void OrbitLight::render() { GLfloat noEmission[] = { 0.0, 0.0, 0.0, 1.0 }; glPushMatrix(); glRotatef( angle, 0.0, 0.0, 1.0 ); glTranslatef( pos[0], pos[1], pos[2] ); glColor3f( 1.0, 0.0, 0.0 ); glutSolidSphere( 0.2, 8, 8 ); glMaterialfv( GL_FRONT, GL_EMISSION, noEmission ); glPopMatrix(); }
//Orbit lighting static PhongColour clr1 = { {1.0, 1.0, 1.0, 1.0}, // ambient {0.2, 0.2, 0.2, 0.2}, // diffuse {1.0, 1.0, 1.0, 1.0} // specular };
-
Weiss ist vielleicht ein bischen hell als Ambientfarbe.
-
Ja, aber damit habe ich schon herumgespielt. Mit
//Orbit lighting static PhongColour clr1 = { {0.1, 0.1, 0.1, 0.1}, // ambient {0.2, 0.2, 0.2, 0.2}, // diffuse {1.0, 1.0, 1.0, 1.0} // specular };
siehts genauso aus.
-
Sicher, dass Beleuchtung beim Render-Aufruf auch aktiviert ist?
Und wo/wie setzt du die Position deines Lichtes?
-
Setzt du beim Zeichnen der Kugel (Erde) auch Normale, damit Voder- und Rückseite der Polygone unterschieden werden können?