Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【Native】纹理勾选Alpha预乘后混合错误 #7830

Closed
caogtaa opened this issue Nov 19, 2020 · 5 comments
Closed

【Native】纹理勾选Alpha预乘后混合错误 #7830

caogtaa opened this issue Nov 19, 2020 · 5 comments

Comments

@caogtaa
Copy link

caogtaa commented Nov 19, 2020

Creator version?(版本号)

2.4.2,2.4.3均有问题

Affected platform?(受影响的平台)

Android & Simulator

How to reproduce?(如何重现)

参考Demo

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

预期:图片根据给定的opacity值变换透明度
实际:图片变黑
image

重新设定节点A的 color属性可以使其恢复,

Demo project?(demo 项目)

PremultipliedAlphaBlendError.zip

@caogtaa
Copy link
Author

caogtaa commented Nov 26, 2020

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

image

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

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

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

@drelaptop
Copy link
Contributor

问题在 2.4.4 依旧存在。采用“纹理勾选Alpha预乘+ Sprite.srcBlendFactor = ONE”方法消除黑边的,在 Android 就有这个问题。是否考虑在下个版本中合并到官方库中呢? @jareguo

@caogtaa
Copy link
Author

caogtaa commented Feb 6, 2021

预乘模式用起来太麻烦,还容易遗漏。
现在把所有图都离线做了扩边,用1/100的透明度 & 边缘邻近色做描边,可同时解决原生和小游戏黑边问题。

@OnlyKoei
Copy link
Contributor

已经建立内部issue,对其进行跟踪修复,这边 issue 先关闭了。

@Greg1129
Copy link
Contributor

使用这个PR可以解决
cocos/engine-native#4121

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants