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

tad*_*ole 3 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);  
}  
Run Code Online (Sandbox Code Playgroud)

And*_*rew 13

我试过你的代码.问题在于resizeGL()功能.问题是你的投入

gluPerspective ( 90, (GLint)width/ (GLint)height, 0.0, 200.0 );  
Run Code Online (Sandbox Code Playgroud)

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()功能

  • glEnable不属于初始化.每个OpenGL状态都需要在您需要之前设置.glEnable(GL_DEPTH_TEST)在绘制几何体之前属于paintGL.还有glViewport,设置投影矩阵和其他东西属于那里,没有其他地方. (2认同)