游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4531|回复: 13

两个图片Alpha混合问题

[复制链接]

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
发表于 2004-6-1 15:33:00 | 显示全部楼层 |阅读模式
今天搞了一个两个图片的Alpha混合程序,但是有一个问题,其中一个页面装载的图片变形了,我用的是两个页面,一个缓冲页面,一个离屏页面,那个离屏的有点问题,不知道为什么,另外我是分离出RGB来运算的,速度好慢啊
sf_200461153336.jpg

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2004-6-1 19:23:00 | 显示全部楼层

Re:两个图片Alpha混合问题

第一个问题应该是象素位置搞错了,请检查你的计算公式
第二个问题是因为缓冲页面和离屏页面分别在显存和系统内存里,
二者交换数据是比较慢的,建议在系统内存里混合好了再复制到缓冲页面

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
 楼主| 发表于 2004-6-2 09:04:00 | 显示全部楼层

Re:两个图片Alpha混合问题

谢了,我检查检查

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
 楼主| 发表于 2004-6-2 09:17:00 | 显示全部楼层

Re:两个图片Alpha混合问题

不行啊,换成系统内存了,还是不行

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2004-6-2 11:00:00 | 显示全部楼层

Re:两个图片Alpha混合问题

??
把你的程序贴上来看看

18

主题

135

帖子

143

积分

注册会员

Rank: 2

积分
143
发表于 2004-6-2 11:05:00 | 显示全部楼层

Re:两个图片Alpha混合问题

我顶

4

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2004-6-4 15:35:00 | 显示全部楼层

Re:两个图片Alpha混合问题

顶。我也遇到类似问题。建议贴出主程序

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-6-4 18:06:00 | 显示全部楼层

Re:两个图片Alpha混合问题

原因很简单。。。慢的原因是因为你所你的后备缓冲是开在显存里的,用CPU操作显存当然慢了。。。。至于你上面的画面问题我也遇到过,原因:
由于显存中的  lpitch 因为DX在分配显存的时候有一些额外的空间.而你把数据从内存中读到显存中就会出现上面的问题了。。。。解决方法:
开辟3个叶面:1:图片1        2:图片2      3:1和2混合后的叶面

然后在把3的内容用bltfast复制到后备缓冲区中。。。。。问题就解决了!!

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
 楼主| 发表于 2004-6-5 00:48:00 | 显示全部楼层

Re:两个图片Alpha混合问题

现泻了,我试一试

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
 楼主| 发表于 2004-6-10 17:36:00 | 显示全部楼层

Re:两个图片Alpha混合问题

就是这段代码了,还是有问题,创建离屏页面lpDDSBack时是这样的:DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY
,lpDDSBuffer是后台缓冲
到底什么错误,那位大侠指点一下,多谢了!
//start
DDSURFACEDESC2 ddsdDest,ddsdSour;
ZeroMemory(&ddsdDest,sizeof(ddsdDest));
ZeroMemory(&ddsdSour,sizeof(ddsdSour));
ddsdDest.dwSize=sizeof(ddsdDest);
ddsdSour.dwSize=sizeof(ddsdSour);

DDReLoadBitmap(lpDDSBack,"1.BMP");                       
DDReLoadBitmap(lpDDSBuffer,"2.BMP");

ddrval = lpDDSBack->Lock(NULL, &ddsdSour, DDLOCK_WAIT, NULL );

if( ddrval == DDERR_SURFACELOST )
{
        ddrval = lpDD->RestoreAllSurfaces();
        if( ddrval != DD_OK ) return( false );
}

ddrval = lpDDSBuffer->Lock(NULL, &ddsdDest, DDLOCK_WAIT, NULL );
if( ddrval == DDERR_SURFACELOST )
{
        ddrval = lpDD->RestoreAllSurfaces();
        if( ddrval != DD_OK ) return( false );
}

WORD * DSF = (WORD *)ddsdSour.lpSurface;
WORD * DDF = (WORD *)ddsdDest.lpSurface;

static int alpha=0;
static int k=1;

int index=0;

for(int y=0;y<480;y++)
{
        for(int x=0;x<640;x++)
        {       
        DDF[index]=_Alpha_Pixel(DSF[index],DDF[index],alpha);       
        index++;
        }
}

alpha+=k;
if(alpha>31)
{
    k=-k;
    alpha=31;
}

if(alpha<0)
{
   k=-k;
   alpha=0;
}

ddrval = lpDDSBack->Unlock(NULL);
if( ddrval != DD_OK ) return( false );
ddrval = lpDDSBuffer->Unlock(NULL);
if( ddrval != DD_OK ) return( false );
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 21:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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