2011-09-18 2 views
3

J'ai commencé à apprendre OpenGL aujourd'hui, et c'est tout simplement fantastique. Cependant je ne peux pas pour la vie de moi faire des objets dessiner selon la profondeur, au lieu de dessiner l'ordre, donc j'espère que quelqu'un peut me dire ce que je fais mal.OpenGL Depth Spaz Attack

est ici le code extrêmement simple j'utilise pour créer un cube:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

//Simple translation 

glBegin(GL_QUADS);  
    glColor3f(0.0f,1.0f,0.0f);  
    glVertex3f(1.0f, 1.0f,-1.0f);  
    glVertex3f(-1.0f, 1.0f,-1.0f);  
    glVertex3f(-1.0f, 1.0f, 1.0f);  
    glVertex3f(1.0f, 1.0f, 1.0f);  
    glColor3f(1.0f,0.5f,0.0f);  
    glVertex3f(1.0f,-1.0f, 1.0f);  
    glVertex3f(-1.0f,-1.0f, 1.0f);  
    glVertex3f(-1.0f,-1.0f,-1.0f);  
    glVertex3f(1.0f,-1.0f,-1.0f);  
    glColor3f(1.0f,0.0f,0.0f);  
    //You get the point, continue with all sides 
glEnd();   // End Drawing The Cube 

SDL_GL_SwapBuffers(); 

Voici le code mis en place:

if (SDL_Init(SDL_INIT_EVERYTHING)<0) 
    return -1; 

SDL_GL_SetAttribute(SDL_GL_RED_SIZE,  8); 
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,  8); 
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,  8); 
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,  8); 

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,  16); 
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,  32); 

SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8); 

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); 
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); 


SDL_Surface* screen = SDL_SetVideoMode(screen_x,screen_y,32,SDL_HWSURFACE|SDL_GL_DOUBLEBUFFER|SDL_OPENGL); 

if (screen == NULL) 
    return -2; 

//glEnable(GL_DEPTH_TEST); //<-If this is uncommented look at figure 1 
glDepthFunc(GL_LESS); 

glClearColor(0, 0, 0, 0); 
glClearDepth(1.0f); 

glViewport(0, 0, screen_x, screen_y); 

glMatrixMode(GL_PROJECTION); //projection with ortho, model otherwise 
glLoadIdentity(); 

gluPerspective(60.0,1.0,0.0,10.0); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Eh bien, quand je

glEnable(GL_DEPTH_TEST); 

This

...

Et si je ne permettent pas il Dratted Cube

Alors, que suis-je censé faire? J'ai dû louper quelque chose? Comment puis-je résoudre mon problème de profondeur?

+1

Si vous commencez à apprendre OpenGL, vous ne devriez pas apprendre le mode immédiat. C'est lent, encombrant et déconseillé par les versions récentes d'OpenGL, jamais disponible dans OpenGL-ES. Je recommande les tutoriels de Nicol Bolas, ils sont les meilleurs actuellement disponibles http://arcsynthesis.org/gltut/ – datenwolf

+0

Wow, merci beaucoup, c'est super utile. Bien sûr, maintenant je lis au lieu de programmer, alors maudis-toi, maudis-toi, loup-garou, l'ornithorynque. Je te maudis. – ultifinitus

Répondre

3

J'ai trouvé la réponse!

http://www.opengl.org/resources/faq/technical/depthbuffer.htm

est ici où j'ai trouvé la réponse, Mon cadre proche était exactement 0, il doit être un peu loin de 0 pour que la précision de tampon de profondeur pour prendre effet. (Si je lis cela correctement) Tout va bien.

+1

Réglez-le simplement à 1.0. N'écoutez pas l'affirmation mondiale selon laquelle vous devez le définir sur 0.000001. – TheBuzzSaw

Questions connexes