本文讲的是TC中在VGA的256色调色板模式下,怎样做Alpha混合。这是以前做我的VGA13H Graphics Lib for TC2.0 时候写的,基本上实现了Alpha混合。缺点是速度太慢了,ARGB和GETRGB两个宏中用到了除法运算,速度就不可能快起来的。而且也犯了一个错误,在256色模式下64级的Alpha混合是没有意义的,也不可能实现,最多也只能到达4级。总之这篇文章还有很多错误,最近反复研究Alpha混合和调色板,又有新的收获,新的算法速度足以用作实时Alpha混合,等以后写成文章再和大家分享。
256色视频模式由于采用了调色板,在显存里存放的像素值实际上是是调色板的索引号,256色的BMP文件也与之类似,其数据域里存放的也是调色板的索引号,这种情况下给我们的Alpha混客带来极大的不方便。
在实际的应用中,通常是选定一个固定的调色板,然后在这个调色板下进行绘图操作。这是因为一副图像在不同的调色板下有不同的显示效果,两个采用不同调色板的位图在一般情况下是不能同屏显示的。所以通常的情况是选择一个通用的调色板,在把各个位图都抖动处理为使用这个通用调色板的位图,从而解决了同屏显示的问题。这样看来,如何选择一个通用的调色板就是关键了。
大家都知道VGA/SVGA的调色板寄存器通常为6 bits,每个寄存器存放一个颜色分量,一个RGB颜色向量就需要三个寄存器来存放,因此最多能表示 2^6*2^6*2^6=256k 种颜色,这个颜色范围是很大的。而VGA/SVGA只有256组调色板寄存器,,因此要在(0,0,0)-(63,63,63)这样一个向量空间中,精选出256个颜色向量。这有点和线性代数中求向量空间的基(极大无关组)类似。我们的任务也类似于要在(0,0,0)-(63,63,63)这个颜色空间中找出一个基。简单的说就是要找出256个颜色向量,组成一个颜色调色板,并且要使这256个颜色均匀分布于(0,0,0)-(63,63,63)这个空间中,并且还要保证其独立性。详细的做法这里不再探讨,而只给出一个比较通用的调色板。
R(i)=(i/32%8)*9;
G(i)=(i/4%8)*9;
B(i)=(i%4)*21;
其中i为寄存器组号,R(i)、G(i)、B(i)分别为该寄存器的RGB颜色分量值,这是一个从i到R(i)、G(i)、B(i)的变换式。
由此可以写出其逆变换式:
i=R/9*32+G/9*4+B/21;
做一下优化,可以不做乘法和除法运算,得到如下式子:
R(i)=(((i>>5)%8)<<3)+((i>&g