如何在OpenGL中始终将对象保留在其他所有内容之前?

我有这个功能,它在屏幕的左下角绘制一个小的3D轴坐标系,但根据我面前的情况,它可能会被剪裁.

例如,我在地面上绘制了一个平坦的地形,在XZ平面上Y = 0.摄像机位于Y = 1.75(模拟一般人的身高).如果我抬头,它工作正常,如果我向下看,它会被地平面夹住.

向上看:http://i.stack.imgur.com/Q0i6g.png
往下看:http://i.stack.imgur.com/D5LIx.png

调用函数在角落绘制轴系统是这样的:

void Axis3D::DrawCameraAxisSystem(float radius,float height,const Vector3D rotation) {
    if(vpHeight == 0) vpHeight = 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,vpWidth,vpHeight);
    gluPerspective(45.0f,1.0 * vpWidth / vpHeight,1.0f,5.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f,0.0f,-3.0f);

    glrotatef(-rotation.x,0.0f);
    glrotatef(-rotation.y,0.0f);

    DrawAxisSystem(radius,height);
}

我认为现在有几个主要功能与问题相关:

glutdisplayFunc(renderScene);
glutReshapeFunc(changeSize);

void changeSize(int width,int height) {
    if(height == 0) height = 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glViewport(0,width,height);

    gluPerspective(60.0f,1.0 * width / height,1000.0f);

    glMatrixMode(GL_MODELVIEW);
}

void renderScene(void) {
    glClearColor(0.7f,0.7f,0.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    changeSize(glutGet(gluT_WINDOW_WIDTH),glutGet(gluT_WINDOW_HEIGHT));

    glLoadIdentity();

    SceneCamera.Move(CameraDirection,elapsedtime);
    SceneCamera.LookAt();

    SceneAxis.DrawCameraAxisSystem(0.03f,0.8f,SceneCamera.GetRotationAngles());

    glutSwapBuffers();
}

建议?

解决方法

而不是禁用深度测试,你可以只是glClear(GL_DEPTH_BUFFER_BIT);在渲染叠加层之前.然后,无论深度信息是什么都消失了,但像素仍然存在.但是,您的叠加层仍会正确呈现.

相关文章

HTML5和CSS3实现3D展示商品信息的代码
利用HTML5中的Canvas绘制笑脸的代码
Html5剪切板功能的实现
如何通过HTML5触摸事件实现移动端简易进度条
Html5移动端获奖无缝滚动动画实现
关于HTML5和CSS3实现机器猫的代码