|
发表于 2007-12-17 19:47:00
|
显示全部楼层
Re: DDraw使用Alpha混合的问题!
你的问题在于两种颜色并不相同,所以不能混用,要想在16位模式下正确显示256色位图,必需把256色转换成16位真彩格式才行,具体过程如下:
1.从256色图像像素中取得调色板索引,然后通过索引取得32位的像素颜色.
2.转换32位颜色到16位颜色,16位有555和565两种格式,转换方法是不一样的.
3.把转换后的像素与帧缓存中的颜色进行Alpha混合,再写入显存.
下面是两个转换像素的函数:
#define SCALE_5 31.0f/255.0f
#define SCALE_6 63.0f/255.0f
WORD To16_555( DWORD dwColor )
{
BYTE r = ( ( ( dwColor >> 16 ) & 0xFF ) * SCALE_5 );
BTYE g = ( ( ( dwColor >> 8 ) & 0xFF ) * SCALE_5 );
BYTE b = ( ( ( dwColor ) & 0xFF ) * SCALE_5 );
return ( ( 1 << 15 ) |
( ( r << 10 ) & 0x1F ) |
( ( g << 5 ) & 0x1F ) |
( b &0x1F ) );
}
WORD To16_565( DWORD dwColor )
{
BYTE r = ( ( ( dwColor >> 16 ) & 0xFF ) * SCALE_5 );
BTYE g = ( ( ( dwColor >> 8 ) & 0xFF ) * SCALE_6 );
BYTE b = ( ( ( dwColor ) & 0xFF ) * SCALE_5 );
return ( ( ( r << 11 ) & 0x1F ) |
( ( g << 5 ) & 0x3F ) |
( b &0x1F ) );
}
最后说一下,不要在ddraw下进行alpha混合,哪是自找苦吃,不但要自已转换像素,还要自已混合,而且如果不用SSE/3DNow指令对代码进行优化,速度会慢如蜗牛的.如果要支持多种像素格式,还要每种格式写一套,会写死人的,本人用过ddraw几年了,对ddraw已经烂熟了,但是从不使用它做alpha混合,呵呵,个人之见而已. |
|