opengl - 如何在 OpenGL 中始终将对象保持在其他所有内容的前面?

标签 opengl viewport clipping foreground depth

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

例如,我在 Y = 0 的 XZ 平面上在地面上绘制了一个平原地形。相机位于 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, 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, 1.0f, 0.0f, 0.0f);
    glRotatef(-rotation.y, 0.0f, 1.0f, 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, 0, width, height);

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

    glMatrixMode(GL_MODELVIEW);
}

void renderScene(void) {
    glClearColor(0.7f, 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);在渲染叠加层之前。然后任何深度信息都消失了,但像素仍然存在。但是,您的叠加层仍会正确呈现。

关于opengl - 如何在 OpenGL 中始终将对象保持在其他所有内容的前面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5526704/

相关文章:

java - OpenGL 2d 渲染中的奇怪边缘

html - 无法让 iPhone 网站版本缩放/缩放

css - 将具有混合(固定和百分比)值的 CSS 剪辑路径转换为 ​​SVG 剪辑路径

c++ - 使用 Qt OpenGL 进行文本裁剪

html - 如何剪辑(或屏蔽)谷歌地图

opengl - GLSL : accessing framebuffer to get RGB and change it

objective-c - Cocoa 应用程序在任何 GL 函数上提供 EXC_BAD_ACCESS

c - 在 window/openGL 上显示的图像已损坏

html - 为另一个 div 设置视口(viewport)高度时排除现有 div 的高度

带有背景图片的 HTML <body>