纹理格式

简介: 纹理格式

huailiang.github.io/blog/2019/t…

换算

1Byte(字节)=8bit(位)

1 KB = 1024 Byte

1 MB = 1024 KB

1 GB = 1024 MB

1TB = 1024GB

纹理格式

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) 具有不同颜色的不透明纹理(灰度图像)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)



目录
相关文章
|
存储 编解码 调度
剖析ffmpeg视频解码播放:时间戳的处理
剖析ffmpeg视频解码播放:时间戳的处理
1442 0
|
数据可视化 定位技术
three.js实现烟雾缭绕效果
前言 大家好!我是Fly哥,最近接广告的接的有点多, 感谢大家还是一如既往的支持我!respect, 前几天我在朋友圈分享了一个烟雾缭绕的效果。很多小伙伴都表示非常感兴趣,有的同学说用到了噪声, 有的同学说用到了着色器,还有更过分说用到了ps, 胖虎竟然无语凝噎。其实都是就是简单的贴图。配合一点想象力。我们先看下效果: 然后我就发了一条朋友圈,问这个像什么?? 有的说 云层, 有的说云墨,有的说雾霭, 其实都不是, 我想做的是烟雾。好的话不不多说!, 本篇文章阅读大概5分钟。不耽误大家太多时间,主要是介绍思路, 说太多也没啥意义。如果你对three.js 还没有一点了解都没有,
three.js实现烟雾缭绕效果
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
920 1
|
调度 索引
传输块大小(TBS)的确定 | 带你读《5G-NR信道编码》之十六
物理块上行和下行数据共享通道是以传输块(TB,Transport Block)为基本单位进行传输数据的。在LTE中,TBS可以用给定的物理资源块(PRB,Physical Resource Block)的数目 NPRB 以及 TBS 的索引 ITBS 通过查表的方式得到。在 5G-NR 标准化过程中,有的公司提出采用公式计算和查表分别量化 不同大小区间的 TBS 的方式来确定 TBS,以实现更大的调度灵活性。
18671 0
传输块大小(TBS)的确定 | 带你读《5G-NR信道编码》之十六
|
网络协议 安全 物联网
探索未来网络:IPv6的演进与应用
本文深入探讨了互联网协议第六版(IPv6)的发展历程、技术特点以及在现代网络中的应用。通过分析IPv4的局限性和IPv6的优势,阐述了IPv6对网络扩展性、安全性和性能提升的重要性。同时,文章还探讨了IPv6在实际部署中面临的挑战和解决方案,为读者提供了全面而深入的理解。
|
SQL 关系型数据库 MySQL
MySQL DML(数据操作语言)全面指南
MySQL DML(数据操作语言)全面指南
|
Windows
Win11怎么重置系统?(小白专享篇)
Win11怎么重置系统?(小白专享篇)
1735 3
|
存储 安全 编译器
C++ std::move以及右值引用全面解析:从基础到实战,掌握现代C++高效编程
C++ std::move以及右值引用全面解析:从基础到实战,掌握现代C++高效编程
980 1
|
存储 编解码 Java
视频渲染的推荐8位YUV格式
视频渲染的推荐8位YUV格式
458 0
|
算法 数据库连接 程序员
深度剖析:C++内存池的设计与实现
深度剖析:C++内存池的设计与实现
892 0