OpenGL纹理格式


  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 : 表示在纹理中实际存储的数据信息,决定底层数据(比如上表的 image format),比如 gl_R8 表示底层只存储 8 位无符号整数表示 R 通道
  • format : 表示纹理的输入像素数据的通道格式它必须和传入数据相配合。也就是说,如果设定为 GL_RGB,type 为 GL_UNSIGNED_BYTE,则每个相邻像素的红色通道相隔三个字节。一个需要注意的是,其实 format 身居两职,如果声明为 GL_RED,表示在 glsl 读取浮点数;声明为 GL_RED_INTEGER,表示在 glsl 读取整数,需要和 usampler、isampler 等搭配使用。
  • type : 表示为数据赋值的单通道原始数据类型。比如常用 internalformat 的 GL_RGBA32F 和 GL_UNSIGHED_BYTE 配合时,虽然传入数据为无符号整数型,但是 OpenGL 会在 GPU 中自动转换存储为 GL_FLOAT 型

  从上面来看,三种类型分别各司其职。但它们仍有一定的关联性。比如 internalformat 其实可以粗略指定。  internalformat 也可以使用 GL_RED、GL_RED_INTEGER 等形式,这个时候为纹理赋值时,就会使用 type 指定的形式,比如 GL_RED、GL_RED 和 GL_UNSIGNED_BYTE 组合使用时,internalformat 实际为 GL_R8。这样有一定好处,避免了类型转换,但是强烈推荐不要使用粗略的 internalformat 形式


  OpenGL 的纹理数据格式繁多,以下是一个对应,已经省略了压缩纹理。

Image format (sized)Pixel formatPixel type
GL_R8GL_REDGL_UNSIGNED_BYTE
GL_R8_SNORMGL_REDGL_BYTE
GL_R16GL_REDGL_UNSIGNED_SHORT
GL_R16_SNORMGL_REDGL_SHORT
GL_R32FGL_REDGL_FLOAT
GL_R8IGL_RED_INTEGERGL_INT
GL_R8UIGL_RED_INTEGERGL_UNSIGNED_INT
GL_R16IGL_RED_INTEGERGL_INT
GL_R16UIGL_RED_INTEGERGL_UNSIGNED_INT
GL_R32IGL_RED_INTEGERGL_INT
GL_R32UIGL_RED_INTEGERGL_UNSIGNED_INT
GL_R16FGL_REDGL_HALF_FLOAT
GL_RG8GL_RGGL_UNSIGNED_BYTE
GL_RG8_SNORMGL_RGGL_BYTE
GL_RG16GL_RGGL_UNSIGNED_SHORT
GL_RG16_SNORMGL_RGGL_SHORT
GL_RG16FGL_RGGL_HALF_FLOAT
GL_RG32FGL_RGGL_FLOAT
GL_RG8IGL_RG_INTEGERGL_INT
GL_RG8UIGL_RG_INTEGERGL_UNSIGNED_INT
GL_RG16IGL_RG_INTEGERGL_INT
GL_RG16UIGL_RG_INTEGERGL_UNSIGNED_INT
GL_RG32IGL_RG_INTEGERGL_INT
GL_RG32UIGL_RG_INTEGERGL_UNSIGNED_INT
GL_R3_G3_B2GL_RGBGL_UNSIGNED_BYTE_3_3_2
GL_RGB4GL_RGBGL_UNSIGNED_BYTE
GL_RGB5GL_RGBGL_UNSIGNED_BYTE
GL_RGB8GL_RGBGL_UNSIGNED_BYTE
GL_RGB8_SNORMGL_RGBGL_BYTE
GL_RGB10GL_RGBGL_UNSIGNED_SHORT
GL_RGB12GL_RGBGL_UNSIGNED_SHORT
GL_RGB16_SNORMGL_RGBGL_SHORT
GL_RGBA2GL_RGBAGL_UNSIGNED_SHORT_4_4_4_4
GL_RGBA4GL_RGBAGL_UNSIGNED_SHORT_4_4_4_4
GL_SRGB8GL_RGBGL_UNSIGNED_BYTE
GL_RGB16FGL_RGBGL_HALF_FLOAT
GL_RGB32FGL_RGBGL_FLOAT
GL_R11F_G11F_B10FGL_RGBGL_UNSIGNED_INT_10F_11F_11F_REV
GL_RGB9_E5GL_RGBGL_UNSIGNED_INT_5_9_9_9_REV
GL_RGB8IGL_RGB_INTEGERGL_INT
GL_RGB8UIGL_RGB_INTEGERGL_UNSIGNED_INT
GL_RGB16IGL_RGB_INTEGERGL_INT
GL_RGB16UIGL_RGB_INTEGERGL_UNSIGNED_INT
GL_RGB32IGL_RGB_INTEGERGL_INT
GL_RGB32UIGL_RGB_INTEGERGL_UNSIGNED_INT
GL_RGB5_A1GL_RGBAGL_UNSIGNED_SHORT_5_5_5_1
GL_RGBA8GL_RGBAGL_UNSIGNED_BYTE
GL_RGBA8_SNORMGL_RGBAGL_BYTE
GL_RGB10_A2GL_RGBAGL_UNSIGNED_INT_10_10_10_2
GL_RGB10_A2UIGL_RGBA_INTEGERGL_UNSIGNED_INT_10_10_10_2
GL_RGBA12GL_RGBAGL_UNSIGNED_SHORT
GL_RGBA16GL_RGBAGL_UNSIGNED_SHORT
GL_SRGB8_ALPHA8GL_RGBAGL_UNSIGNED_BYTE
GL_RGBA16FGL_RGBAGL_HALF_FLOAT
GL_RGBA32FGL_RGBAGL_FLOAT
GL_RGBA8IGL_RGBA_INTEGERGL_INT
GL_RGBA8UIGL_RGBA_INTEGERGL_UNSIGNED_INT
GL_RGBA16IGL_RGBA_INTEGERGL_INT
GL_RGBA16UIGL_RGBA_INTEGERGL_UNSIGNED_INT
GL_RGBA32IGL_RGBA_INTEGERGL_INT
GL_RGBA32UIGL_RGBA_INTEGERGL_UNSIGNED_INT
GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENTGL_UNSIGNED_SHORT
GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENTGL_UNSIGNED_INT
GL_DEPTH_COMPONENT32GL_DEPTH_COMPONENTGL_UNSIGNED_INT
GL_DEPTH_COMPONENT32FGL_DEPTH_COMPONENTGL_FLOAT
GL_DEPTH24_STENCIL8GL_DEPTH_STENCILGL_UNSIGNED_INT_24_8
GL_DEPTH32F_STENCIL8GL_DEPTH_STENCILGL_FLOAT_32_UNSIGNED_INT_24_8_REV

转载请带上本文永久固定链接:http://www.gleam.graphics/texture-color-type.html

Tags :

About the Author

发表评论

电子邮件地址不会被公开。

Bitnami