【bug】Creator 2.4.x 用预乘+one模式去黑边,但是产生新的问题

github issue没人鸟,再提一贴
https://github.com/cocos-creator/engine/issues/7830

【Creator 版本】
Creator 2.4.2, 2.4.3

【目标平台】
Android原生,Creator编辑器模拟器

【重现方式】
参考Demo
PremultipliedAlphaBlendError.zip (2.1 MB)

  1. 纹理勾选Alpha预乘(Premultiply Alpha),赋给 节点A 的Sprite组件。Sprite.srcBlendFactor = ONE。(这么做的原因是为了消除图片黑边)
  2. 新建一个 节点B ,将 节点A 作为其子节点
  3. 连续修改 节点B 的opacity属性

【效果】
预期:图片根据给定的opacity值变换透明度(子节点继承父节点的透明度)
实际:不管透明度往大调还是往小调,图片都逐渐变黑

1赞

[问题定位]
Assembler.cpp updateOpacity()方法
在预乘模式下会直接修改renderData里的rgb值,乘以透明度。

如果父节点的透明度修改了,子节点updateOpacity()会被再次调用,但是renderData里的值没有被重置,而是基于上一次预乘后的结果再次预乘,导致rgb值越来越小,所以渲染出来就成黑色了。代码位置在下图:

[解决办法]
每次预乘都应该基于节点的原始颜色rgb值。
所以,每次节点修改颜色时可以在Assembler里缓存节点颜色,在updateOpacity()中使用。
个人修改代码PR如下,由于感觉影响面较大,所以就不往官方库里PR了,希望下个版本中能出官方的fix。

[jsb-adapter]
caogtaa/jsb-adapter#1

[cocos2d-x]
caogtaa/cocos2d-x-lite#1

2赞

同遇到这样的问题,如果子节点Sprite.srcBlendFactor = ONE,父节点改变透明度 子节点无效,后面又改回去了

2.4.4好像没有这个问题了,不过有另外一个问题,动态加载纹理,对其设置预乘的时候,只有再第一次加载纹理的时候设置才有效,之后设置,就无效了····

好像跟flipY一样,动态设置一直无效。

我刚试的,是只有在第一次设置的时候才会有效····

那勉强能用,哈哈。
目前想不到什么场景需要运行时修改预乘。

我错了,在原生上改透明度还是有问题 :sob:

大佬,改透明度出的问题有办法了吗

让你的美术,把给你的图放进ps进行边缘锐化加批处理,然后不改成one模式,就不会有问题了

1赞