游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2501|回复: 6

谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

[复制链接]

12

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2004-12-18 14:27:00 | 显示全部楼层 |阅读模式
我在“文档”那一栏里搜一吓``发现有很多关于Alpha的文章``我现在知道要做透明图应该要做哪些事`但是不知道怎样组织起来``请高手给段简单的代码``谢谢!

12

主题

36

帖子

40

积分

注册会员

Rank: 2

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

Re:谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

谁有啊``给一个啦`

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2004-12-18 17:42:00 | 显示全部楼层

Re:谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

顺便问一下,3d编程需要研究alpha混合吗?
————事实充分证明了我很傻,而且很懒…………不用回答了,答案是肯定的————需要!

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2004-12-19 16:13:00 | 显示全部楼层

Re:谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

你把下面的代码拷过去看看,然后只要调用Alpha函数就可以实现透明处理了,代码有说明
//*********************透明处理*******
bool Alpha(LPDIRECTDRAWSURFACE7 lpDDSbMap,        //背景图片
                                 LPDIRECTDRAWSURFACE7 lpDDSMap,   //目标图片
                                 LPDIRECTDRAWSURFACE7 lpDDSbuffer,//用于存放混合后的图象,即你想要最后效果图
                                 int x,int y,int w,int h,         //透明处理的区域。w,h分别为宽,高
                                 float alpha)                     //透明度,0为透明,1为不透明               
{
        DDSURFACEDESC2 ddsd1;
        DDSURFACEDESC2 ddsd2;
        DDSURFACEDESC2 ddsd3;
        ZeroMemory(&ddsd1,sizeof(ddsd1));
        ddsd1.dwSize=(sizeof(ddsd1));
        ZeroMemory(&ddsd2,sizeof(ddsd2));
        ddsd2.dwSize=(sizeof(ddsd2));
        ZeroMemory(&ddsd3,sizeof(ddsd3));
        ddsd3.dwSize=(sizeof(ddsd3));
        if ((lpDDSMap->Lock(NULL,&ddsd1,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)==DD_OK)&&
                (lpDDSbMap->Lock(NULL,&ddsd2,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)==DD_OK)&&
                (lpDDSbuffer->Lock(NULL,&ddsd3,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)==DD_OK))
        {
        for(int y0=0;y0<h;y0++){
                for(int x0=0;x0<w;x0++){
                        USHORT color1=ReadPixel16(x0,y0,(USHORT*)ddsd1.lpSurface,(int)ddsd1.lPitch);
                        USHORT color2=ReadPixel16(x+x0,y+y0,(USHORT*)ddsd2.lpSurface,(int)ddsd2.lPitch);
                        USHORT color=AlphaPixel15(color1,color2,alpha);
                        PlotPixel16(x+x0,y+y0,color,(USHORT*)ddsd3.lpSurface,(int)ddsd3.lPitch>>1);
                }}

                lpDDSMap->Unlock(NULL);//解锁
                lpDDSbMap->Unlock(NULL);//解锁
                lpDDSbuffer->Unlock(NULL);//解锁
        }
        else return FALSE;
        return TRUE;
}
inline void PlotPixel16(int x,int y,USHORT color,USHORT* buffer,int nPitch)
{
        buffer[y*nPitch+x]=color;
}

inline USHORT ReadPixel16(int x,int y, USHORT* buffer,int nPitch)
{
        return buffer[y*(nPitch>>1)+x];
}

inline USHORT AlphaPixel16(USHORT color1,USHORT color2)
{
        UCHAR r,g,b;
        r=(((color1&0xf800)>>11)+((color2&0xf800)>>11))>>1;
        g=(((color1&0x07e0)>>5)+((color2&0x07e0)>>5))>>1;
        b=((color1&0x001f)+(color2&0x001f))>>1;
        return RGB_16BIT565(r,g,b);
}

inline USHORT AlphaPixel15(USHORT color1,/*透明图*/
                                                   USHORT color2,/*背景图*/
                                                   float pct/*不透明度*/)
{
        if(pct>1)pct=(float)1;
        UCHAR r,g,b;
        r=(UCHAR)((float)((color1&0xf800)>>11)*pct+
                (float)((color2&0xf800)>>11)*(1-pct));
        g=(UCHAR)((float)((color1&0x07e0)>>5)*pct+
                (float)((color2&0x07e0)>>5)*(1-pct));
        b=(UCHAR)((float)(color1&0x001f)*pct+
                (float)(color2&0x001f)*(1-pct));
        return RGB_16BIT565(r,g,b);
}

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2004-12-19 16:21:00 | 显示全部楼层

Re:谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

实现语句:把lpBmp[1]和lpBmp[2]用80%的透明度处理,然后存放在lpBack里,再显示出来
Alpha(lpBmp[1],lpBmp[2],lpBack,0,0,100,100,(float)0.8);
lpDDSprimary->Blt(NULL,lpBack,NULL,DDBLT_WAIT,NULL);

           

12

主题

36

帖子

40

积分

注册会员

Rank: 2

积分
40
 楼主| 发表于 2004-12-19 23:38:00 | 显示全部楼层

Re:谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

哈哈``谢谢雨夜寒星``!看了你的代码``我已经知道怎样做了``还想请问一吓``RGB_16BIT565东西`在你那里是怎样定义的?

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2004-12-20 13:55:00 | 显示全部楼层

Re: 谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`

[em10] 不好意思啊,昨天急了点,忘了仔细看了。现在补上:
#define RGB_16BIT565(r,g,b)((r<<11)|(g<<5)|(b))
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 19:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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