真彩色转成高彩色的快速算法
作者:rain 日期:2006-02-25
为什么要实时转换颜色深度?
通常, 2D 游戏中的位图, 无论在外存中按什么颜色深度存放, 加栽后都被转换成了需要的颜色深度. 我们不太注意颜色深度转换说需要的时间.
但是, 现在不同了. 云风未来的计划中, 最重要的一项是制作一个超级 2D 引擎. 将支持 Voxel 物体和实时光线处理这样的特性, 而且在光线处理中, 32 级的光线亮度级别也远远不够, 所以, 未来的 2D 游戏的发展趋势应该是采用真彩色, 至少是在内部运算时使用. 在某些场合下, 我们可能需要做 15/16bit 高彩色的输出, 所以有必要找到更快的方法实时处理.
通常, 2D 游戏中的位图, 无论在外存中按什么颜色深度存放, 加栽后都被转换成了需要的颜色深度. 我们不太注意颜色深度转换说需要的时间.
但是, 现在不同了. 云风未来的计划中, 最重要的一项是制作一个超级 2D 引擎. 将支持 Voxel 物体和实时光线处理这样的特性, 而且在光线处理中, 32 级的光线亮度级别也远远不够, 所以, 未来的 2D 游戏的发展趋势应该是采用真彩色, 至少是在内部运算时使用. 在某些场合下, 我们可能需要做 15/16bit 高彩色的输出, 所以有必要找到更快的方法实时处理.
Tags: 颜色
计算机的颜色模式(Cloud)
作者:rain 日期:2006-02-24
我们所使用的 PC 机的显示器的颜色显示采用的是 RGB 模式, 就是说那缤纷的色彩都是由红, 绿, 蓝 三种颜色构成的. 最初的机器内存(显存)昂贵, 所以采用调色板机制来节省显存, 使用的显示模式便是我们所熟知的 256 色模式. (标准 VGA 下的 0x13 模式即为 256 色的) 在这个模式下所有的点由 64 级红色, 64 级绿色, 64 级蓝色构成. 而将需要用到的 256 种颜色配好后放到调色板中, 而显存里则存放调色板的序号(0~255). 用这种方式, 我们可以得到丰富的色彩, 又不必消耗太多的内存, 在以前内存昂贵, 硬件速度偏慢的年代,无疑是是一种既节约内存,又能提高处理图形速度的好方法. 而后来内存的价格急剧下降,显卡配上 1M 以上的显存已经不是什么奢侈的事, 而且主板上的内存也越来越多,能够处理的数据量也比以前大的好几倍; 而 CPU 更能处理 32 位数据, 这样 8 位(256色) 显示模式简直毫无优势可言, 16 位色即将成为标准.
话说这 16 位色, 实际上就是直接用 16 bit 去描述屏幕上的每个点, 其中红色占 5 位,绿色占 6 位,蓝色占 5 位. (为了某些处理上的方便, 许多显卡支持所谓 15 位色, 就是将蓝色也用 5 bit 表示) 使用这种直接描述颜色的方式最大的方便之处在于实时光影的效果,透明色的计算.例如在游戏中实时运算爆破的火光和景物的叠加, 就可以利用 Alpha 混合算法计算出火焰的色彩值直接反映在屏幕上. 另外, 象 3D 引擎中常用的诸如雾化等都需要对颜色进行实时的运算, 所以如今的 3D 加速卡都没有支持间接表现颜色的 256 色模式. 可话说回来, 在特定的情况下 256 色有着 64K (16 位)色无可比拟的地方, 它终究是 18 bit 色彩, 在红和绿色上拥有多出 64k 色下一倍的颜色级别, 运用得当, 将有更强的表现力.
当然机器足够扎实的话, 24bit 色是你无悔的选择, 每种基色 256 个级别, 相信再好的眼睛也无法分辨出相邻两级颜色. 故而, 24bit (16M) 色号称真彩. 在真彩模式下, 绘出一渐变绿色条,人眼不会有跳跃性颜色过渡的. (而在 64k 色模式下却有). 所以随着显示器的增大,玩家会去追求更高的分辨率确不会要求超过 16M 色的色彩. 另一 32bit 色彩模式已经不再去增加基色占有的位长, 它或是留下 8 位的 alpha 通道, 或是干脆空出 8 位, 充分利用 CPU 一次处理 32 bit 字长的威力, 所以 32bit 模式在一般情况下都是以空间换时间的做法, 32bit 模式快于 24 bit 模式 ;-) 真彩唯一的缺陷是我们现今的机器还不足以飞快的处理,而游戏中使用的图象信息的大小也会随着每点占字节数的增加而成倍的增大体积.
话说这 16 位色, 实际上就是直接用 16 bit 去描述屏幕上的每个点, 其中红色占 5 位,绿色占 6 位,蓝色占 5 位. (为了某些处理上的方便, 许多显卡支持所谓 15 位色, 就是将蓝色也用 5 bit 表示) 使用这种直接描述颜色的方式最大的方便之处在于实时光影的效果,透明色的计算.例如在游戏中实时运算爆破的火光和景物的叠加, 就可以利用 Alpha 混合算法计算出火焰的色彩值直接反映在屏幕上. 另外, 象 3D 引擎中常用的诸如雾化等都需要对颜色进行实时的运算, 所以如今的 3D 加速卡都没有支持间接表现颜色的 256 色模式. 可话说回来, 在特定的情况下 256 色有着 64K (16 位)色无可比拟的地方, 它终究是 18 bit 色彩, 在红和绿色上拥有多出 64k 色下一倍的颜色级别, 运用得当, 将有更强的表现力.
当然机器足够扎实的话, 24bit 色是你无悔的选择, 每种基色 256 个级别, 相信再好的眼睛也无法分辨出相邻两级颜色. 故而, 24bit (16M) 色号称真彩. 在真彩模式下, 绘出一渐变绿色条,人眼不会有跳跃性颜色过渡的. (而在 64k 色模式下却有). 所以随着显示器的增大,玩家会去追求更高的分辨率确不会要求超过 16M 色的色彩. 另一 32bit 色彩模式已经不再去增加基色占有的位长, 它或是留下 8 位的 alpha 通道, 或是干脆空出 8 位, 充分利用 CPU 一次处理 32 bit 字长的威力, 所以 32bit 模式在一般情况下都是以空间换时间的做法, 32bit 模式快于 24 bit 模式 ;-) 真彩唯一的缺陷是我们现今的机器还不足以飞快的处理,而游戏中使用的图象信息的大小也会随着每点占字节数的增加而成倍的增大体积.
Tags: 颜色
555到565颜色格式的转换
作者:rain 日期:2006-02-24
如果我们现有的图像资源是555,而显示格式是565的,那么,我们把图像资源读入时就要先进行转换,这种转换不是简单的加一个零位,而是要对应颜色位进行移位合并。具体方法如下:
首先,我们要知道自己的图像资源的颜色格式,一般是b5g5r50(bbbbbgggggrrrrr0,riva128的存储方式)。
接下来,获取主表面的像素格式。用GetPixelFormat函数可以实现,当然,我们不应每读取一个图像就调用一次,用一个数组保存每一种颜色的起始像素位和跨度更好。另外,由于GetPixelFormat获得的是三种颜色的掩码,所以要自己写一个函数来根据掩码确切获得颜色的起始像素位和跨度。下面是例程:
WORD pf[3][2];//pf[0]是红色pf[0]是绿色pf[0]是蓝色
首先,我们要知道自己的图像资源的颜色格式,一般是b5g5r50(bbbbbgggggrrrrr0,riva128的存储方式)。
接下来,获取主表面的像素格式。用GetPixelFormat函数可以实现,当然,我们不应每读取一个图像就调用一次,用一个数组保存每一种颜色的起始像素位和跨度更好。另外,由于GetPixelFormat获得的是三种颜色的掩码,所以要自己写一个函数来根据掩码确切获得颜色的起始像素位和跨度。下面是例程:
WORD pf[3][2];//pf[0]是红色pf[0]是绿色pf[0]是蓝色
Tags: 颜色






