directdraw淡入淡出效果

来源:百度知道 编辑:UC知道 时间:2024/07/06 23:43:31
我Lock住了页面(16位色),需要目标点和源点混合,这是我的Alpha混合函数:

//功能:两个点的ALPHA混合(0-32)
//参数:源点,目标点,ALPHA级别
//返回:混合后的点
WORD AlphaPixel(WORD Src, WORD Dest, int Alpha)
{
WORD RSrc = (Src & 0xf800) >>11;
WORD GSrc = (Src & 0x07E0) >> 5;
WORD BSrc = (Src & 0x001F);
WORD RDest = (Dest & 0xf800) >>11;
WORD GDest = (Dest & 0x07E0) >> 5;
WORD BDest = (Dest & 0x001F);
WORD Red = ( (RSrc * Alpha) + RDest * (32-Alpha) )>>5;
WORD Green = ( (GSrc * Alpha) + GDest * (32-Alpha) )>>5;
WORD Blue = ( (BSrc * Alpha) + RDest * (32-Alpha) )>>5;
WORD Pixel = ((Red << 11) | (Green << 5) | Blue);
return Pixel;
}

但是会有锯齿,原因因该是除以32后小数部分丢失,引起的误差。怎么解决这个问题,最好能有个例子(新仙剑里的淡入淡出效果就不错,不知是如何实现的)。
E-mail:peizheng617@gmail.com

说下我自己的看法。

不知你是不是想学DirectDraw做相关开发,如果是的话,还是改学D3D吧。微软早在DX8的时候就取消了directdraw了,原因是directdraw绘制原理和D3D不同,D3D也可以做2D的东西,并且D3D支持更多directdraw不支持的功能,比如alpha混合、反走样等等,再并且,哪怕做2D的东西,D3D也要快,因为D3D可以通过显卡来加速。

你写的那个alpha混合函数,就算效率再高,也是CPU来算的,用在游戏中还是不合适。我以前看过一段时间directdraw,alpha混合是直接使用intel公司发布的一个lib,速度和显卡加速的D3D还是不能比。

像XNA中,可以用很简单的函数绘制2D图形,但是,XNA封装的原理并不是directdraw那样使用内存区块拷贝,而是D3D中的技术,先建立多边形,再做纹理映射。

呵呵,你的问题我也不会~

给你贴一篇类似的吧

用VC实现图象渐显和渐隐

摘 要 图象的渐显/渐隐被广泛运用与图象处理和多媒提娱乐软件。本文基于windows的调色板动画和时间码技术设计了通用的图象渐显和渐隐算法,并实现了其visual c++程序编码。
图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普通的全图扫描算法,则速度较慢,很难真正体现渐显/渐隐效果。

利用windows(3.x.95/98/nt)操作系统特殊的调色板管理和时间码定时机制能设计出有效的图象渐显/渐隐算法。windows提供一种被称为调色板动画(palette animation)的颜色处理技术,它通过快速改变颜色调色板中所选取的表项中的颜色能模拟颜色的变化。设置时间码,定时调用该技术使图象颜色渐变就能实现图象的渐显和渐隐。

一、调色板动画

在visual c++中实现调色板动画依赖于mfc类