游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2660|回复: 8

以下是我写的一个16位色Alpha50%混合的一个函数,请高手看

[复制链接]

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2004-5-17 22:13:00 | 显示全部楼层 |阅读模式
以下是我写的一个16位色Alpha50%混合的一个函数,RGB色彩分离都正常,但混合在一起图像就不正常了,请高手看看有什么地方不对!

BOOL Alpha(BYTE * Src,BYTE * Dec,int c1,int c2)
{
        byte s;
        byte r,r1,r2,g,g1,g2,b,b1,b2;
        for (int y=0;y<188;y++)
        {
                for (int x=0;x<1000;x+=2)
                {
                        s=Src[x];
                        b1=s&31;
                        g1=s>>5;       
                                                s=Src[x+1];
                        g1=g1|(s<<5>>2);
                                                r1=s>>3;

                        s=Dec[x];
                        b2=s&31;
                        g2=s>>5;       
                                                s=Dec[x+1];
                        g2=g2|(s<<5>>2);
                                                r2=s>>3;

                        r=(r1+r2)>>1;
                        g=(g1+g2)>>1;
                        b=(b1+b2)>>1;

                        s=(g<<5)|b;
                                                Dec[x]=s;
                        s=(r<<3)|(g>>3);           
                        Dec[x+1]=s;
                }
Src+=c1;
Dec+=c2;
        }

return TRUE;
}

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-5-17 22:18:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

g1=g1|(s<<5>>2);
(s<<5>>2)可能出现运算符优先级的问题。检查一下是否是正确的结果。

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2004-5-18 00:16:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

谢谢!可是我当语句改成如下:
r=r1;
g=g1;
b=b1;
虽然没有Alpha效果,但图像颜色正常,这应该说明RGB分离与重组没问题呀!郁闷中....

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2004-5-18 09:54:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

又试了一下,红色R与兰B色混合正常,就是绿色G有问题!

1

主题

17

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2004-5-18 10:27:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

r=(r1+r2)>>1;
g=(g1+g2)>>1;
b=(b1+b2)>>1;
这几句跟:
r=(r1>>1)+(r2>>1);
g=(g1>>1)+(g1>>1);
b=(b1>>1)+(b2>>1);
不一样吧!

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2004-5-18 12:40:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

基本上一样的,混合时一点小差别没关系的!
如果给G一个固定值,就混合的没问题了!
r=(r1+r2)>>1;
g=63;
b=(b1+b2)>>1;

30

主题

90

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2004-5-18 13:10:00 | 显示全部楼层

Re: 以下是我写的一个16位色Alpha50%混合的一个函数,请高

使用union可以很方便的分离RGB分量。

class R5G6B5Color
{
private:
        union
        {
                unsigned short m_Color;
               
                struct
                {
                        unsigned short m_Red: 5;
                        unsigned short m_Green: 6;
                        unsigned short m_Blue: 5;
                };
        };

public:
        // ...
};

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2004-5-18 15:04:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

建议用汇编mmx写,比较方便。(ddraw中,我什么都用汇编写)

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2004-5-19 19:30:00 | 显示全部楼层

Re:以下是我写的一个16位色Alpha50%混合的一个函数,请高

问题解决了!
g1=g1|(s<<5>>2);这一句有问题,分开写就好了!
不过这个函数的速度太慢了,对付小一点的范围还可以!
我也想用MMX技术,但不熟悉!只好用标准汇编写了一个,速度比这个要快好几倍呀!:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 02:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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