10

我有这个功能,它在屏幕的左下角绘制一个小的 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();
}

建议?

4

5 回答 5

23

glClear(GL_DEPTH_BUFFER_BIT);您可以在渲染叠加层之前,而不是禁用深度测试。然后,那里的任何深度信息都消失了,但像素都还在。但是,您的叠加层仍将正确呈现。

于 2011-04-03T02:52:02.987 回答
4

您还可以为 3D 轴保留一点点深度范围。其余的都是你的场景。像这样:

// reserve 1% of the front depth range for the 3D axis
glDepthRange(0, 0.01);

Draw3DAxis();

// reserve 99% of the back depth range for the 3D axis
glDepthRange(0.01, 1.0);

DrawScene();

// restore depth range
glDepthRange(0, 1.0);
于 2015-03-02T23:05:51.490 回答
0

你想禁用深度测试(所以它不会被任何东西剪掉):

glDisable(GL_DEPTH_TEST);

如果您已经预先转换了这些点(看起来您没有),请将视图和投影矩阵设置为标识。

编辑:

如果您需要轴位保持测试并按顺序排列,那么您可能需要glClear(GL_DEPTH_BUFFER_BIT)在渲染它和主场景之间清除深度缓冲区 ( )。这将重置深度缓冲区,以便绘制标记(因此出现在前面),但仍被正确剔除。

于 2011-04-03T01:32:48.320 回答
0

您可以尝试启用混合,然后在片段着色器中手动设置 alpha 和颜色。但这可能是矫枉过正;-)

于 2011-04-03T02:58:53.183 回答
0

`glGetBooleanv(GL_BLEND, &m_origin_blend);

glGetBooleanv(GL_DEPTH_TEST,&m_origin_depth);

glGetBooleanv(GL_CULL_FACE, &m_origin_cull);

setAlphaBlending(true);

设置深度测试(假);

setCullFace(假); //石头

//你的draw() ...

setAlphaBlending(m_origin_blend>0?true:false);

setDepthTest(m_origin_depth>0?true:false);

setCullFace(m_origin_cull>0?true:false);`

于 2015-03-24T23:42:12.140 回答