GameRes游戏开发资源网 http://www.gameres.com

再论游戏中特效显示原理与Alpha通道的应用
作者:王红奇
看了许多的游戏开发网站,没有多少关于alpha混合原理的介绍,有的话也没有提供一些源代码公读者进行测试。最近看了GameRes游戏开发资源网里面的一些文章,也解释的不甚详尽。现在,刚刚对游戏开发入门的读者有福了,本文不仅将详细介绍alpha混合的原理,还包括实现代码奉献给大家,还有不少篇幅关于alpha通道文件的制作。相信一般读者看了本文后,基本上能够明白那些炫目的游戏特效是如何实现的;并且在我们自己开发的一些小游戏中也不需要动用那些复杂的DIRECTX,OPENGL等等的内容。
下面请看本文的详细内容:
还是先讲一下alpha贴图是如何制作的吧,其实也很简单,用photoshop软件制作完如图片1所示的炫光特效后,保存该图片作为图片1(具体方法为“文件”-“保存”,然后选择“格式”当中的BMP格式(
为方便本软件的测试,所以选择这种格式,当然了,你知道原理后也可以改成其他文件格式);下面制作alpha通道文件,其实也很简单,你执行如下菜单命令:图像-模式-灰度,然后保存为BMP格式文件。你也可以在我们提供的软件包中得到该文件。
如果你使用的DELPHI7这个编程环境,恭喜你,你现在立即可以打开我们附送的软件包内的工程文件进行测试。如果你不熟悉DELPHI7,对Visual Studio6 C++熟悉的朋友,我们为你提供了一个.EXE文件,让你也可以看看最直接的效果(呵呵),你可以打开软件包中的Unit1.pas查看具体的实现代码。
现在我们来分析一下代码吧!
for i := 0 to image1.height - 1 do //图片4的高度
begin
for j := 0 to image1.Width - 1 do //图片4的宽度
begin
//alpha 值
r := GetRValue(image2.Canvas.Pixels[i, j]); //取得 alpha(图片2)通达某个颜色分量
//g := GetGValue(image2.Canvas.Pixels[i,j]); //因为r、g、b都相等的
//b := GetBValue(image2.Canvas.Pixels[i,j]); //所以取其中的任意一个
r1 := GetRValue(image1.Canvas.Pixels[i, j]);// 取得(图片1)RGB颜色分量
g1 := GetGValue(image1.Canvas.Pixels[i, j]);
b1 := GetBValue(image1.Canvas.Pixels[i, j]);
r2 := GetRValue(image3.Canvas.Pixels[i, j]); // 取得(图片3)RGB颜色分量
g2 := GetGValue(image3.Canvas.Pixels[i, j]);
b2 := GetBValue(image3.Canvas.Pixels[i, j]);
r2 := (r1 * r + r2 * (255 - r)) div 255; //这个是alpha的混合公式
g2 := (g1 * r + g2 * (255 - r)) div 255;
b2 := (b1 * r + b2 * (255 - r)) div 255;
image4.Canvas.Pixels[i, j] := RGB(r2, g2, b2); //合成图片4,进行混合显示
end;
end;
好了,通过简单的代码分析,你一定可以理解图片4是如何得到的,如果你在具体的操作过程中不能得到上面的效果原因大致如下:
我们要求上面得三张图片格式,大小一致(要求24位的BMP文件,这是为了方便我们进行演示而作的规定)。
最后再啰嗦一句:其实在一般的小游戏中你只要熟悉了其中的一些原理,大可不必使用directx或opengl等等工具,就像上面的代码经过优化,游戏画面的帧频绝对可以做到符合你的要求。
最后声明:
1.本文以及所附带的软件包仅特供给GameRes游戏开发资源网!其他需要此文的单位必须保留本作者的联系QQ。
2.如果你确实需要C++的版本请联系我们。
附件:http://dev.gameres.com/Program/Visual/2D/DelphiAlpha.zip (1.4MB)
作者:王红奇
GameRes游戏开发资源网 http://www.gameres.com