在OpenGL中分离帧缓冲区和深度缓冲区

时间:2012-11-23 19:38:51

标签: opengl framebuffer depth-buffer

在DirectX中,您可以拥有单独的渲染目标和深度缓冲区,因此您可以绑定渲染目标和深度缓冲区,执行一些渲染,移除深度缓冲区,然后使用旧的深度缓冲区作为纹理执行更多渲染

你会如何在opengl中解决这个问题?根据我的理解,你有一个framebuffer对象,它包含颜色缓冲区和可选的深度缓冲区。我不认为我可以同时绑定几个帧缓冲对象,我是否必须在每次更改时重新创建帧缓冲对象(可能是帧的几次)?普通的opengl程序如何做到这一点?

2 个答案:

答案 0 :(得分:6)

Framebuffer Object只不过是对图像的一系列引用。这些图像可以是Textures中的图像(例如2D纹理的mipmap图层)或Renderbuffers(不能用作纹理)。

没有什么可以阻止你组装一个FBO,它使用纹理图像作为其颜色缓冲区,并使用纹理图像作为其depth buffer。也没有什么能阻止你以后(只要你在做这个时没有渲染到那个FBO)从纹理中采样作为深度纹理。 FBO并没有突然拥有这些图像或其他东西。

很可能发生的事情是你误解了FBO和OpenGL Default Framebuffer之间的区别。默认的帧缓冲区(即:窗口)是不可更改的。你无法使用它的深度缓冲区并将其用作纹理或其他东西。你用FBO做的事情是你自己的事,但是OpenGL不会让你以同样的方式使用它的默认帧缓冲。

答案 1 :(得分:1)

您可以将多个渲染目标绑定到单个FBO,这应该是技巧。此外,由于OpenGL是一个状态机,您可以随时更改目标的绑定和数量。

相关问题