3

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

我的问题是哪种变体在性能和质量方面最好?我确信使用 32 位的深度组件,深度测试应该更精确,但是数据类型呢?通常应该使用哪一个?

4

1 回答 1

3

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 之外读取它或从客户端内存中提供数据,这是唯一适用的情况。

于 2013-10-10T23:23:50.150 回答