| 
 
| 赞 | 7 |  
| VIP | 7 |  
| 好人卡 | 58 |  
| 积分 | 1 |  
| 经验 | 111901 |  
| 最后登录 | 2025-8-6 |  
| 在线时间 | 386 小时 |  
 Lv1.梦旅人 
	梦石0 星屑75 在线时间386 小时注册时间2007-7-27帖子4106 
 | 
| 
一直以来RM的BlendMode的数量都很少(正常,加法,减法)。这次MV实际上是CEF + WebGl,我想应该通用的BlendMode都能支持了吧?
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 翻翻帮助文档。有几个假惺惺的方法canUseDifferenceBlend 、canUseSaturationBlend 。但是并没有用,默认提供的BlendMode只有四种:BLEND_ADD BLEND_MULTIPLY  BLEND_NORMAL BLEND_SCREEN
 整整增加了一种!真是感天动地!感谢娇喘!感谢Chunsoft!
 
 我趴在地上冷静了一下,考虑到MV操作WebGl实际上是通过pixi库,这些枚举也是pixi库的alias,是不是查找一下pixi库里面的blendMode的枚举会有更多呢?
 搜了一下,高兴地跳起来
 真的常见的都有了。复制代码  BLEND_MODES: {
        NORMAL:         0,
        ADD:            1,
        MULTIPLY:       2,
        SCREEN:         3,
        OVERLAY:        4,
        DARKEN:         5,
        LIGHTEN:        6,
        COLOR_DODGE:    7,
        COLOR_BURN:     8,
        HARD_LIGHT:     9,
        SOFT_LIGHT:     10,
        DIFFERENCE:     11,
        EXCLUSION:      12,
        HUE:            13,
        SATURATION:     14,
        COLOR:          15,
        LUMINOSITY:     16
    },
赶紧写段代码测试一下:
 测试结果是: 0 1 2 3都有效果  后面的都和0一样,什么鬼。复制代码bit2 = new Bitmap(640,480);
bit2.fillAll("#FFFFFF");
sp2 = new Sprite(bit2);
sp2.blendMode = 11;//11是差值模式
SceneManager._scene.addChild(sp2);
继续找代码,发现了pixi坑爹的地方:
 可以看出后面的数组是WebGL的blendFunc的参数。这3后面的都和第一个一样,pixi挖了坑居然不填!复制代码        PIXI.blendModesWebGL[PIXI.blendModes.NORMAL]        = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.ADD]           = [gl.SRC_ALPHA, gl.DST_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.MULTIPLY]      = [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.SCREEN]        = [gl.SRC_ALPHA, gl.ONE];
        PIXI.blendModesWebGL[PIXI.blendModes.OVERLAY]       = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.DARKEN]        = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.LIGHTEN]       = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.COLOR_DODGE]   = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.COLOR_BURN]    = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.HARD_LIGHT]    = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.SOFT_LIGHT]    = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.DIFFERENCE]    = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.EXCLUSION]     = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.HUE]           = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.SATURATION]    = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.COLOR]         = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
        PIXI.blendModesWebGL[PIXI.blendModes.LUMINOSITY]    = [gl.ONE,       gl.ONE_MINUS_SRC_ALPHA];
于是我打算自己改一改。就拿11,Difference来说。通过http://www.andersriggelsen.dk/glblendfunc.php这个页面可以测试blendFunc参数的效果。按照测试差值模式应该是
 我以为就万事大吉了,没想到,pixi的挖坑不填是有原因的。复制代码PIXI.blendModesWebGL[PIXI.blendModes.DIFFERENCE] = [gl.ONE_MINUS_DEST_COLOR, gl.ONE_MINUS_SRC_COLOR];
这么改了之后确实是有效果,然而结果并不是和背景合成,而是和一个白色画布进行合成直接叠加在背景上
 举个例子:
 和背景合成应该是这样:
 
   和白色画布合成就会变成这样:
 
   查了一下资料,blend的时候是新图和buffer进行计算,可能是渲染合成的时候没有保留之前渲染的背景,直接用默认底色进行的合成。但是pixi的渲染代码实在是看不懂,也不知道怎么改比较好。
 希望比较熟悉js和pixi以及webgl的各位大大指点一下
  
 ps 这次好像没有截图的方法了,大大的差评
  | 
 评分
查看全部评分
 |