2D 图形
今天电视、电脑显示屏、手机、平板电脑用的显示图形基本都是光栅图形,我们常称之为位图。这些屏幕由像素点构成,每个像素点代表了不同颜色。分辨率就是像素点方格的宽度和高度。例如,1920 × 1080,即1080p,意味着有1080行的像素点,每行由1920个像素点组成。类似的,3840 × 2160,即4K,意味着每行有3840个像素点,总共由2160行。
每个像素的色调最常见的就是将红色®、绿(G)、蓝(B)三种颜色混合在一起。三种颜色不同强度的组合,形成了色域。要使显示器显示 RGB 图像,显示器必须知道每个位置上像素的颜色。除了 GRB 之外,很多游戏内部都会用 alpha 值来控制透明度。
颜色缓冲区
在计算机图形中,颜色缓冲区是内存中包含整个屏幕颜色信息的内存区域。显示屏可以使用颜色缓冲区在屏幕上绘制内容。将颜色缓冲区视为二维数组,其中每个 (x, y) 索引对应于屏幕上相应位置的像素。在游戏循环“生成输出”阶段的每个帧中,游戏都会将图形输出写入到颜色缓冲区。
颜色缓冲区的内存使用率取决于色彩深度(color depth),即储存1像素的颜色所用的位数,它也称为位/像素(bpp)。举个例子,一个24比特的颜色深度,红、绿、蓝每个使用8个bit。意味着有 2 24 2^{24} 224 或者说 16,777,216 种独一无二的颜色。如果游戏还要另外使用8位来存储 alpha 值,每个像素总共需要32位来存储。
一个1080p(1920 × 1080)的图像,每个像素点32位,那么大概需要的内存空间就是1920 × 1080 × 4 bytes,大概是 7.9 MB。一些现代游戏使用16位来表示 RGB 的每个组成,这可以增加颜色的数量。当然,这将导致内存的使用量是原来的两倍,一张1080p的图像就接近16MB。不过现在显卡的显存基本都有几千MB,这个使用量还是显得微不足道。
色彩的表示
要在代码中表示颜色,通常有两种方法。假如给定一个8bit的颜色值,一种方法是简单的使用非负整数值去代表每个颜色(通道,channel)。8bit色彩深度的通道,值就介于0到255之间。另外一种方法就是将这个值规范化到0.0到1.0之间。
使用浮点数的一个好处是可以不用过分地关注色彩深度。举个例子,RGB 颜色(1.0, 0.0, 0.0)是一个纯粹的红色。在8bit色彩深度下表示成非负整数是(255, 0, 0),但是如果是在16bit的色彩深度下,它不再是纯红色,而接近黑色