这是一个奇怪的问题,但我想知道为什么glTexImage2d关心像素数据类型和Null数据的格式。 glTexImage2d的签名是......
void glTexImage2D( GLenum target, GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLint border, GLenum format,
GLenum type, const GLvoid * data);
internalFormat用于告诉图形驱动程序您要在gpu上存储数据,格式和类型告诉图形驱动程序对GLvoid *数据的期望。所以,如果我没有传递任何数据,例如通过传递null,为什么图形驱动程序会关心格式和类型是什么?所以这是一个奇怪的问题,因为有时它不会。它的时间,我没有检查每一次迭代但是,特别是在制作深度纹理时,或者我最近遇到的是整数类型,如GL_RED_INTEGER,GL_RG_INTEGER等和/或它们对应的内部格式如GL_R8I,GL_RGBA32UI。然而,任何“简单”类型都不必与internalFormat相对应,如GL_RGBA8,GL_RGBA32F等。出于某种原因,即使您没有通过,前面的特定数据类型和格式也必须精确任何数据。那是为什么?
答案 0 :(得分:6)
调用glTexImage2D (...)
时有两种格式,内部格式和用于像素传输的格式。内部格式是为纹理分配存储所必需的,GL使用像素传输格式来解释您传递的(可选)像素数组。
当您为像素数据传递NULL
时,不会发生像素传输,因此您认为format
和type
是不必要的。从技术上讲,在这种情况下它们是不必要的,但GL仍然验证了这对格式和类型。您可以使用任何有效的值,因为实际上不会发生像素传输操作。你所做的只是分配纹理存储。
顺便说一下,glTexStorage2D (...)
是在没有像素传输的情况下分配纹理存储的现代方法。您可以通过这种方式创建不可变纹理,您可以通过不正确的glTexImage2D (...)
调用意外重新定义纹理LOD。使用glTexStorage2D (...)
分配纹理存储后,您可以通过调用glTexSubImage2D (...)
来提供数据。
答案 1 :(得分:2)
如果您没有传递任何数据,它仍会在GPU上分配内存以供进一步使用。这就是为什么你必须指定确切的格式;告诉GPU它必须保留多少内存。