[教程]高级混合模式运行原理
gamemaker吧
全部回复
仅看楼主
level 13
cies 楼主
    混合模式相信大家都使用过bm_add,bm_normal这种经典混合方式,而高级混合模式draw_set_blend_mode_ext对于一个刚接触的人来说是一个十分抽象的概念,不过一旦你了解他,你会发现他是相当简单的,你甚至可以制作自己特定的混合模式,来达到更高的游戏效果,所以这是进阶游戏制作必备的知识,希望大家和之前一样,一定要掌握~
     高级混合模式的例子实际上不少,不过这个函数不同,从游戏例子里基本不能完全看明白他是怎么工作的,而且最重要的是,在gm自带的help里,几乎对使用细节完全没有任何描述,以下我们就来解析一下这个函数(文中公式图载自gmlscripts,如果有其他疑问,这里也是个不错的去处哦)
     在高级混合模式和普通不同,他拥有2个参数,第一个你在混合模式下正在使用的绘制命令绘制出的图形(如draw_sprite),而第二个则是在你现在所绘制图形之前原本就拥有的图形,如表面,游戏背景或者是在使用混合模式之前同样坐标下绘制的精灵……等等,并且混合的时候,通道RGB颜色值并不是0~255来表示,而是0~1哦(也就是颜色所占的分量)。
     在中文帮助里说过这样一句话(这里不去管帮助里翻译是否通顺,你能理解就行)“正常的混色模式设置源地混合bm_src_alpha和目的地混合bm_inv_src_alpha”。意思则为:利用这组函数组成的GML:draw_set_blend_mode_ext(bm_src_alpha, bm_inv_src_alpha);你所得到的结果,就和普通并没使用任何混合模式的结果一模一样,这时,我们就从这里入手,首先来理解一下所使用的这2个参数:
bm_src_alpha: 混合因素是 (As, As, As, As).
bm_inv_src_alpha: 混合因素是 (1–As, 1–As, 1–As, 1–As).
     这句话听起来相当抽象,来详细说明一下吧(尽量理解):我们以一个像素为单位,来解析每个图片,每一个像素所经历的混合过程:bm_src_alpha如上所写,混合因素是4个As,这4个As的参数分别代表的是( R , G , B , A )即图像的红、绿、蓝、通道,现在使用了bm_src_alpha,意义就为将在这4个参数上,分别都乘以一个As,As在这里是什么意思呢,即是在你正在绘制的图形的alpha值,所以乘以As以后,那么就变为了( R * As , G * As , B * As , A * As )。
     而第二个参数bm_inv_src_alpha,即为目的像素,我们得打的是正常混合模式,目前就得使用bm_inv_src_alpha参数,inv在这里即是inverse的缩写,(1 - As )意思则是得到的相反值,原来是Alpha越大,那么现在就越小,比如1的话,现在得到的话就是 1 - 1 = 0 。
     最终,这2个混合加在一起,我们得到的就是想要的结果啦,为了详细的解释出现的结果,你可以看看一下的公式:
参数1(源)              参数2(目的)          结果
[源红] * [源通]   +   [目红] * [1-源通]   =   新的红色
[源蓝] * [源通]   +   [目蓝] * [1-源通]   =   新的蓝色
[源绿] * [源通]   +   [目绿] * [1-源通]   =   新的绿色
[源通] * [源通]   +   [目通] * [1-源通]   =   新的alpha通道
     如果概念依然比较模糊,这里有更形象的图示(看了这个你应该完全能理解了!):
    
     图里你会发现,我们所绘制的精灵的Alpha通道在完成一次正常混合的时候,他的作用:擦掉了精灵多余的背景(即黑边框)并且还删除了当前绘制坐标上的和精灵轮廓一样的背景。将他们结合起来,就是一次正常的混合方式!。
如果你在这里能完全理解了混合模式的话,以下的内容则可以跳过,如果依然像明白他的原理,那继续接着看下去~,如上图所示,我们正在绘制的马里奥的衬衫颜色为靠近红色(
#F84070,即为源像素),而背景正好是泥巴色(#
C89858,即为目的像素),这时这个点使用了draw_set_blend_mode_ext(bm_src_alpha, bm_inv_src_alpha)以后,则为:
( 小常识:这里以#F84070为例子,这是一个用十六进制数表示的颜色,他分为R G B ,这里 R = F8 , G = 40 , B = 70)
参数1(源)              参数2(目的)          结果
[0xF8] * [1.00]   +   [0xC8] * [1-1.00]   =   新的红色
[0x40] * [1.00]   +   [0x98] * [1-1.00]   =   新的蓝色
[0x70] * [1.00]   +   [0x58] * [1-1.00]   =   新的绿色
[1.00] * [1.00]   +   [1.00] * [1-1.00]   =   新的alpha通道
( 小常识:在这里由于RGB颜色值是用0~1表示,那么则就是百分比,如R=F8 即 十进制的 248 , 由于R最高为255,则可得出248/255 约等于 0.97)
[0.97] * [1.00]   +   [0.78] * [0.00]     =   0.97
[0.25] * [1.00]   +   [0.60] * [0.00]     =   0.25     (最终颜色值为#F84070)
[0.44] * [1.00]   +   [0.35] * [0.00]     =   0.44
[1.00] * [1.00]   +   [1.00] * [0.00]     =   1.00
     相信你到此应该完全掌握高级混合的原理啦,混合模式有很多种,希望你能理解他们的意思,来得到你
正确的
混合方式哦。
2010年12月16日 02点12分 1
level 11
[茶杯]支持支持~
2010年12月16日 03点12分 2
level 13
cies 楼主
回复:2楼
喵喵攻击!
2010年12月16日 04点12分 3
level 11
[茶杯]被犀利的攻击了!~
2010年12月16日 06点12分 4
level 8
[汗]T大你太可怕了!
嗯 总觉得大概理解能玩出啥了……
2010年12月16日 06点12分 5
level 13
cies 楼主
回复:5楼
小南可以试试只用一种颜色的素材混合其他颜色的Player!
2010年12月16日 07点12分 6
level 13
cies 楼主
打个比方,如果需要混合其他颜色的精灵,最好利用这个精灵作为底板混色(即目的)~
2010年12月16日 07点12分 7
level 13
cies 楼主
回复:8楼
是滴,图片是yoyogames的会员从gmlscripts里搬运过去的~
2010年12月16日 08点12分 9
level 4
汗……有点雾@。@周五回家试验一下
2010年12月16日 13点12分 10
level 8
之前怎么没发现这贴= =
2011年12月03日 18点12分 12
1