不说废话了,切入正题。本来我以为逆向文件格式很难,分析出来后,发现使用D3D逼真地把图片渲染出来更费脑筋,今天自己试验出了一个融合技术,在图片文件没有Alpha通道的情况下,能没有锯齿地将图片渲染出来,这个技术肯定有在使用,但是网上找不到资料,所以我就分享下。
我们先来看看一个特效的某一帧:(RO里的怒雷技能)
再看看它都使用的某些图片:
为了节省空间,其他图片略去。.str文件的作用就是告诉你该怎样把这些图片组合起来形成每一帧。这个不是这篇日志的重点,跳过继续。
那么,图片的黑色怎么去掉?。
如果你的第一反应是COLORKEY,那就错了,COLORKEY我觉得完全是2D时代遗留下来的,用D3D的话,完全可以用AlphaBlend达到和COLOREY一样的效果,但是前提是,你的图片要提供Alpha通道,你可以用工具转换,也可以叫美工保存Alpha通道。但是都有一个共同点:麻烦,需要很细致的抠图功底。
如果没有Alpha通道呢?那就只有COLORKEY了?我刚开始也一直这么认为,可是怎么渲染都不对,你会发现整个图片有很多锯齿,因为素材原图都很细致。
怎么可能,明明RO客户端可以很好的显示出来,我怎么不行?我百思不得其解,也Google不到任何资料。最后终于自己试验出方法。诀窍就是AlphaBlend的一个状态:
DXUTGetD3D9Device()-> SetRenderState(D3DRS_DESTBLEND,D3DBLEND_DESTALPHA);
D3DBLEND_DESTALPHA?不是D3DBLEND_INVSRCALPHA吗?。。。如果你Google,你根本找不到使用D3DBLEND_DESTALPHA状态的例子,关于AlphaBlend状态,几乎都用的D3DBLEND_INVSRCALPHA。
为什么用D3DBLEND_DESTALPHA,你会发现其实图片的黑色背景其实是比较特别的,它和背景缓冲的颜色相同。这样的话,当AlphaBlend开启时,所有黑色都被去除,而且这里的去除就直接是在缓冲区里去除了,不会有锯齿。
但是这个解决方法有一个弊端,最终像素受目标像素影响较大,比如下面2个图:
你会看到,背景越浅,效果也越浅,但是这样也合乎情理,在越暗的地方,施放的技能也就越绚。
一个折中办法是,如果某个技能图片不是很细致,可以把这个图片设置成分红255,0,255,再使用COLORKEY来渲染这个图片,比如下图:
这个天使貌似很痛苦,而且如果她的颜色变浅,那就看不清楚了,正好她和背景区分比较明显,对她可以用COLORKEY渲染。
OVER,又是一篇泛泛而谈的文章,希望读者参考后自己查阅详细资料效果更好,另,其实至于为什么设置D3DBLEND_DESTALPHA后融合会是那种效果,我尝试用融合方程推导,无解。有谁知道的忘告知~
最后,OpenRO进度还不错。。。现在又希望项目改名,不用RO的名字,做一个独立游戏出来。这样的话,图片素材得修改,地图也得修改。动画编辑器和地图编辑器都有,但是没有美工。有谁有兴趣的提前联系我,策划也行。。打算做出DEMO再找人的。。。
最新评论