游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2800|回复: 5

DDraw使用Alpha混合的问题!

[复制链接]

16

主题

154

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-12-16 01:10:00 | 显示全部楼层 |阅读模式
在16位色模式下对256色图像进行Alpha混合时能不能不使用调色板呢?

我在16位色模式下对256色图Alpha混合产生透明效果的时候,图像有点失真,这个是不是调色板的问题呢?在256模式下就没问题.

16

主题

154

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
 楼主| 发表于 2007-12-16 07:54:00 | 显示全部楼层

Re:DDraw使用Alpha混合的问题!

sPtr源地址指针,dPtr是目的地址指针

for N := Src.Left to Src.Right - 1 do
begin
  if PWord(sPtr)^ > 0 then //0表示透明色,不处理.
  begin
    //分解RGB色素.
    sR := (PWord(sPtr)^ shr 11) and $1F;
    dR := (PWord(dPtr)^ shr 11) and $1F;

    sG := (PWord(sPtr)^ shr 5) and $3F;
    dG := (PWord(dPtr)^ shr 5) and $3F;

    sB := PWord(sPtr)^ and $1F;
    dB := PWord(dPtr)^ and $1F;
   
    dR := nAlpha * (sR - dR) + dR;
    dG := nAlpha * (sG - dG) + dG;
    dB := nAlpha * (sB - dB) + dB;
    PWord(dPtr)^ := dB or (dG shl 5) or (dR shl 11);
  end;
  Inc(sPtr, 2);
  Inc(dPtr, 2);
end;

以上是我写的混合代码,外面的那层循环和锁定以及解锁的代码我没贴,这部分关键代码执行后怎么好像什么都没发生过一样呢.

6

主题

22

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 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混合,呵呵,个人之见而已.

16

主题

154

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
 楼主| 发表于 2007-12-18 02:21:00 | 显示全部楼层

Re:DDraw使用Alpha混合的问题!

我一开始的做法是读取调色板索引,然后转换成16位色.但是图像严重失真.
后来我发现在16位色模式下,用DIB格式加载的位图资源似乎是自动转换到了16位色格式.然后我直接替换目的地址的象素,但是这么做和直接Draw的效果一样.无法完全去掉透明色.之后我用上面的那个Alpha混合公式确没有任何效果!我实在想不明白为什么了.


我是刚开始学习DX编程的,不知道我说的各位大侠是否可以看的明白!
555和565的格式我知道,不过我不打算考虑555格式的问题,只针对565格式就行了.

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-12-18 10:34:00 | 显示全部楼层

Re:DDraw使用Alpha混合的问题!

都什么年代了干嘛还要用ddraw

16

主题

154

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
 楼主| 发表于 2007-12-18 10:49:00 | 显示全部楼层

Re:DDraw使用Alpha混合的问题!

我也不想用啊.我手里的代码使用了DDraw.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-17 15:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表