1

我正在尝试将森林中的一堆树木反射到附近的湖中。我按照所有标准步骤使用模板缓冲区绘制反射。但是“水”似乎不允许看到下面的物体。这是我的功能:draw_sea()- 绘制反映的计划drawFigTree(fig_tree)- 绘制下面的树木。问题出在哪里?

void draw_mirror() 
{
    glEnable(GL_STENCIL_TEST);
    //glColorMask(0, 0, 0, 0);
    glDisable(GL_DEPTH_TEST);
    glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
    glDisable(GL_LIGHTING);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    draw_sea();
    glDisable(GL_BLEND);
    glEnable(GL_LIGHTING);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    glEnable(GL_DEPTH_TEST);
    glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glPushMatrix();
    glTranslatef(0.0, SEA_LEVEL, 0.0);
    glEnable(GL_CLIP_PLANE0);
    glClipPlane(GL_CLIP_PLANE0, clip_plane0 );
    glPopMatrix();
    glPushMatrix();
    glTranslatef(-25.0, 2*(-1), 0.0);
    glScalef(1.0, -1.0, 1.0);

    drawFigTree(fig_tree);
    glPopMatrix();
    glDisable(GL_CLIP_PLANE0);
    glDisable(GL_STENCIL_TEST);
}
4

2 回答 2

2

混合不能与深度测试一起使用。为了使混合工作,您必须对可见表面进行远近分类。在水的情况下,您必须先绘制反射(这就像在反射场景中“穿过”水面)然后是水。

于 2013-01-30T02:43:56.740 回答
1
    glDisable(GL_DEPTH_TEST);

您关闭深度测试是正确的。但是您还必须 关闭深度写入;否则,在渲染反射几何体时,您将污染深度缓冲区。

glDepthMask(GL_FALSE);

注意:不要忘记在渲染湖后重新打开深度写入。

于 2013-01-30T03:31:10.877 回答