opengl 如何在打开的gl中临时切换到另一个深度缓冲区

7eumitmz  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(169)

我们有一个CAD应用程序,其中3D实体可以选择在“覆盖”模式。覆盖实体总是出现在非覆盖实体的前面。
为了实现这一点,理想情况下,我想先渲染非覆盖实体,到默认的帧缓冲区深度缓冲区,然后切换到另一个深度缓冲区,清除它,渲染覆盖实体。然后切换回默认的深度缓冲区。

  • 重要的是,默认的深度缓冲区是用非覆盖渲染的信息来维护的。(无聊的第三方库原因)
  • 重要的是,绘制覆盖图元时要启用深度测试,以便它们与其他覆盖图元正确合成。
  • 在这两种情况下,我们都需要深度缓冲区的完整精度,因此不能只是混淆近端/法尔斯,以便将相同深度缓冲区的一半划分给每一个。

是否可以用另一个深度缓冲区FBO只换出默认帧缓冲区的深度缓冲区部分(然后再换回来)

在进行覆盖渲染之前“备份”默认深度缓冲区,然后在渲染之后恢复它的最佳方法是什么?FBO位块?显然我们不希望数据复制到系统内存中或从系统内存中复制出来。
理想情况下,我不想依赖于超级新的硬件功能。我们需要支持旧的硬件,在过去5年左右。

nfs0ujit

nfs0ujit1#

是否可以只换出默认帧缓冲区的深度缓冲区部分
不能,您不能以任何方式更改缓冲区或默认帧缓冲区的格式。您需要创建自己的命名Framebuffer Object并渲染到其中。但是,您可以使用glBlitFramebuffer复制帧缓冲区和部分帧缓冲区(目标和目的可以是命名的帧缓冲区和/或默认帧缓冲区)。例如:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo1);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2);
glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_DEPTH_BUFFER_BIT, GL_NEAREST);

相关问题