【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3830|回复: 10

请问如何在2d游戏中实现纹理混合?

[复制链接]
发表于 2009-10-11 23:50:06 | 显示全部楼层 |阅读模式
即采用ID3DXSprite进行2D游戏开发中,想实现两张图片饱和度的混合。(用于魔法等效果)
非Directx中,我是取得要混合的两张图片的rgb值,相加得到新的图片,来实现的。
请问,在dx9 使用sprite的情况下如何实现这个效果?
google了一晚上,只是感觉应该用多重纹理混合,具体怎么操作就不知道了。
使用sprite的时候可以实现多重纹理混合吗?
请教高手,我应该如何做?
ps:如果有方法可以把两个材质混合后得到一个新的材质也成:)
 楼主| 发表于 2009-10-12 18:49:01 | 显示全部楼层
 一天没人来啊!
问题还没有解决!
顶~
期待能帮我解决问题的朋友!
 楼主| 发表于 2009-10-12 23:07:15 | 显示全部楼层
 自己顶
 楼主| 发表于 2009-10-13 21:03:25 | 显示全部楼层
 2 / 44
...
有人看没人顶
发表于 2009-10-13 21:20:55 | 显示全部楼层
实现混合 那种效果呢??有没有网上的图片及效果 看了才知道怎么回事~
 楼主| 发表于 2009-10-14 11:47:28 | 显示全部楼层
  

感谢admin的回帖。
哦,具体内容请看下面的介绍。
我提问的是第二种饱和混合的方式,alpha很简单,直接在draw最后的参数修改颜色的alpha通道就可以了
这个是从gameres copy过来的。地址:http://dev.gameres.com/Program/Visual/2D/SkillEffect.htm

这个是用cpu计算的。。。
请问directx中如何用硬件加速的方式实现这个功能?
--------------------------------------------------------------------

2D游戏中的技能特效

    在我们的2D图形游戏中不可缺少大量的光影、技能特效,像Diablo II中的魔法效果的实现,幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合,接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。

一、Alpha混合特效
    Alpha混合可以让我们让我们将一张图象按一定程度的比例与另一张图象进行混合(如图 1),但普通的Alpha混合并不适合游戏中的技能特效的显示,这时候我们只需要添加一些数据让混合更准确些,为了实现这样的效果,我们往图象中加入 Alpha通道数据(如图2),然后我们再根据通道数据来进行混合就可得到如图3的混合效果,现在看起来是不是更像特效了。  
    不过问题始终还是有的,只要仔细观察,不难发现在图3中的特效周围有黑影,这似乎给我们的技 能效果添加了一点瑕疵,为什么会这样?因为我们的程式是根据图象上的通道数据来进行不同程度的Alpha混合处理,但在特效边缘实际上RGB色彩值更接近 于黑色(R=0、G=0、B=0),一旦这样混合后,周围肯定会产生黑边,不过可以放心,这里我们可以用一个简单的技巧来轻松避免黑边的产生,那就是将图 2中的RGB色彩图用灰色背景来填充,这样在混合之后就没有黑边,至少看起来没有以前明显了,这里没有最后效果图,最后的效果还是由你自己的程式来实现 吧。

图1
普通的整图Alpha混合

图2

图3
Alpha+通道混合的效果

图4
色彩饱和处理的效果

二、色彩饱和特效
    与Alpha混合相比,色彩饱和更适合于特效的制作,无论从性能上讲,还是从效果上说,色彩饱和比Alpha混合更胜一筹(如图4)。可能因为色彩饱和的算法过于简单,很少有进行介绍的,我们先就对色彩饱和的方法来进行介绍一下,混合公式:

    R1、G1、B1 : 图象像素点的源色值;
    R2、G2、B2 : 底图像素点的源色值;
    R = R1 + R2;( IF R > 255 THEN R = 255 )
    G = G1 + G2;( IF G > 255 THEN G = 255 )
    B = B1 + B2;( IF B > 255 THEN B = 255 )

R、G、B就是我们所需的混合结果。
    可 能你会觉得这么复杂的计算怎么会在性能上优于Alpha混合,当然,如果你所使用到的只是CPU的常规指令,那的确,在性能上没有Alpha快,但现在 MMX指令已经作为CPU的基本指令,可能目前也很难找到一块没有MMX的CPU了(除非去旧货市场),MMX指令中就有一个饱和加的CPU指令,可以非 常方便的进行操作,不得不感谢CPU制造商所做的功劳。:-) 

好了,两种方式都介绍了,可以说这基本上已经可以胜任2D游戏中所需要,接下来就让我们来让游戏更精彩。

发表于 2009-10-14 23:58:28 | 显示全部楼层
你这个是抄别的吧~~
这个很简单那~~
背景图片不管,特效图片做成PNG格式的,背景透明掉~~直接用Sprite画就行了,自然混合`
 楼主| 发表于 2009-10-15 09:42:51 | 显示全部楼层
  鼯鼠 同志没仔细看我的帖子啊。
呵呵,的确是这个是copy别人的,我帖子里已经说明了。
如果您仔细看看的话,就知道我问的和你答的不是一回事儿啦。
你说的是alpha混合,这个在下已经知道怎么弄了。上文已经指出alpha混合的问题,效果没有饱和度混合。
我问的是饱和度混合。
 楼主| 发表于 2009-10-15 10:06:12 | 显示全部楼层
 我在说明下,有如下图片:
1、魔法图片bmp格式。

2、魔法图片png格式。


效果1:
用alpha混合的效果

效果2:
用饱和混合的效果

===========================
这个是我在java中实现的例子。
因为这个魔法效果图片原图中去掉黑色背景后,还有很多类似黑色的边缘,所以如果单纯用alpha混合的话就是效果1的样子,可以用惨不忍睹来形容。
效果2采用的是饱和混合算法,就是把魔法图片的rgb和背景图片的rgb进行饱和运算后得出新图片,这个效果就不错了。

但是,在java项目中,图片的混合我没有使用硬件加速。(也就是使用的自写算法进行混合的)。
请问用c++使用directx,应该使用怎样的方法通过【硬件加速】实现如上的功能啊?

诚心求教!!!!
发表于 2009-10-16 09:45:06 | 显示全部楼层
呵呵 其实我说的是一回事~
你说的饱和混合在DX里面好像没有~
我们美工给我们的图也不会像你搞得哪个PNG一样黑边乱七八糟的
在载入纹理的时候,你可以通过关键色去掉黑色背景
最好是在PNG中设置好alpha透明 直接混合就是你的效果了~图片处理好点
 楼主| 发表于 2009-10-16 10:53:40 | 显示全部楼层
 如果是这样就太可惜了。
只能自己处理了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-6-25 23:12

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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