从MaterialManager.GetMaterial取到的NMaterial如果old pma=false and new blend mode pma=true会出现渲染异常

报BUG版本:5.1.0

抱歉目前暂时没有制作最小化的demo,问题复现概率也比较低,最终是通过阅读代码分析发现的。

重现步骤:
1. NGraphics 没有开启 ColorFilter(MaterialManager是用共享的而不是独立的)
2.之前帧曾经出现过多种BlendMode pma为 false的对象(所以在MaterialManager对应的_materials那个List中会出现超过1个的材质缓存)
3.在某一帧出现了一个BlendMode.Screen(或其他pma=true)的渲染对象
4.该渲染对象的材质从 GetMaterial 中会获取一个缓存的材质,由于之前的Material在创建的时候并没有增加"COLOR_FILTER"关键词(因为BlendMode为Add或任意其他pma=false的类型),所以会导致渲染出现的结果出错。


下面我截图部分代码和注释作为佐证:
 
PS:目前修复的方式比较挫,在BlendModeUtils.Apply中调用EnableKeyword("COLOR_FILTER");,希望能讨论下后续应该如何处理
 
 
C`F}`76OAYSJ{58IA9E3(J.png
已邀请:

谷主

赞同来自: ethanchan

你分析得对,是会有这个可能。你的解决方案也是可以接受的,并不搓。当然,如果你能升级SDK的话,可以试试最新的SDK,我看已经能解决这个问题了。

ethanchan

赞同来自:

我定位到两个地方的flags用了"+"号,但是"flags"按理说应该是全部使用"|"确保其严谨性。这里修改下是否会有问题?
继续浏览了一下,这里应该是没有问题的。。。那真找不到原因,继续跟进。。。

谷主

赞同来自:

你说的对,应该改成|。不过这个应该不影响任何东西,毕竟_materialFlags里是基本不可能有AlphaMask标志位的。|和加法的结果一样。

ethanchan

赞同来自:

目前问题一直存在,有点苦恼呢,因为逻辑已经无懈可击。
不过今天做了个简单尝试让我有点震惊,我将 _ColorOption 的定义从 COLOR_FILTER的宏里面移到外面去,就再也无法重现该问题。
 

谷主

赞同来自:

这有点奇怪啊哈

要回复问题请先登录注册