OGL颜色和图片颜色存储位移压缩

OGL颜色

抖动

是有限的颜色下,在一个着色块区域混合不同的颜色成分,比如黑色50%,白色50%就是灰色,指的是一个块区域混合不同的像素,而不是在一个像素内混合。

显示模式的选择:

用RGBA模式通常可以表示更大的颜色空间,在光照,能够使用纹理映射Shader着色,雾,抗锯齿上表现效果更加灵活,而丰富。
但是颜色位平面太小单个通道小于8位的性能优化程序中,缩略图中,或需要移植到广泛的使用颜色索引的系统中,那么需要使用颜色索引模式。

颜色调色板

应该是在GPU硬件中,由窗口系统负责而不是OGL,在CPU中进行初始化或设置。
双缓冲交换链模式下,以前的系统只能通过减少颜色位平面数量(分半)来实现,现在还会不会减少位平面数量?
创建窗口后不能灵活的切换颜色显示模式,可以创建多个窗口分别使用不同的显示模式,然后显示时候进行显示隐藏 切换,显然比较消耗性能。
在存储,网络传输中,要求精度不高情况下,用调色板模式更加节省空间;当然图片格式是目前主流的压缩图片大小的选择。

颜色索引模式已经很少使用了,glClearIndex,glIndexi已经很少使用了glClear(GL_COLOR_BUFFER_BIT)会一样的重置索引缓存。 原因是所有Blend混合在索引颜色模式下是非法的,不能很好的支持FragmentShader的单像素的强大操作能力

RGBA模式相关函数:

glClearColor
glColor4fv()等组合
glClear (GL_COLOR_BUFFER_BIT)
glSecondaryColor*函数一般在纹理贴图之后使用(Fragment Shader后), 在光照被禁用的前提下才能使用。

颜色索引模式相关函数:

glClearIndex()对应glClearColor设置glClear时候的颜色。
glClear (GL_COLOR_BUFFER_BIT);将后台缓存区颜色值和索引值都清除为设置的颜色。
glIndex()
glClear


颜色用浮点数表示,目的是用浮点数插值更加准确

在光照计算后,光栅化插值或写入颜色缓存区之前要求截取在[0,1]内,显示时候会应该被硬件转换为定点数例如red在[0,255]内。
颜色截取:
OGL 3.0引入可以用glClampColor来指定是否截取[0,1]范围内的颜色。

着色模式

光栅化时候会用到:
glShadeModel (GL_SMOOTH); // 平滑插值
   //glShadeModel(GL_FLAT); // 单独着色模式

颜色的基本概念和存储位移操作

基本概念

RGB中0x000000是黑色,0xffffff是白色; Alpha当0x00时候是完全透明的,0xff是完全不透明的
颜色的深度,就是一个像素用多少位来表示,一般图像为8位深度,也就是2(^8) = 256种颜色。如果图像深度为24位,那就是2(^24)=
16777216种颜色称之为真彩色。虽然颜色的深度为8位,但是也不是说R只有8种,G只有8种,B只有4种颜色,也不是说R只能取0x00~0x07, 而是将这256种常用颜色赋值给一个unsigned int类型的整数(alpha位也是必须的),R位可能是0x00~0xff,所以到 内存里面还是要消耗一个unsigned int的整型来存放一个像素颜色,而颜色的深度只能在磁盘空间或者网络存储中减少存储空间

颜色在内存中用调色板,可以有效的减少内存中的占用,比如用一个unsigned char来表示一个颜色索引,索引到调色板

颜色位移的例子:

uint32_t Color::to_ARGB32() const {

 uint32_t c=(uint8_t)(a*255); // 例如0x0000007F
 c<<=8;      // 0x00007F00
 c|=(uint8_t)(r*255);    // 0x00007F10
 c<<=8;   // 0x007F1000
 c|=(uint8_t)(g*255);   // 0x007F1011
 c<<=8;   // 0x7F101100
 c|=(uint8_t)(b*255);   // 0x7F101112

unsigned char red = (unsigned char)(color >> 16);
int nRed = (int)red; // 输出16

 return c; // 0x7F101112
}

总结:   

// 1. C/C++语言的位移运算不需要考虑内存存放的大小端,因为这个是对逻辑上十六进制数值的位移, 直接16进制左右移动即可。
//   2.小转大,大左移<<填充:类型的转换,将小类型转换为大类型,只需要声明一块大数据类型的空间,然后左移填充各个小的数据类型。
//   3.大转小,大右移>>截取:大的转换为小的先右移,然后直接强制类型转换截取,或者格式截取。
左右移动只是数值上的操作,ARGB颜色格式在内存中数值就是一个unsigned int整型:ARGB;存储方式在内存中的由底地址到高地址为:BGRA的字节顺序。
左右移动只是改变大数据的值,地址并不改变。输出是<<,输入是>>。
// 4. 网络上的数据,需要先转换为主机字节顺序,然后对主机数据进行16进制处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值