2013-03-18 3 views
5

Mein Programm unten muss einen Würfel in Rotation anzeigen, der mit einem einfachen Licht beleuchtet wird. Das Problem ist der Würfel blinkt. Wenn ich den Aufruf glEnable (GL_DEPTH_TEST) zurückziehe, blinkt der Würfel nicht, aber ich kann die Gesichter darin sehen (das ist normal, weil es keinen Tiefentest gibt). Dieser Aufruf ist jedoch unerlässlich. Also ich verstehe nicht, warum der Aufruf dieser Funktion nicht richtig funktioniert.Anzeige nicht korrekt mit glEnable (GL_DEPTH_TEST)

Hier ist mein Code:

#include <iostream> 
#include <SDL/SDL.h> 
#include <gl/glut.h> 

const static int WIDTH = 640; 
const static int HEIGHT = 480; 

GLfloat angle = 0.0f; 

static GLfloat position[4] = {0.0, 50.0, -50.0, 1.0}; 
static GLfloat diffuse[3] = {0.64, 0.64, 0.64}; 
static GLfloat specular[3] = {0.64, 0.64, 0.64}; 
static GLfloat emissive[3] = {0.0, 0.0, 1.0}; 

static GLfloat vertices[72] = 
{ 
    1.000000, -1.000000, -1.000000,  //V1 
    1.000000, -1.000000, 1.000000,  //V2 
    -1.000000, -1.000000, 1.000000,  //V3 
    -1.000000, -1.000000, -1.000000, //V4 

    1.000000, 1.000000, -0.999999,  //V5 
    -1.000000, 1.000000, -1.000000,  //V8 
    -1.000000, 1.000000, 1.000000,  //V7 
    0.999999, 1.000000, 1.000001,  //V6 

    1.000000, -1.000000, -1.000000,  //V1 
    1.000000, 1.000000, -0.999999,  //V5 
    0.999999, 1.000000, 1.000001,  //V6 
    1.000000, -1.000000, 1.000000,  //V2 

    1.000000, -1.000000, 1.000000,  //V2 
    0.999999, 1.000000, 1.000001,  //V6 
    -1.000000, 1.000000, 1.000000,  //V7 
    -1.000000, -1.000000, 1.000000,  //V3 

    -1.000000, -1.000000, 1.000000,  //V3 
    -1.000000, 1.000000, 1.000000,  //V7 
    -1.000000, 1.000000, -1.000000,  //V8 
    -1.000000, -1.000000, -1.000000, //V4 

    1.000000, 1.000000, -0.999999,  //V5 
    1.000000, -1.000000, -1.000000,  //V1 
    -1.000000, -1.000000, -1.000000, //V4 
    -1.000000, 1.000000, -1.000000  //V8 
}; 

static GLfloat normals[72] = 
{ 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 

    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 

    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 

    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 

    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 

    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000 
}; 

static void  eventListener(SDL_Event *pEvent, bool *pContinue) 
{ 
    while (SDL_PollEvent(pEvent)) 
    { 
     switch(pEvent->type) 
     { 
     case SDL_QUIT: 
      *pContinue = false; 
      break; 
     case SDL_KEYDOWN: 
      switch (pEvent->key.keysym.sym) 
      { 
      case SDLK_ESCAPE: 
       *pContinue = false; 
       break; 
      } 
     } 
    } 
} 

static void  beginRender(void) 
{ 
    /*Perspective*/ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glViewport(0, 0, WIDTH, HEIGHT); 
    gluPerspective(60.0, (float)(WIDTH/HEIGHT), 0.0f, 1000.0f); 
    gluLookAt(0.0f, 0.0, 7.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 

    /*Clear screen*/ 

    glClearDepth(1.0f); 
    glClearColor(0.13f, 0.12f, 0.13f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    /*Prepare model transformations*/ 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    /*Light settings*/ 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    /*Depth test*/ 

    glEnable(GL_DEPTH_TEST); //PROBLEM COMES FROM HERE 
} 

static void  renderFrame(void) 
{ 
    /*light position*/ 

    glLightfv(GL_LIGHT0, GL_POSITION, position); 

    /*Model transformations*/ 

    glPushMatrix(); 
    glRotatef(angle, 0.0f, 1.0f, 1.0f); 

    /*Light materials*/ 

    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, specular); 
    glMaterialfv(GL_FRONT, GL_EMISSION, emissive); 
    glMateriali(GL_FRONT, GL_SHININESS, 10); 

    /*Model rendering*/ 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glNormalPointer(GL_FLOAT, 0, normals); 

    glDrawArrays(GL_QUADS, 0, 24); 

    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    angle += 0.010f; 
    glPopMatrix(); 
} 

static void  endRender(void) 
{ 
    glFlush(); 
    SDL_GL_SwapBuffers(); 
} 

static void  startRendering(void) 
{ 
    bool  continuer = true; 
    SDL_Event event; 

    while (continuer) 
    { 
     eventListener(&event, &continuer); 
     beginRender(); 
     renderFrame(); 
     endRender(); 
    } 
} 

int    main(int ac, char **av) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("Test luminosity",NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL | SDL_DOUBLEBUF); 

    startRendering(); 
    SDL_Quit(); 
    return (0); 
} 

Hier ist der Bildschirm mit glEnable (GL_DEPTH_TEST) (Gesichter blinken)

enter image description here

Und ohne diesen Aufruf (kein blinkende Anzeige aber nicht Tiefentest)

enter image description here

Ich habe mehrere Code-Kombinationen ohne Erfolg ausprobiert.

Kann mir jemand helfen?

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

8

Ihre nahe Clipping-Ebene ist nicht richtig eingerichtet, so dass Ihre Z-Pufferung nicht funktioniert.

gluPerspective(60.0, (float)(WIDTH/HEIGHT), 0.0f, 1000.0f); 
              ^^^^ 

Stellen Sie eine angemessene Entfernung ein - so weit Sie leben können.

auch, setzen die Kameraausrichtung nicht (dh die Ansicht Transformation) in die Projektionsmatrix ...

Schließlich ist zu beachten, dass die meisten dieser Funktionalität ist veraltet und nicht mehr in neueren Versionen von GL . Der empfohlene Ansatz besteht darin, eigene Matrixberechnungen zu verarbeiten und die programmierbare Pipeline zum Rendern von Geometrie zu verwenden.

+0

Hallo, vielen Dank für Ihre Antwort. Über Matrix- und Geometrieverwaltung werde ich meine eigene Matrixverwaltung und Shader verwenden, wie du gesagt hast. Das ist mein Hauptziel. Danke für alles. Tschüss. – user1364743