FBO深度纹理附件的最佳设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FBO深度纹理附件的最佳设置相关的知识,希望对你有一定的参考价值。

在使用自定义FBO深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换那些(因为我需要在着色器中读取它)。我正在查看不同的来源,如here,并看到GL_FLOAT用作数据类型。在other示例中使用GL_UNSIGNED_BYTE,有时甚至是GL_INT。内部格式也可以是GL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT24,GL_DEPTH_COMPONENT32。

我的问题是哪种变化在性能和质量方面最好?我确信深度分量为32位深度测试应该更精确但数据类型如何?通常应该使用哪一种?

答案

正如你所描述的那样使用GL_UNSIGNED_BYTEGL_FLOAT等实际上是Pixel Transfer类型。这是OpenGL在从/向缓冲区读取/写入像素数据时使用的类型,在OpenGL中,驱动程序将执行数据类型转换以确保读/写值兼容。在OpenGL ES中,这被完全删除,但在所有情况下,深度渲染缓冲区的内部格式必须是GL_DEPTH_COMPONENT<X>{F}GL_DEPTH<X>_STENCIL<Y>之一。这些格式定义数据类型和内部使用的格式。

为获得最佳性能,请将组件类型与像素传输类型匹配,以避免驱动器像素转换。 (例如GL_FLOAT用于像素传输是GL_DEPTH_COMPONENT32F的一个很好的匹配)。但是,这实际上仅适用于您希望使用深度/模板缓冲区的内容来执行OpenGL之外的操作(例如,使用PBO读取或写入缓冲区)。

在大多数情况下,您可以在分配深度纹理时忽略像素传输格式和类型(除了确保它们是给定内部格式的合法值)。您可能不会在OpenGL之外读取它或从客户端内存中提供数据,这是唯一适用的时间。

以上是关于FBO深度纹理附件的最佳设置的主要内容,如果未能解决你的问题,请参考以下文章

GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

在 CUDA 中修改 OpenGL FBO 纹理附件

纹理同时用作着色器程序的 FBO 颜色附件和 sampler2D

FBO 用于分离纹理

FBO 深度和模板渲染缓冲区附件

设置 GL_RGBA16F 纹理格式时获取不完整的 FBO