在 fbo 中使用默认的帧缓冲区深度缓冲区
Use default framebuffer depth buffer in a fbo
我想在我的游戏中对某些演员实现 post 处理轮廓效果,并且我希望轮廓被更靠近相机的其他演员遮挡。为此,我计划在 FBO 和轮廓着色器中渲染应该勾勒出轮廓的元素。要丢弃被遮挡的像素,我想使用默认帧缓冲区的深度缓冲区。
我阅读并搜索了但没有找到如何在另一个帧缓冲区中正确使用默认帧缓冲区深度缓冲区或如何复制或无论如何在 fbo 上使用默认深度缓冲区信息。
如何实现?
不幸的是,无法将默认深度缓冲区附加到 FBO 或从着色器读取它。
您可以将默认帧缓冲区复制到渲染缓冲区(或附加纹理的帧缓冲区,请参阅 glBlitFramebuffer
),但这可能相对较慢。
另一种方案是先将完整的场景渲染到一个FBO(颜色+深度),然后使用轮廓着色器从这个FBO中读取,将结果与轮廓计算结合起来,并将最终结果写入默认的帧缓冲区.
I read and searched but I didn't find how to properly use the default framebuffer depth buffer in another framebuffer
不幸的是,OpenGL 中没有办法做到这一点。
or how to copy or anyway to use the default depth buffer informations on an fbo.
这很容易。只需创建一个具有适当深度附件的 FBO(无论是纹理还是渲染缓冲区),以及 blit 它的默认深度缓冲区:
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, your_target_fbo);
glBlitFramebuffer(0,0,width,height,0,0,width,height,GL_DEPTH_BUFFER_BIT, GL_NEAREST);
但是,由于无论如何都要进行一些 post 处理,因此将初始场景渲染到 FBO 中并在不同的 FBO 中重复使用相同的深度缓冲区可能是一个不错的选择。
我想在我的游戏中对某些演员实现 post 处理轮廓效果,并且我希望轮廓被更靠近相机的其他演员遮挡。为此,我计划在 FBO 和轮廓着色器中渲染应该勾勒出轮廓的元素。要丢弃被遮挡的像素,我想使用默认帧缓冲区的深度缓冲区。
我阅读并搜索了但没有找到如何在另一个帧缓冲区中正确使用默认帧缓冲区深度缓冲区或如何复制或无论如何在 fbo 上使用默认深度缓冲区信息。
如何实现?
不幸的是,无法将默认深度缓冲区附加到 FBO 或从着色器读取它。
您可以将默认帧缓冲区复制到渲染缓冲区(或附加纹理的帧缓冲区,请参阅 glBlitFramebuffer
),但这可能相对较慢。
另一种方案是先将完整的场景渲染到一个FBO(颜色+深度),然后使用轮廓着色器从这个FBO中读取,将结果与轮廓计算结合起来,并将最终结果写入默认的帧缓冲区.
I read and searched but I didn't find how to properly use the default framebuffer depth buffer in another framebuffer
不幸的是,OpenGL 中没有办法做到这一点。
or how to copy or anyway to use the default depth buffer informations on an fbo.
这很容易。只需创建一个具有适当深度附件的 FBO(无论是纹理还是渲染缓冲区),以及 blit 它的默认深度缓冲区:
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, your_target_fbo);
glBlitFramebuffer(0,0,width,height,0,0,width,height,GL_DEPTH_BUFFER_BIT, GL_NEAREST);
但是,由于无论如何都要进行一些 post 处理,因此将初始场景渲染到 FBO 中并在不同的 FBO 中重复使用相同的深度缓冲区可能是一个不错的选择。