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 に答える