Cecidi
Mitglied
Hi,
ich hab da ein interessantes Problem mit OpenGl:
Wenn ich paralleles (direktionales) Licht auf eine Fläche mit senkrechtem Normalenvektor scheinen lasse, "flackert" das Licht, wenn man die Kamera etwas dreht.
Das ist sehr schwer zu beschreiben, aber ich habe hier mal ne Renderfunktion zusammengestellt wo man das Problem sieht (wenn man es ausführt).
Der Codeschnipsel stammt aus einem Linux GLUT-Projekt (abgewandelte Version von NEHE-Lesson5).
Auf das Problem gestoßen bin ich aber mit Qt unter Windows.
Es sollte also egal sein wo man das ganze ausführt. (auch in einer anderen OpenGl Renderfunktion sollte es (nicht) gehen)
Auf jeden Fall sollte es nicht flackern.
mfg Cecidi
ich hab da ein interessantes Problem mit OpenGl:
Wenn ich paralleles (direktionales) Licht auf eine Fläche mit senkrechtem Normalenvektor scheinen lasse, "flackert" das Licht, wenn man die Kamera etwas dreht.
Das ist sehr schwer zu beschreiben, aber ich habe hier mal ne Renderfunktion zusammengestellt wo man das Problem sieht (wenn man es ausführt).
Code:
void renderCube()
{
float normal[3];
glBegin(GL_QUADS);
normal[0]=0.0f; normal[1]=1.0f; normal[2]=0.0f;
glNormal3fv( normal );
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, -1.0f); // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, -1.0f); // Bottom Right Of The Quad (Top)
normal[0]=0.0f; normal[1]=-1.0f; normal[2]=0.0f;
glNormal3fv( normal );
glVertex3f( 1.0f, -1.0f, -1.0f); // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f, -1.0f, -1.0f); // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Bottom)
normal[0]=0.0f; normal[1]=0.0f; normal[2]=-1.0f;
glNormal3fv( normal );
glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Front)
glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Front)
normal[0]=0.0f; normal[1]=0.0f; normal[2]=1.0f;
glNormal3fv( normal );
glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Back)
glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Back)
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Back)
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Back)
normal[0]=-1.0f; normal[1]=0.0f; normal[2]=0.0f;
glNormal3fv( normal );
glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Left)
glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Left)
normal[0]=1.0f; normal[1]=0.0f; normal[2]=0.0f;
glNormal3fv( normal );
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Right)
glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Right)
glEnd(); // Done Drawing The Quad
}
//--------------------------------------------------------------------
void DrawGLScene()
{
static float rquad = 0.0f;
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
//Lösche Bildschirm
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity(); // Reset The View
//Setze Standartwerte für das Licht (Lichtreflexe(specular) = Rot)
//Diffuses Licht aus
//Ambientes Licht auf dunkel grau
//Specular Licht auf rot (grau + rot = rosa)
const float specular[4] = {1.0f,0.0f,0.0f,1.0f};
const float ambient[4] = {0.5f,0.5f,0.5f,1.0f};
const float diffuse[4] = {0.0f,0.0f,0.0f,1.0f};
const float emission[4] = {0.0f,0.0f,0.0f,1.0f};
//Übernehme Lichtwerte
glMaterialfv( GL_FRONT, GL_SPECULAR, specular );
glMaterialfv( GL_FRONT, GL_AMBIENT, ambient );
glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse );
glMaterialfv( GL_FRONT, GL_EMISSION, emission );
glMaterialf( GL_FRONT, GL_SHININESS, 0.0f );
//Verschibe nach hinten links
glTranslated(-2.0f, 0.0f, -5.0f);
//drehe um y-achse
glRotatef(rquad,0.0f,1.0f,0.0f); // Rotate The Cube On Y
//Setze Lichtquelle
const float direction[4] = {0.0f, 0.0f, 1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, direction);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
renderCube();
rquad+=0.5f; // Decrease The Rotation Variable For The Cube
usleep(50000); //Zeitverzögerung um 50Millisekunden
// swap the buffers to display, since double buffering is used.
glutSwapBuffers();
}
Auf das Problem gestoßen bin ich aber mit Qt unter Windows.
Es sollte also egal sein wo man das ganze ausführt. (auch in einer anderen OpenGl Renderfunktion sollte es (nicht) gehen)
Auf jeden Fall sollte es nicht flackern.
mfg Cecidi