美文网首页
纹理格式pixel format

纹理格式pixel format

作者: 许彦峰 | 来源:发表于2022-05-13 18:03 被阅读0次

    https://huailiang.github.io/blog/2019/texture/

    format
    BGRA8888 RGBA8888 分别用8个bit来记录每个像素的A、R、G、B数据,就是常说的32bit位图、256色位图
    RGB888 真彩色
    RGB565 分别用5个、6个和5个bit记录像素的R、G、B数据,其中G的6个bit中一个是无效保留的,32色位图,容易失真
    A8 1byte,8位图,只有alpha信息,所以只能显示黑白
    I8 intensity texture 即用一张高度图来实现凹凸效果,高度图中存储的是强度值,用于表示局部的海拔高度。颜色越浅表示越凸起,颜色越深表示越凹陷。
    AI88
    ARGB4444 RGBA4444 分别用4个bit来记录每个像素的A、R、G、B数据,16色位图
    RGB5A1 2byte
    PVRTC4
    PVRTC4A
    PVRTC2
    PVRTC2A
    ETC ETC1格式是OpenGL ES图形标准的一部分,并且被所有的Android设备所支持。 扩展名为: GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以仅能用于不透明纹理。 当加载压缩纹理时,参数支持如下格式: GL_ETC1_RGB8_OES(RGB,每个像素0.5个字节)
    S3TC_DXT1
    S3TC_DXT3
    S3TC_DXT5
    ATC_RGB
    ATC_EXPLICIT_ALPHA

    以上的pixelformat是cocos自己的封装,真正的和OpenGL的对应关系是:

    PixelFormatInfoMapValue(Texture2D::PixelFormat::BGRA8888, Texture2D::PixelFormatInfo(GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE, 32, false, true)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::RGBA8888, Texture2D::PixelFormatInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32, false, true)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::RGBA4444, Texture2D::PixelFormatInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 16, false, true)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::RGB5A1, Texture2D::PixelFormatInfo(GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 16, false, true)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::RGB565, Texture2D::PixelFormatInfo(GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 16, false, false)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::RGB888, Texture2D::PixelFormatInfo(GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, 24, false, false)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::A8, Texture2D::PixelFormatInfo(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, 8, false, false)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::I8, Texture2D::PixelFormatInfo(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 8, false, false)),
    PixelFormatInfoMapValue(Texture2D::PixelFormat::AI88, Texture2D::PixelFormatInfo(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 16, false, true)),
            
    
    void glTexImage2D(
             GLenum  target,
             GLint   level,
             GLint   internalformat, // 参数3:显存格式
             GLsizei width,
             GLsizei height,
             GLint   border,
             GLint   format,// 参数7:像素格式
             GLenum  type,
             const GLvoid  *pixels
    );
    

    这里关系到OpenGL中的 pixel transfer 操作,pixel transfer 表示从内存到显存(unpack)或者从显存到内存(pack)的过程。
    显然glTexIamge2D表示从内存到显存的过程,是unpack操作。

    一般来说,我们会将internalformat和format参数设置的相同。

    internalformat

    是指OpenGL内部存储这个纹理时所用的格式,同时指定了哪些分量以及每个分量对应的bit数,可以理解为显存中存储的格式。

    format / type

    这2个参数共同指定了pixels内存中存储的格式,也就是data指针中的所存放的texture布局。

    format形如GL_RG, GL_RED等,即指定哪些颜色分量。

    type是像素数据的bit depth,包括GL_UNSIGNED_BYTE,GL_FLOAT,GL_UNSIGNED_SHORT_5_6_5等。

    那么

    • A8对应的是
      glTexImage2D(null, null, GL_ALPHA, GLALPHA, ...)
    • I8对应的是
      glTexImage2D(null, null, GL_LUMINANCE, GL_LUMINANCE, ...)
    • AI88对应的是:
      glTexImage2D(null, null, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, ...)

    纹理格式

    区别是在生成四分量RGBA颜色向量的方式,如果给定纹素的值,那么生成的 RGBA 颜色向量为:

    format(param) RGBA 通俗解释(将 alpha 解释为透明度)
    GL_ALPHA(A) (0,0,0,A) 具有不同透明度的完全黑色纹理
    GL_LUMINANCE(L) (L,L,L,1) 具有不同颜色的不透明纹理(灰度图像)
    GL_LUMINANCE_ALPHA(L,A) (L,L,L,A)
    GL_INTENSITY(X) (X,X,X,X) 颜色和 alpha 通道都变化
    GL_RGB(R,G,B) (R,G,B,1)

    相关文章

      网友评论

          本文标题:纹理格式pixel format

          本文链接:https://www.haomeiwen.com/subject/ylruurtx.html