OpenGL深度测试无法按预期工作

时间:2011-01-21 21:38:19

标签: opengl

我有一个简单的程序来使用深度测试。它没有按预期工作。程序绘制X,Y轴和原点附近的球体。 如果我没有打开GL_DEPTH_TEST,则会在轴上绘制球体。如果我打开GL_DEPTH_TEST,轴将被绘制在我不期望的球体上。有人能告诉我我做了什么 错了?

void  
glwid::initializeGL()  
{    
    glClearColor (0.0f, 0.0f, 0.0f, 1.0f);      
}  



void  
glwid::resizeGL(int width, int height)  
{  
    glViewport( 0, 0, (GLint)width, (GLint)height );  
    glMatrixMode( GL_PROJECTION );  
    glLoadIdentity();  

    gluPerspective ( 90, (GLint)width/ (GLint)height, 0.0, 200.0 );  
    glMatrixMode( GL_MODELVIEW );  
    glLoadIdentity();  
    glEnable (GL_DEPTH_TEST);  
}  


void  
glwid::paintGL()  
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  

    glMatrixMode (GL_MODELVIEW);  
    glLoadIdentity();  

    gluLookAt (0, 0, 100, 0, 0, 0, 0, 1, 0);  


    //  
    // X axis  
    //  
    glBegin( GL_LINES );  
    qglColor( green );  
    glVertex3f (-100.0,  0, 0. );  
    glVertex3f (100.0, 0, 0. );  
    glEnd();  


    //  
    // Y axis  
    //  
    glBegin( GL_LINES );  
    qglColor( red );  
    glVertex3f (0.0, 100.0, 0. );  
    glVertex3f (0.0, -100, 0. );   
    glEnd();  

    //  
    // sun  
    //  
    glTranslated (5, 0, 20);  
    GLUquadricObj *sphere_quadric = gluNewQuadric();  
    glColor3ub (255, 255, 0);  
    gluQuadricDrawStyle(sphere_quadric, (GLenum)GLU_SMOOTH);  
    gluSphere(sphere_quadric, 10, 36, 36);  
}  

2 个答案:

答案 0 :(得分:13)

我已经尝试过你的代码了。问题出在resizeGL()函数中。 问题是你的投入

gluPerspective ( 90, (GLint)width/ (GLint)height, 0.0, 200.0 );  

0.0值作为第三个参数。以0.01为例 - 一切都会好的。那是因为这个参数应该总是正面的: http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml

同时将(GLint)width/ (GLint)height更改为(GLfloat)width/ (GLfloat)height,否则结果会很奇怪。

最好将glEnable(GL_DEPTH_TEST)放入initializeGL()函数

答案 1 :(得分:0)

您的轴从Z位置0开始。球体位于Z位置20(远离“相机”),因此轴位于球体的前方并显示。

正如您目前设置的那样,当Z值上升时,它们会离开屏幕。当它们下降时,它们将更接近屏幕。

您有两种选择:在绘制轴时禁用深度测试(因此它始终位于所有内容之后)。或者将轴移动到Z位置100左右,然后将其放大以使其看起来大小相同。方案一可能更好。

只需在glDisable(GL_DEPTH_TEST);glEnable (GL_DEPTH_TEST);中包装轴绘制例程就可以了解