glTexImage* 系列函数绝对是 OpenGL 最常用的函数。它的声明为:
void glTexImage2D (GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels);
其中有三个描述纹理数据信息的变量 internalformat、format 和 type,它们有时会让人感到困扰。
从上面来看,三种类型分别各司其职。但它们仍有一定的关联性。比如 internalformat 其实可以粗略指定。 internalformat 也可以使用 GL_RED、GL_RED_INTEGER 等形式,这个时候为纹理赋值时,就会使用 type 指定的形式,比如 GL_RED、GL_RED 和 GL_UNSIGNED_BYTE 组合使用时,internalformat 实际为 GL_R8。这样有一定好处,避免了类型转换,但是强烈推荐不要使用粗略的 internalformat 形式。
OpenGL 的纹理数据格式繁多,以下是一个对应,已经省略了压缩纹理。
Image format (sized) | Pixel format | Pixel type |
---|---|---|
GL_R8 | GL_RED | GL_UNSIGNED_BYTE |
GL_R8_SNORM | GL_RED | GL_BYTE |
GL_R16 | GL_RED | GL_UNSIGNED_SHORT |
GL_R16_SNORM | GL_RED | GL_SHORT |
GL_R32F | GL_RED | GL_FLOAT |
GL_R8I | GL_RED_INTEGER | GL_INT |
GL_R8UI | GL_RED_INTEGER | GL_UNSIGNED_INT |
GL_R16I | GL_RED_INTEGER | GL_INT |
GL_R16UI | GL_RED_INTEGER | GL_UNSIGNED_INT |
GL_R32I | GL_RED_INTEGER | GL_INT |
GL_R32UI | GL_RED_INTEGER | GL_UNSIGNED_INT |
GL_R16F | GL_RED | GL_HALF_FLOAT |
GL_RG8 | GL_RG | GL_UNSIGNED_BYTE |
GL_RG8_SNORM | GL_RG | GL_BYTE |
GL_RG16 | GL_RG | GL_UNSIGNED_SHORT |
GL_RG16_SNORM | GL_RG | GL_SHORT |
GL_RG16F | GL_RG | GL_HALF_FLOAT |
GL_RG32F | GL_RG | GL_FLOAT |
GL_RG8I | GL_RG_INTEGER | GL_INT |
GL_RG8UI | GL_RG_INTEGER | GL_UNSIGNED_INT |
GL_RG16I | GL_RG_INTEGER | GL_INT |
GL_RG16UI | GL_RG_INTEGER | GL_UNSIGNED_INT |
GL_RG32I | GL_RG_INTEGER | GL_INT |
GL_RG32UI | GL_RG_INTEGER | GL_UNSIGNED_INT |
GL_R3_G3_B2 | GL_RGB | GL_UNSIGNED_BYTE_3_3_2 |
GL_RGB4 | GL_RGB | GL_UNSIGNED_BYTE |
GL_RGB5 | GL_RGB | GL_UNSIGNED_BYTE |
GL_RGB8 | GL_RGB | GL_UNSIGNED_BYTE |
GL_RGB8_SNORM | GL_RGB | GL_BYTE |
GL_RGB10 | GL_RGB | GL_UNSIGNED_SHORT |
GL_RGB12 | GL_RGB | GL_UNSIGNED_SHORT |
GL_RGB16_SNORM | GL_RGB | GL_SHORT |
GL_RGBA2 | GL_RGBA | GL_UNSIGNED_SHORT_4_4_4_4 |
GL_RGBA4 | GL_RGBA | GL_UNSIGNED_SHORT_4_4_4_4 |
GL_SRGB8 | GL_RGB | GL_UNSIGNED_BYTE |
GL_RGB16F | GL_RGB | GL_HALF_FLOAT |
GL_RGB32F | GL_RGB | GL_FLOAT |
GL_R11F_G11F_B10F | GL_RGB | GL_UNSIGNED_INT_10F_11F_11F_REV |
GL_RGB9_E5 | GL_RGB | GL_UNSIGNED_INT_5_9_9_9_REV |
GL_RGB8I | GL_RGB_INTEGER | GL_INT |
GL_RGB8UI | GL_RGB_INTEGER | GL_UNSIGNED_INT |
GL_RGB16I | GL_RGB_INTEGER | GL_INT |
GL_RGB16UI | GL_RGB_INTEGER | GL_UNSIGNED_INT |
GL_RGB32I | GL_RGB_INTEGER | GL_INT |
GL_RGB32UI | GL_RGB_INTEGER | GL_UNSIGNED_INT |
GL_RGB5_A1 | GL_RGBA | GL_UNSIGNED_SHORT_5_5_5_1 |
GL_RGBA8 | GL_RGBA | GL_UNSIGNED_BYTE |
GL_RGBA8_SNORM | GL_RGBA | GL_BYTE |
GL_RGB10_A2 | GL_RGBA | GL_UNSIGNED_INT_10_10_10_2 |
GL_RGB10_A2UI | GL_RGBA_INTEGER | GL_UNSIGNED_INT_10_10_10_2 |
GL_RGBA12 | GL_RGBA | GL_UNSIGNED_SHORT |
GL_RGBA16 | GL_RGBA | GL_UNSIGNED_SHORT |
GL_SRGB8_ALPHA8 | GL_RGBA | GL_UNSIGNED_BYTE |
GL_RGBA16F | GL_RGBA | GL_HALF_FLOAT |
GL_RGBA32F | GL_RGBA | GL_FLOAT |
GL_RGBA8I | GL_RGBA_INTEGER | GL_INT |
GL_RGBA8UI | GL_RGBA_INTEGER | GL_UNSIGNED_INT |
GL_RGBA16I | GL_RGBA_INTEGER | GL_INT |
GL_RGBA16UI | GL_RGBA_INTEGER | GL_UNSIGNED_INT |
GL_RGBA32I | GL_RGBA_INTEGER | GL_INT |
GL_RGBA32UI | GL_RGBA_INTEGER | GL_UNSIGNED_INT |
GL_DEPTH_COMPONENT16 | GL_DEPTH_COMPONENT | GL_UNSIGNED_SHORT |
GL_DEPTH_COMPONENT24 | GL_DEPTH_COMPONENT | GL_UNSIGNED_INT |
GL_DEPTH_COMPONENT32 | GL_DEPTH_COMPONENT | GL_UNSIGNED_INT |
GL_DEPTH_COMPONENT32F | GL_DEPTH_COMPONENT | GL_FLOAT |
GL_DEPTH24_STENCIL8 | GL_DEPTH_STENCIL | GL_UNSIGNED_INT_24_8 |
GL_DEPTH32F_STENCIL8 | GL_DEPTH_STENCIL | GL_FLOAT_32_UNSIGNED_INT_24_8_REV |
转载请带上本文永久固定链接:http://www.gleam.graphics/texture-color-type.html