GL_DEPTH_CLAMP无效(反向z)

时间:2019-03-20 10:10:42

标签: opengl

为了改善级联的阴影贴图,我研究了使用GL_DEPTH_CLAMP并将近平面和远平面移动到实际视锥的周围,而不是全局边界框。但是,使用GL_DEPTH_CLAMP似乎没有效果,并且近平面会修剪几何图形。

我按照Reversed-Z in OpenGL使用反向z:

tl / dr版本为:

  1. 将剪辑控件更改为0/1

    glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
    
  2. 使用浮点深度缓冲区。

  3. 将深度缓冲区清除为0

    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    
    glClearDepth(0.0f);
    glClear(GL_DEPTH_BUFFER_BIT);
    
  4. 将深度测试更改为刨丝器

    glDepthFunc(GL_GREATER);
    
  5. 更改投影矩阵以匹配

反向z确实很好,但显然与GL_DEPTH_CLAMP混淆。如果我关闭反向z GL_DEPTH_CLAMP似乎按设计工作;但是代码中的许多其他地方都搞砸了。 (只是不能切换了。)

如果您查看GL_DEPTH_CLAMP的文档,则会显示以下内容:

  

如果启用此选项,则视图体积剪切将忽略-wc≤zc≤wc平面方程(实际上,不存在近平面或远平面剪切)。

我的猜测是GL_DEPTH_CLAMP的实现与反向z不兼容。但是我觉得我缺少一些东西。关于如何使GL_DEPTH_CLAMP与反向z一起使用的任何想法吗?

请参见下图深度缓冲区:

enter image description here

在第一个级联中可以看到,近平面夹住了几何图形,它应该是全白色的。

0 个答案:

没有答案