Тест глубины OpenGL не работает должным образом - PullRequest
3 голосов
/ 22 января 2011

У меня есть простая программа для проверки глубины.Это не работает, как ожидалось.Программа рисует оси 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 ]

13 голосов
/ 22 января 2011

Я попробовал твой код.Проблема в 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, иначе результат будет странным.1013 * функция

0 голосов
/ 22 января 2011

Ваша ось начинается в точке Z 0. Сфера находится в точке Z 20 (дальше от «камеры»), поэтому ось находится перед сферой и отображается.

Как выв настоящее время он настроен, так как значения Z растут, они удаляются от экрана.Когда они опускаются, они приближаются к экрану.

У вас есть два варианта: отключить проверку глубины при рисовании вашей оси (поэтому она всегда будет позади всего).Или переместите ось в положение Z или около 100 и увеличьте ее, чтобы она выглядела одинаково.Первый вариант, вероятно, лучше.

Простое завершение процедур рисования осей в glDisable(GL_DEPTH_TEST); и glEnable (GL_DEPTH_TEST); должно помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...