延迟渲染:使用默认framebuffer中Gbuffer的深度缓冲区
Deferred Rendering: Use depth buffer from Gbuffer in default framebuffer
我正在使用c++和OpenGL制作延迟渲染应用程序。在完成几何和光线传递之后,我想渲染一些粒子。但我需要对它们进行深度测试。所以我想做的是使用深度缓冲区绑定到我的GBuffer做一些深度测试时,绘制到默认的OpenGL framebuffer。
我创建并绑定深度缓冲区/纹理到framebuffer/GBuffer,像这样
glGenTextures(1, &_depthTextureID);
glBindTexture(GL_TEXTURE_2D, _depthTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, _width, _height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, _depthTextureID, 0);
如何将Gbuffer深度缓冲区绑定到默认的帧缓冲区上进行几何通道的深度测试?
你不能直接使用深度纹理作为默认framebuffer的深度缓冲区。我能想到的主要有两个选项:
-
您可以使用
glBlitFramebuffer()
将深度缓冲区从FBO复制到默认的framebuffer。主调用看起来像这样:glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBlitFramebuffer(0, 0, _width, _height, 0, 0, _width, _height, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
-
如果你只需要深度测试,但没有更新深度缓冲,在渲染到默认帧缓冲的过程中,你可以简单地绑定深度纹理,并在你的片段着色器中采样。然后将采样的深度值与片段的传入深度值进行比较,并丢弃未通过深度测试的像素。或者用
sampler2DShadow
型采样器采样,可以更直接地得到深度比较结果。
你不能将创建的渲染缓冲区或纹理绑定到默认的framebuffer。默认的framebuffer是固定的。
但是你可以在渲染GBuffer时通过在你的片段着色器中设置gl_FragDepth
将深度纹理复制到默认framebuffer。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- OpenGL在启用深度测试时不会丢弃我的碎片
- C++尝试深度复制唯一指针时出现内存访问冲突
- 试图找到二叉树的深度
- 操纵安卓相机的深度图导致应用程序崩溃
- 深度值没有意义 R200 相机
- 对如何制作双链表的深度副本感到困惑?
- 以C++访问 HoloLens 2 深度图像
- 在 c++ 中使用深度复制的运算符重载
- 如何深度复制链表对象指针
- 提升图:当我的图使用 listS 作为 VertexList 时,如何调用深度优先搜索()?
- 在 OpenCV 中按深度维度排序,C++
- 如何在编译时获得多维 std::vector 的深度?
- 需要帮助生成C++深度有限的随机表达式树
- C++ 可变参数模板实例化深度超过最大值 900
- C++ - 如何找到 n 元树的给定节点的深度
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 延迟渲染:使用默认framebuffer中Gbuffer的深度缓冲区