PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL: Spotlight



RoCMe
14-03-2006, 19:50
Hey!
Ich schlag mich zur Zeit durch das Redbook. Mein erstes Problem hab ich jetzt bei der Beleuchtung: Ich habe das Beispiel von dort (eine beleuchtete Kugel) abgeändert. Die Kugel ist inzwischen ein einfaches Quadrat, das von einem Spotlight beleuchtet werden soll! Das Problem: Man sieht nicht, das es ein Spot Light ist :-( Egal, wie groß das Quadrat ist, es wird anscheinend immer ganz beleuchtet... Warum??? Was mache ich falsch?
Hier mal mein Code (-Ausschnitt):


void init(void) {
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 0.0 }; //Material
GLfloat mat_shininess[] = { 100.0 };
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
GLfloat light_position[] = { 0.0, 0.0, 0.5, 0.0 }; //Licht
GLfloat spot_direction[] = {0.0, 0.0, -1.0, 0.0};
GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse[] = { 0.0, 0.0, 1.0, 1.0 };
GLfloat light_specular[] = { 0.0, 0.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 10.0);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0);
glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void) {
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0, 0.0, -0.1);
glRotatef(angle, 0.0, 1.0, 0.0);
glScalef(2.0, 2.0, 2.0);
glBegin(GL_QUADS);
glVertex3f( -1.0, -1.0, 0.0);
glVertex3f( 1.0, -1.0, 0.0);
glVertex3f( 1.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, 0.0);
glEnd();
glFlush ();
}

Hoffe, ihr könnt mir helfen!!!
mfg RoCMe

tuxes_lair
16-03-2006, 23:19
Hi RoCMe!
Ein ähnliches Problem hatte ich auch. Bitte probiere mal folgendes..
Zeichne das Quadrat nicht als ein Quadrat mit GL_QUADS sondern (etwas mühsamer) aus z.B. 4*4*2 Dreiecken.
OpenGL berechnet die Beleuchtung pro Dreieck oder pro Vertex (das entscheidest du mit deinen Normalenvektoren). Wenn du jetzt ganz viele Dreiecke bzw. Vertexe hast, anstatt bloß 6 Vertexe für dein intern als zwei Dreiecke repräsentierte Viereck, müsste es schon anders aussehen.
der Kegel von dem Spotlight begrenzt dann, welche Vertexe im Lichtschein liegen, und welche nicht.
Mir fällt gerade auf, dass du keine Normalenvektoren mit malst. Du musst OpenGL mit den Normalenvektoren sagen, in welche Richtung die Dreieck-"Gesichter" gucken, damit die Beleuchtung funktioniert.
Grüsse,
Martin

Joghurt
17-03-2006, 13:07
OpenGL ist kein Renderer! Wie mein Vorposter schon gesagt hat, wird das Licht nur pro Fläche berechnet.