游戏开发论坛

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

请教:alpha的问题

[复制链接]

4

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2004-11-29 17:07:00 | 显示全部楼层 |阅读模式
谁有半透明的最好的算法(c/c++)共享一下,代码思想均可~
谢谢 [em4]

24

主题

57

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2004-11-29 21:08:00 | 显示全部楼层

Re:请教:alpha的问题

//32位混合公式
inline UINT CDirectDraw::Alpha(UINT Sour, UINT Dest, int aValue)
{
        UINT R=Dest&0x00ff0000;
        UINT G=Dest&0x0000ff00;
        UINT B=Dest&0x000000ff;
        UINT A=Dest&0xff000000;
        UINT R1=Sour&0x00ff0000;
        UINT G1=Sour&0x0000ff00;
        UINT B1=Sour&0x000000ff;
        UINT A1=Sour&0xff000000;
        UINT R2=(((R1*(256-aValue))+(R*aValue)) >>8)&0x00ff0000;
        UINT G2=(((G1*(256-aValue))+(G*aValue)) >>8)&0x0000ff00;
        UINT B2=(((B1*(256-aValue))+(B*aValue)) >>8)&0x000000ff;
        UINT A2=(((A1*(256-aValue))+(A*aValue)) >>8)&0xff000000;
        UINT result=(R2+B2+G2+A2);
        return result;
}

24

主题

57

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2004-11-29 21:09:00 | 显示全部楼层

Re:请教:alpha的问题

