huailiang.github.io/blog/2019/t…
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的对应关系是:
PixelFormat (纹理的像素格式) | internalFormat | format | type | bpp(每个像素占用的位数) | compressed(是否支持压缩) | alpha(是否包含 alpha 通道) |
BGRA8888 | GL_BGRA | GL_BGRA | GL_UNSIGNED_BYTE | 32 | false | true |
RGBA8888 | GL_RGBA | GL_RGBA | GL_UNSIGNED_BYTE | 32 | false | true |
RGBA4444 | GL_RGBA | GL_RGBA | GL_UNSIGNED_SHORT_4_4_4_4 | 16 | false | true |
RGB5A1 | GL_RGBA | GL_RGBA | GL_UNSIGNED_SHORT_5_5_5_1 | 16 | false | true |
RGB565 | GL_RGB | GL_RGB | GL_UNSIGNED_SHORT_5_6_5 | 16 | false | false |
RGB888 | GL_RGB | GL_RGB | GL_UNSIGNED_BYTE | 24 | false | false |
A8 | GL_ALPHA | GL_ALPHA | GL_UNSIGNED_BYTE | 8 | false | false |
I8 | GL_LUMINANCE | GL_LUMINANCE | GL_UNSIGNED_BYTE | 8 | false | false |
AI88 | GL_LUMINANCE_ALPHA | GL_LUMINANCE_ALPHA | GL_UNSIGNED_BYTE | 16 | false | true |
OpenGL坐标系
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) | 具有不同颜色的不透明纹理(灰度图像)0x111,0x222,0x333等都是灰色的图片 |
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) |