阴影体积前/灯帽出现在模板缓冲区中

时间:2013-07-16 02:55:29

标签: ios objective-c opengl-es shadow

我正在尝试在iPad上根据NVDIA GPU Gems Chapter 9. Efficient Shadow Volume Rendering实现阴影卷,但我的模板缓冲区中出现前/灯帽问题。

我正试图在下面图片中间的框上渲染阴影。正确地在盒子的右侧生成阴影,但是当我移动相机时,盒子的部分亮起的部分都会被遮挡。在我看来,它可能是深度缓冲区的分辨率的问题,没有识别阴影体积与盒子的深度相同并且不应该被绘制,但我已经使用glDepthFunc(GL_LESS)来绘制为了试图纠正这个阴影卷,它似乎没有改变任何东西。

enter image description here

以下是我的代码摘要:

glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glDisable(GL_BLEND);

[self drawAmbient];

glDepthMask(GL_FALSE);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0, 0xff);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_DECR_WRAP_OES, GL_KEEP);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_INCR_WRAP_OES, GL_KEEP);

glDisable(GL_CULL_FACE);

[self drawShadowVolumes];

glStencilFunc(GL_EQUAL, 0, 0xff);
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);

glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);

glDepthMask(GL_TRUE);
glDepthFunc(GL_EQUAL);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glEnable(GL_CULL_FACE);

[self drawDirectionalLight];

1 个答案:

答案 0 :(得分:0)

你做错了什么。对于默认的Z-fail技术,您必须有2次阴影体渲染,一次用于“退化四边形”(阴影体积),另一次用于“精确对象几何体”,其中有平面法线(阴影上限)。我只能看到“Degenerated quads”的一个传递,但是在模板缓冲区中使用相反标志的“Exactly geometry”传递?

退化的四边形必须用

渲染

glStencilOpSeparate(GL_FRONT,GL_KEEP,GL_DECR_WRAP_OES,GL_KEEP); glStencilOpSeparate(GL_BACK,GL_KEEP,GL_INCR_WRAP_OES,GL_KEEP);

并且必须使用相反的标志

呈现完全几何体

glStencilOpSeparate(GL_FRONT,GL_KEEP,GL_INCR_WRAP_OES,GL_KEEP); glStencilOpSeparate(GL_BACK,GL_KEEP,GL_DECR_WRAP_OES,GL_KEEP);

深度测试必须是GL_LESS或GL_LEQUAL,就像在简单的几何渲染中一样。