计算机屏幕一个像素的颜色值由RGB(或RGBA,A并不直接用于颜色显示)三个分量组成;不同设备单个像素能显示的颜色数不用,存储颜色值的内存大小也不用,一般用bit来衡量,8-bit buffer能显示256种颜色。RGB各分量的值可以无歧义地用浮点数表示,范围是[0.0,1.0],1.0表示这个分量的颜色达到最强。
图元颜色
opengl设定颜色的api是glColor*,颜色设定以顶点为单位,图元的颜色进过流水线的处理才能到达屏幕:
1)顶点的颜色还要经过光照处理;
2)此时以图元顶点的颜色为基础,按选定的着色模式(shading model)对图元进行着色,得出图元内部的颜色;
3)接下来就是光栅化(rasterize,也即将图元转化成二维图像),这一步决定图像窗口坐标内的每个格子颜色、深度(z)、纹理坐标,这样的格子就是片段(fragment),纹理、雾、antialiasing这些效果也会被加诸片段之上;
5)最终片段的颜色和frame buffer中原有的像素颜色进行混合操作(alpha blending,dithering,bitwise logical operation),形成新的像素颜色。
RGB颜色存储格式
显示设备一般为每个分量分配一定的bit数(不一定相等),分量值存储为无符号整形;比如R有8 bit,那么存储的值为0,1...255,那么分别对应于浮点值0.0,1/255...1.0。
Dithering
一些现实设备使用Dithering技术来增加可以显示的颜色数目,打个比方,RGB分别只有一个bit宽度,那么只可以显示:black,white,red,blue,green,yellow,cyan,magenta这几种颜色,为了显示一块pink区域,可以在该区域内间隔显示red和white像素,这样看起来就感觉是pink了。
Color-Index模式
该模式使用一张颜色查找表和颜色索引来表示颜色,像素中存储的是索引值。
Shading Mode
有两种着色模式,flat和smooth,前者会使用某个顶点的颜色来个整个图元着色,后者会考虑所有顶点的颜色对图元内部的点进行着色(插值)。在flat模式下,选取那个顶点的颜色取决于图元类型,请参考原书。