在OpenGL中,(如何)可以在两个深度缓冲区之间进行深度测试?

时间:2015-10-25 23:04:04

标签: c++ opengl opengl-es-2.0

假设我有两个深度缓冲区(" DA"和" DB")。我想将DA附加到帧缓冲区,并在正常/传统的#34;中渲染它。方式(每个片段深度测试对GL_LESS,如果它通过,它被绘制并且它的深度被写入深度缓冲区)。

然后,我想要附加数据库 - 这里我想以传统方式引用/使用数据库,还要使用GL_GREATER对DA进行深度测试。如果片段通过了两个测试,我仍然只想为DB写入深度。

这将完成的是第二遍中绘制的任何东西只会在第一遍的内容后面时绘制,但在前面中的任何其他内容第二遍。

OpenGL 2.1(或OpenGL ES 2)是否提供此功能?我可以做些什么来解决它而不是正式提供它?

如果它没有提供它,我想知道我是如何做到的,我希望能够进行理智检查......

附加一个充当深度缓冲区的渲染缓冲区,然后用深度手动填充它。并且如果在DA"处的深度大于纹素,则手动执行"测试(失败时,丢弃片段)。我很好奇我遇到了什么问题?有一种简单的方法可以模拟正式指定的深度缓冲区的深度精度吗?表现会糟糕吗?还有其他问题吗?

1 个答案:

答案 0 :(得分:1)

我不相信有多种方法可以拥有多个深度缓冲区。我认为可能至少有供应商特定的扩展,但是通过扩展注册表的搜索甚至是空的。

您在上一段中已经开始考虑的内容看起来是想到的唯一合理简单的选项。您使用深度纹理作为第二个深度缓冲区,并根据与片段着色器中深度纹理的值进行比较来丢弃片段。

您不必手动填充深度纹理。如果深度值是作为早期渲染过程的结果生成的,则可以使用glCopyTexImage2D()将它们从主深度缓冲区复制到深度纹理。此功能在OpenGL 2.1中可用。在较新的版本中,您还可以使用glBlitFramebuffer()执行复制。

关注您的问题:

  • 精确是一个非常有效的问题。当我玩过去类似的东西时,我遇到了一些相当严重的精确问题。它们可能会被解决,但你肯定需要注意它,并仔细考虑你的精度要求,以及如何在必要时捏造价值。

  • 我当然希望性能有所下降。固定功能深度缓冲区具有大量优化的优势,例如早期深度测试,您不会使用自制的"自制的"深度缓冲。不过,我不一定会认为它太可怕了。如果这是你需要的,那就值得一试。

我认为这在ES 2.0中几乎没有用,至少不依赖于扩展。您可以考虑将深度值写入颜色纹理,但我认为它会变得非常丑陋和低效。 ES 2.0非常简单。但是,对于您计划执行的操作,您将超出其预期的功能集。 ES 3.0增加了深度纹理,以及其他一些可以发挥作用的功能。