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_BYTE
,GL_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