HRESULT CDirectDraw::AlphaBlt(int x, int y, LPDIRECTDRAWSURFACE7 pDDS, RECT *pSourRect, bool bColorKeyed, int iAlpha)
{
        if(!pDDS)
                return S_OK;
        if(iAlpha>255 || iAlpha<0)
                return BltFast(x,y,pDDS,pSourRect,bColorKeyed);

        DDSURFACEDESC2 ddsd,ddsdthis;
        ZeroMemory(&ddsd,sizeof(ddsd));
        ddsd.dwSize=sizeof(ddsd);
        ZeroMemory(&ddsdthis,sizeof(ddsdthis));
        ddsdthis.dwSize=sizeof(ddsdthis);

        pDDS->GetSurfaceDesc(&ddsd);//得到两个表面的描述
        this->m_lpBackSurface->GetSurfaceDesc(&ddsdthis);

        RECT rtSour,rtClip;//源表面,背景表面的矩形
        if(!pSourRect)
        {
                rtSour.top=0;
                rtSour.bottom=ddsd.dwHeight;
                rtSour.left=0;
                rtSour.right=ddsd.dwWidth;
        }
        else//裁剪源表面
        {
                rtSour.bottom=pSourRect->bottom;
                rtSour.left=pSourRect->left;
                rtSour.right=pSourRect->right;
                rtSour.top=pSourRect->top;
                if(rtSour.top<0)
                        rtSour.top=0;
                if(rtSour.left<0)
                        rtSour.left=0;
                if(rtSour.right>(int)ddsd.dwWidth)
                        rtSour.right=ddsd.dwWidth;
                if(rtSour.bottom>(int)ddsd.dwHeight)
                        rtSour.bottom=ddsd.dwHeight;
        }

        rtClip.top=0;
        rtClip.left=0;
        rtClip.right=ddsdthis.dwWidth;
        rtClip.bottom=ddsdthis.dwHeight;

        if(x<rtClip.left)
        {
                rtSour.left-=x;//右移动
                x=rtClip.left;
        }
        if(y<rtClip.top)
        {
                rtSour.top-=y;//下移动
                y=rtClip.top;
        }
        if(x+rtSour.right-rtSour.left>rtClip.right)
        {
                rtSour.right=rtSour.left+rtClip.right-x;
        }
        if(y+rtSour.bottom-rtSour.top>rtClip.bottom)
        {
                rtSour.bottom=rtSour.top+rtClip.bottom-y;
        }

        DDSURFACEDESC2 ddsddest;
        DDSURFACEDESC2 ddsdsour;
        ZeroMemory(&ddsddest,sizeof(ddsddest));
        ZeroMemory(&ddsdsour,sizeof(ddsdsour));
        ddsddest.dwSize=sizeof(ddsddest);
        ddsdsour.dwSize=sizeof(ddsdsour);

        DDCOLORKEY ddck;
        if(bColorKeyed)
        {
                pDDS->GetColorKey(DDCKEY_SRCBLT,&ddck);
        }
        HRESULT result;
        while(1)
        {
                result=m_lpBackSurface->Lock(NULL,&ddsddest,DDLOCK_WAIT,NULL);
                if(result==DD_OK)
                        break;
                if(result==DDERR_SURFACELOST)
                {
                        result = m_lpDD7->RestoreAllSurfaces();
                }
                else
                        return result;
        }
        while(1)
        {
                result=pDDS->Lock(NULL,&ddsdsour,DDLOCK_WAIT,NULL);
                if(result==DD_OK)
                        break;
                if(result==DDERR_SURFACELOST)
                {
                        result = m_lpDD7->RestoreAllSurfaces();
                }
                else
                        return result;
        }

        UINT*DestBuf=(UINT*)ddsddest.lpSurface;
        UINT*SourBuf=(UINT*)ddsdsour.lpSurface;
        int SourWidth=ddsdsour.lPitch>>2;//32位色深,每个象素4个字节
        int DestWidth=ddsddest.lPitch>>2;
        int DestStart=DestWidth*y+x;
        int SourStart=SourWidth*rtSour.top+rtSour.left;
        int SourOff=SourWidth-rtSour.right+rtSour.left;                 
        int DestOff=DestWidth-rtSour.right+rtSour.left;
        int H=rtSour.bottom-rtSour.top;
        int W=rtSour.right-rtSour.left;
        if(!bColorKeyed)
        {
                for(int iy=0;iy<H;iy++)
                {
                        for(int ix=0;ix<W;ix++)
                        {
                                DestBuf[DestStart]=Alpha(DestBuf[DestStart],SourBuf[SourStart],iAlpha);               
                                SourStart++;DestStart++;
                        }
                        SourStart+=SourOff;
                        DestStart+=DestOff;
                }
        }
        else
        {
                for(int iy=0;iy<H;iy++)
                {
                        for(int ix=0;ix<W;ix++)
                        {
                                if(SourBuf[SourStart]!=ddck.dwColorSpaceHighValue)         
                                        DestBuf[DestStart]=Alpha(DestBuf[DestStart],SourBuf[SourStart],iAlpha);
                                SourStart++;DestStart++;
                        }
                        SourStart+=SourOff;
                        DestStart+=DestOff;
                }
        }
        this->m_lpBackSurface->Unlock(NULL);
        pDDS->Unlock(NULL);
        return S_OK;

}
是我很久前写的,高手指点下。是32位色的混合函数,不知道怎么优化下,除了汇编方式

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-11-30 09:16:00 | 显示全部楼层

Re:请教:alpha的问题

最好用MMX做优化

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-11-30 09:17:00 | 显示全部楼层

Re:请教:alpha的问题

对象素点运算那部分

4

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2004-11-30 09:33:00 | 显示全部楼层

Re:请教:alpha的问题

谢谢~我先分析一下~

4

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2004-11-30 09:34:00 | 显示全部楼层

Re: Re:请教:alpha的问题

游戏战士: Re:请教:alpha的问题

最好用MMX做优化


我只学过8086汇编
对于mmx不了解~先学个思想 [em1]

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-30 11:46:00 | 显示全部楼层

Re:请教:alpha的问题

最高效的方法是分级写代码
不过现在不需要了,,会累死人的

软2D优化的最重要的是:内存对齐

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20686
发表于 2004-11-30 13:34:00 | 显示全部楼层

Re:请教:alpha的问题

资料库里应该有不少关于alpha混合算法的介绍,楼主可以先参考一下,说不定能帮得上楼主.
http://articles.gameres.com/articles.asp?style=a&page=1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 11:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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