我试图将一堆树木从森林反射到附近的湖中。我按照所有标准步骤使用模板缓冲区绘制反射。但是“水”似乎不允许看到下面的对象。这是我的功能: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);
}
混合不能与深度测试一起工作。要进行混合,您必须对可见表面进行远近排序。如果是水,则必须先绘制反射(就像在反射场景中“穿过”水面),然后绘制水。
glDisable(GL_DEPTH_TEST);
您关闭深度测试是正确的。但是您必须也turn off depth writes;否则,在渲染反射几何体时,您将污染深度缓冲区。
glDepthMask(GL_FALSE);
注意:不要忘记在渲染湖后重新打开深度写入。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(31条)