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
高级混合模式的例子实际上不少,不过这个函数不同,从游戏例子里基本不能完全看明白他是怎么工作的,而且最重要的是,在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
相信你到此应该完全掌握高级混合的原理啦,混合模式有很多种,希望你能理解他们的意思,来得到你
正确的
混合方式哦。
