2010-07-23 8 views
0

Voici un programme C++ basé sur GLUT rapide et sale pour Windows qui dessine deux rectangles, bleu et vert sur un fond plat rouge. En appuyant sur 'a' ou 'z', ils sont placés en orbite le long de l'axe X dans les deux directions. Mon problème est que si j'active GL_DEPTH_TEST, il dessine parfois un rectangle, parfois deux ou parfois juste l'arrière-plan mais jamais correctement avec le polygone plus proche obscurcissant certaines ou toutes les parties du plus éloigné. Si vous ne définissez pas GL_DEPTH_TEST, les polygones apparaissent dans l'ordre de dessin.Problème de tampon OpenGL polygone z

Quel est le problème avec le code ci-dessous?

#include <windows.h> 

#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

#include <cmath> 

#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "glu32.lib") 

int angle = 0; 

void oglDraw() 
{ 
    angle += 360; 
    angle %= 360; 
    float fAngle = angle/(180/3.14159); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    gluPerspective(90, 1, 0, 10); 
    gluLookAt(0, 0, -1, 0, 0, 1, 0, 1, 0); 

    float yFactor = 1; 
    float zFactor = 1; 
    float y = yFactor * sin(fAngle); 
    float z = 1 + zFactor - cos(fAngle) * zFactor; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glClearColor(1, 0, 0, 1); 

    glPolygonMode(GL_FRONT, GL_FILL); 

    glBegin(GL_POLYGON); 
    glColor4f(0, 0, 1, 1); 
    glVertex3f(-1.0, y-1.0, z); 
    glVertex3f(+1.0, y-1.0, z); 
    glVertex3f(+1.0, y+1.0, z); 
    glVertex3f(-1.0, y+1.0, z); 
    glEnd(); 

    fAngle = (180 - angle)/(180/3.14159); 
    y = -yFactor * sin(fAngle); 
    z = 1 + zFactor - cos(fAngle) * zFactor; 

    glBegin(GL_POLYGON); 
    glColor4f(0, 1, 0, 1); 
    glVertex3f(-1.0, y-1.0, z); 
    glVertex3f(+1.0, y-1.0, z); 
    glVertex3f(+1.0, y+1.0, z); 
    glVertex3f(-1.0, y+1.0, z); 
    glEnd(); 

    glFlush(); 
    glutSwapBuffers(); 
} 
////////////////////////////////////////////////////////////////////////// 

void oglKeyboard(byte ch, int x, int y) 
{ 
    if(ch == 'z') 
    { 
     angle++; 

     glutPostRedisplay(); 

    } 
    else 
    if(ch == 'a') 
    { 
     angle--; 

     glutPostRedisplay(); 
    } 
} 
////////////////////////////////////////////////////////////////////////// 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(1024, 768); 
    glutCreateWindow("OGL test"); 
    gluOrtho2D(0, 1024, 768, 0); 

    glEnable(GL_DEPTH_TEST); 
    glutDisplayFunc(oglDraw); 
    glutKeyboardFunc(oglKeyboard); 

    glutMainLoop(); 
} 
+0

commentaire sans rapport: Vous devez utiliser 'gluLookAt' (qui configure votre point de vue (position de la caméra et la direction)) sur la matrice modelview et pas la matrice de projection. La matrice de projection est seulement pour des choses comme «gluPerspective», «glFrustum» et «glOrtho», qui configurent votre, bien, la projection (objectif de la caméra). –

Répondre

1

passe quelque chose supérieur à zéro pour gluPerspective() zNear de:

gluPerspective(90, 1, 0.1, 10); 
+0

Absolument bien! Merci, je me suis déchiré les cheveux ces dernières heures !!!! –

+0

@rep_movsd: Merci d'avoir posté un programme complet, minimal et facile à compiler démontrant le problème. Cela rend toujours ce genre de chose * beaucoup * plus facile! :) – genpfault

+2

Ceci est une bonne référence pour choisir les bonnes valeurs pour les plans z et near: http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html –