我有一个简单的程序来使用深度测试。它没有按预期工作。程序绘制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);
}
答案 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);
中包装轴绘制例程就可以了解