簡體   English   中英

在OpenGL中進行深度測試

[英]Depth Test in opengl

我的程序拒絕進行深度測試。 這兩個球體對象始終按其創建順序繪制,而不是根據其位置繪制。 球體alpha定位在(0,0,1),球體beta定位在(0,0,-10),但是OpenGL仍然在alpha上方繪制beta。 我在程序中將深度測試設置為啟用。

似乎沒有任何作用。 我希望OpenGL對窗口中繪制的任何對象自動進行深度測試。 任何幫助或建議,將不勝感激。 這是完整的代碼。

#include "GL/freeglut.h"
#include "GL/gl.h"
#include "GL/glu.h"

const int SPHERE_RES = 200;   
double Z_INIT = -28.0;       
double RADIUS = 2;          
double Red[3] = {1, 0, 0};   
double Blue[3] = {0, 0, 1};  

using namespace std;


/*
 * Method handles resize of the window
*/ 

void handleResize (int w, int h) {    

    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double ratio = (float)w/ (float)h;
    gluPerspective(45.0, ratio, 1.0, 100.0);
}


/*
 * Color and depth is enabled and in this method
*/

void configureColor(void)
{

     glClearColor(1.0f, 1.0f, 1.0f, 0.0f); //Set background to white
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear window.
     glDepthFunc(GL_ALWAYS);
     glEnable(GL_DEPTH_TEST);

     glEnable(GL_COLOR_MATERIAL);        
     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT0);

}

void display (void) {    

     configureColor();

     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();


     GLfloat sun_direction[] = { 0.0, 0.0, -1.0, 0.0};
     glLightfv(GL_LIGHT0, GL_POSITION, sun_direction);
     GLUquadric* quad =  gluNewQuadric();

     //first sphere is drawn
     glColor3f(Red[0], Red[1], Red[2]);
     glPushMatrix();
         glLoadIdentity();
         glTranslatef(0, 0, Z_INIT);
         glTranslatef(0, 0, 1.0);
         gluSphere(quad, RADIUS, SPHERE_RES, SPHERE_RES);
     glPopMatrix();

     //second sphere is supposed to be drawn behind it, 
     //but it is drawn on top. 
    glColor3f(Blue[0], Blue[1], Blue[2]);
     glPushMatrix();
         glLoadIdentity();
         glTranslatef(0, 0, Z_INIT);
         glTranslatef(0, 0, -10.0);
         gluSphere(quad, RADIUS, SPHERE_RES, SPHERE_RES);
     glPopMatrix();

    free(quad);
     glFlush();
} 

int main(int argc, char** argv)
{

    glutInit(&argc, argv); //initializes the GLUT
    glutInitDisplayMode(GLUT_SINGLE);
    glutInitWindowSize(600,600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("OpenGL - First window demo");  
    glutReshapeFunc(handleResize);
    glutDisplayFunc(display);

    glutMainLoop();    
    return 0;
}

我正在使用Ubuntu 14.04操作系統。

glDepthFunc(GL_ALWAYS);

這就是您按繪制順序看到球體的原因。 深度函數設置為GL_ALWAYS只是意味着,對於任何片段,無論更近或更遠,所有深度測試都始終通過。

您需要GL_LESS以獲得所需的結果。 深度小於幀緩沖區的片段獲勝 ; 越近(z越小)勝過越遠(z越大)。

您可以調用glDepthFunc(GL_LESS)或注釋掉glDepthFunc(GL_ALWAYS)因為GL_LESS是默認設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM