GL_UNSIGNED_BYTE
,GL_FLOAT
等实际上是像素传输
类型。这是OpenGL在从/向缓冲区读取/写入像素数据时使用的类型,在OpenGL中,驱动程序将进行数据类型转换以确保读取/写入的值兼容。在OpenGL ES中,这被完全删除了,但在所有情况下,深度渲染缓冲区的内部格式必须是GL_DEPTH_COMPONENT<X>{F}
或GL_DEPTH<X>_STENCIL<Y>
之一。这些格式定义了内部使用的数据类型和格式。GL_FLOAT
用于像素传输是GL_DEPTH_COMPONENT32F
的良好匹配)。然而,这仅适用于当您想在OpenGL外部使用深度/模板缓冲区的内容(例如使用PBO读取或写入缓冲区)时。glTexImage2D(...)
设置纹理附件时,您正在传递NULL
作为像素数据。 NULL
表示首先没有像素传输:P但是,如果您要使用PBO将纹理读入客户端内存并使用glReadPixels(...)
,则像素传输格式/类型非常重要,并且您将遵循我上面解释的规则-匹配组件大小/类型以最小化驱动程序开销。 - Andon M. Coleman