native上对龙骨应用shader时遇到的问题

版本2.4.4:

问题简述:首先,我写了一个shader,用来实现带法线贴图的2D照明效果,因此为每个渲染对象指定对应的normalMap,我是这么传入的:
在fs里:
image
对应的龙骨脚本中:


对应的sprite脚本中:

实际上都是调用了setProperty对材质变体中的normalMap进行赋值。在web上运行正常,构建到安卓后,sprite渲染对象正常渲染,但是龙骨渲染对象的normalMap没有被传入到shader。
调试中也发现sprite有绑定normalMap:


但龙骨只绑定了原图(textureID:410):

而下列法线贴图没有用到

这种情况是引擎的bug还是我代码的问题?

手动顶一波

NewProject.rar (2.2 MB)
提供一个demo,经过测试,在场景上创建一个sprite跟一个龙骨,分别对材质变体赋值不同的noise纹理,网页上正常,打包apk后,龙骨异常使用了跟sprite同样的noise纹理。如果将场景上的sprite去除后,打包成apk时龙骨中变成直接没有noise纹理。
这是在web上预览时的效果。


这是构建出来后的apk上实际运行的效果。

@jare 希望可以帮忙看下这个问题

经过测试,需要将代码这么写才能正常

问题在于CCArmatureDisplay::traverseArmature中会实例化一个新的EffectVariant
image
然后执行copy将pass中的参数拷贝到新的实例中。(注意这个内存地址1)


执行完后实际参与drawItem的pass已经发生改变,可以通过内存地址的变化看出,并且这个地址所指向的是后续实际参与到渲染的实例


然而在调用setProperty的时候,赋值的目标却不是参与渲染的pass,而是内存地址1所指向的实例

这就导致了,上述的两种情况
1:将material跟资源都加载好后,设置好材质球,然后赋值给ArmatureDisplay,正常显示,因为数据被copy过去。
2:先加载material,然后再加载资源,数据没有被copy到,并且因为setProperty操作的pass实例跟渲染用的pass实例不一致,导致setProperty失败。
这应该算是bug吧。

等待官方的第三天


加个更新代码

有效,感谢

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。