如何在多样本纹理中渲染颜色和深度
How to render color and depth in multisample texture?
为了实现"深度剥离",我将我的OpenGL场景渲染到一系列帧缓冲区中,每个帧缓冲区都配备了rgba颜色纹理和深度纹理。如果我不关心抗锯齿,这工作得很好。如果我这样做,那么似乎正确的事情是启用GL_MULTISAMPLING
并使用GL_TEXTURE_2D_MULTISAMPLE
而不是GL_TEXTURE_2D
。但我不清楚还有哪些电话需要替换。
特别是,我应该如何调整我的framebuffer结构来使用glTexImage2DMultisample
而不是glTexImage2D
?
我是否需要在使用GL_TEXTURE_2D_MULTISAMPLE
而不是GL_TEXTURE_2D
之外更改对glFramebufferTexture2D
的调用?
如果我渲染颜色和深度到纹理,我需要调用glRenderbufferStorageMultisample
吗?
最后,有一些glBlit*
,我需要做的除了设置纹理为帧缓冲渲染成?
关于这个主题有许多相关的问题,但我发现的解决方案似乎都没有指向一个规范的教程或明确的例子来把所有这些放在一起。
虽然我只使用了renderbuffers的多采样FBO渲染,而不是纹理,以下是我的理解。
我是否需要在使用
GL_TEXTURE_2D_MULTISAMPLE
而不是GL_TEXTURE_2D
之外更改对glFramebufferTexture2D
的调用?
不,这就是你所需要的。您使用glTexImage2DMultisample()
创建纹理,然后使用GL_TEXTURE_2D_MULTISAMPLE
作为glFramebufferTexture2D()
的第三个参数将其附加。唯一的限制是级别(第5个参数)必须为0。
如果我渲染颜色和深度到纹理,我需要调用
glRenderbufferStorageMultisample
吗?
是的。如果您将深度缓冲区附加到相同的FBO,则需要使用多采样渲染缓冲区,其采样数量与颜色缓冲区相同。所以你用glRenderbufferStorageMultisample()
创建你的深度渲染缓冲,传递你用于颜色缓冲的相同样本计数。
最后,有一些
glBlit*
,我需要做的除了设置纹理为帧缓冲渲染成?
不用于渲染到framebuffer。完成渲染后,有几个选项:
-
你可以将多样本纹理下采样(解析)为常规纹理,然后在后续渲染中使用常规纹理。要解析多样本纹理,可以使用
glBlitFramebuffer()
,其中多样本纹理附加到GL_READ_FRAMEBUFFER
,规则纹理附加到GL_DRAW_FRAMEBUFFER
。 -
您可以在后续渲染中使用多样本纹理。你需要使用
sampler2DMS
类型的采样器在你的着色器代码,与相应的采样函数。
对于选项1,我真的没有看到一个很好的理由使用多样本纹理。您也可以使用多样本渲染缓冲区,它稍微容易使用,并且至少应该同样有效。为此,您为颜色附件创建一个渲染缓冲区,并使用glRenderbufferStorageMultisample()
分配它,这与您需要的深度缓冲区非常相似。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- 如何在24位SDL_Surface上设置像素的颜色
- OpenGL在启用深度测试时不会丢弃我的碎片
- 如何从SDL_Surface获取特定像素的颜色
- C++尝试深度复制唯一指针时出现内存访问冲突
- 如何使用OpenCV同时显示"深度"和"颜色"视频图像
- 从OpenGL应用程序中提取颜色/深度缓冲区
- 在 UWP 中使用C++录制 Kinect V2.0(颜色和深度)
- 在 OpenGL 中将深度映射到颜色
- libpng获取原始颜色通道深度
- SDL2 OpenGL 4.2上下文,具有0个颜色位和0个深度位
- 深度+颜色的3D投影
- 在OpenGL中启用深度测试后,我的整个屏幕是空白的(恢复为清晰的颜色)-为什么
- Kinect SDK:对齐深度和颜色帧
- RealSense R200在高颜色分辨率和低深度分辨率时崩溃
- 为什么在CToolBar中使用高深度颜色的禁用按钮只是灰色框
- 如何在多样本纹理中渲染颜色和深度
- MFC工具栏图标的颜色深度更高