【问题标题】:Shadow volume front/light cap appearing in stencil buffer模板缓冲区中出现的阴影体积前/光帽
【发布时间】:2013-07-14 02:03:08
【问题描述】:

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

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

以下是我的代码摘要:

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];

【问题讨论】:

    标签: ios objective-c opengl-es shadow


    【解决方案1】:

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

    退化的四边形必须用

    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,就像在简单的几何渲染中一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2012-07-11
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多