在使用自定义FBO深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换那些(因为我需要在着色器中读取它)。我正在查看不同的来源,如here,并看到GL_FLOAT用作数据类型。在other示例中使用GL_UNSIGNED_BYTE,有时甚至GL_INT。内部格式也可以是GL_DEPTH_COMPONENT16,GL_DEPTH_COMPONENT24,GL_DEPTH_COMPONENT32。
我的问题是哪种变化在性能和质量方面最好?我确信深度分量为32位深度测试应该更精确但数据类型如何?通常应该使用哪一种?
答案 0 :(得分: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之外读取它或从客户端内存中提取数据,这是唯一适用的时间。