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

V2.4.0 fix set premultiply alpha #6602

Merged
merged 1 commit into from Apr 29, 2020

Conversation

holycanvas
Copy link
Contributor

@holycanvas holycanvas commented Apr 23, 2020

Re: #6546

Changes:

  • fix wrong effect after set premultiplyAlpha

原因在于我之前的pr,把强制初始化 flipY = false 删除了,原因是因为强制设置flipY会让setFilters这些操作也重新上传贴图,没有必要,而且强制初始化 flipY 可能会覆盖用户之前的flipY而导致图片翻转错误。但是删除之后带来了上面的问题,当用户调用setPremultiplyAlpha的时候,因为没有设置flipY的初始值。导致底层默认把flipY看做true,导致了图片翻转。

修复的思路是,在修改 flipY 和 premultiplyAlpha 时,把两个选项都进行设置,保证底层上传时效果正确

@holycanvas holycanvas force-pushed the v2.4.0-fix-set-premultiplyAlpha branch from 8d7cdce to a1cf94e Compare Apr 23, 2020
@holycanvas holycanvas requested a review from 2youyou2 Apr 23, 2020
@holycanvas
Copy link
Contributor Author

holycanvas commented Apr 23, 2020

麻烦 @2youyou2 看下有没有必要

@2youyou2
Copy link
Contributor

2youyou2 commented Apr 23, 2020

那不是所有 _getSharedOptions 获取设置的地方都应该做这些操作么,否则调用 genMipmaps 等操作的时候也会有问题

@holycanvas
Copy link
Contributor Author

holycanvas commented Apr 23, 2020

应该不用,genMipmap,setFilters, setWrapMode 这些应该不用重新上传贴图的,走不到上传贴图这个分支
image
要想走到这个的分支重新上传贴图,必须要flipY和premultiplyAlpha不为undefined才行

image

@2youyou2
Copy link
Contributor

2youyou2 commented Apr 23, 2020

恩,还是有点隐晦。。

@dumganhar
Copy link
Contributor

dumganhar commented Apr 26, 2020

就不该提供 flipY 和 premultiplyAlpha 的这两个 webgl 扩展设置给游戏。这两个操作都是在 CPU 侧实现的,需要对图片每个像素做处理。预乘应该是编辑器中设置了某些图片要预乘,直接在编辑器导出资源的时候就把图片给预乘了。

@xifengxi
Copy link
Contributor

xifengxi commented Apr 26, 2020

@dumganhar 还是应该提供的,flipY可能不重要,有远程加载的图片可能是需要再设置premultiplyAlpha

@dumganhar
Copy link
Contributor

dumganhar commented Apr 26, 2020

gl.pixelStorei 设置 预乘是运行时对非预乘的图片进行预乘操作,为什么远程图片会要 premultiplyAlpha ?如果是为了防止非预乘导致 gl 采样纹理的时候出现黑边的话,那么 bleed(出血)模式能很好解决采样问题。美术在出图的时候,为透明区域的零界点填充临近非透明像素的rgb值也能修复这个问题。

@xifengxi
Copy link
Contributor

xifengxi commented Apr 26, 2020

这个要求美术出图一定符合某种规则的成本,比设置一个premultiplyAlpha要高很多。另外bleed模式的话如果您有时间能否给个指引,不太了解...

@dumganhar
Copy link
Contributor

dumganhar commented Apr 26, 2020

@xifengxi
Copy link
Contributor

xifengxi commented Apr 26, 2020

OK, 原来这个就是出血模式,那我知道可能只是名词不清楚,所以问题就是刚才我说的,要求美术这么搞的成本比自己设置高很多。

@jareguo
Copy link
Member

jareguo commented Apr 26, 2020

@dumganhar 我能想到预乘的一个使用场景:开发者自己绘制了一张 RenderTarget(非预乘),含透明通道。然后他再渲染到另一个 RenderTarget,这个时候如果他不用预乘,就会导致另一个 RenderTarget 的透明通道出错,本来不透明的地方变成透明的。所以他需要对第一张 RT 进行动态预乘,然后使用预乘的 blendMode 绘制到第二张,就能解决这个问题。
如果引擎不开放预乘设置,开发者就得在绘制 RenderTarget 时手动计算预乘(shader 中)

@dumganhar
Copy link
Contributor

dumganhar commented Apr 27, 2020

开放运行时预乘接口也没问题,运行时预乘有一定开销,编辑器中的预乘按钮可以改为导出资源包的时候就帮忙把资源预乘好,而不是在运行时预乘。

就是说:编辑器中的预乘勾选按钮,直接影响出图是否已经预乘,而不是在engine层面去动态预乘。动态预乘与编辑器预乘应该区分开才是。

就比如,spine 导出资源的时候,就可以选择 bleeding mode 还是 premultiflyAlpha mode,导出资源就直接处理了。

@holycanvas holycanvas merged commit b9c384c into cocos:v2.4.0 Apr 29, 2020
1 check passed
@holycanvas holycanvas deleted the v2.4.0-fix-set-premultiplyAlpha branch Apr 29, 2020
@snafour
Copy link

snafour commented May 10, 2020

开放运行时预乘接口也没问题,运行时预乘有一定开销,编辑器中的预乘按钮可以改为导出资源包的时候就帮忙把资源预乘好,而不是在运行时预乘。

就是说:编辑器中的预乘勾选按钮,直接影响出图是否已经预乘,而不是在engine层面去动态预乘。动态预乘与编辑器预乘应该区分开才是。

就比如,spine 导出资源的时候,就可以选择 bleeding mode 还是 premultiflyAlpha mode,导出资源就直接处理了。

引擎预乘是不可避免的,我举个例子:通过url获取用户的头像。这个图片就不可能来自开发者的美术出图,也无法在制作游戏时在编辑器里面勾选预乘。而且你当然不可能要求用户设置头像时考虑开发者读图的需求。。。

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

Successfully merging this pull request may close these issues.

None yet

6 participants