为了改善级联的阴影贴图,我研究了使用GL_DEPTH_CLAMP并将近平面和远平面移动到实际视锥的周围,而不是全局边界框。但是,使用GL_DEPTH_CLAMP似乎没有效果,并且近平面会修剪几何图形。
我按照Reversed-Z in OpenGL使用反向z:
tl / dr版本为:
将剪辑控件更改为0/1
glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
使用浮点深度缓冲区。
将深度缓冲区清除为0
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glClearDepth(0.0f);
glClear(GL_DEPTH_BUFFER_BIT);
将深度测试更改为刨丝器
glDepthFunc(GL_GREATER);
更改投影矩阵以匹配
反向z确实很好,但显然与GL_DEPTH_CLAMP混淆。如果我关闭反向z GL_DEPTH_CLAMP似乎按设计工作;但是代码中的许多其他地方都搞砸了。 (只是不能切换了。)
如果您查看GL_DEPTH_CLAMP的文档,则会显示以下内容:
如果启用此选项,则视图体积剪切将忽略-wc≤zc≤wc平面方程(实际上,不存在近平面或远平面剪切)。
我的猜测是GL_DEPTH_CLAMP的实现与反向z不兼容。但是我觉得我缺少一些东西。关于如何使GL_DEPTH_CLAMP与反向z一起使用的任何想法吗?
请参见下图深度缓冲区:
在第一个级联中可以看到,近平面夹住了几何图形,它应该是全白色的。