执着等待等wc 发表于 2020-12-24 09:19

Unreal-TrickTech_材质的伪数组传递

UE的材质系统很人性的采样了连连看模式,不知道是出于什么考虑没做SetArrayParameter呢。悲伤的是UE的任何SetUAV操作都只能底层去弄导致一改全世界就只有自己能用了的尴尬境界,所以这里分享一个不需要改源代码去支持Array传递的方法。
之前分享过的一个UnlitLightingSystem里面有试过收集数组然后把数组数据用LoopDrawTexture写给RT,虽然最后能用但是感觉Bug还不是比如A是没办法写数据进去的,因为又是BP所以Loop的性能及其低下然后就想能不能有更便捷和快速又不改源代码的方法。这个时候看到一个CustomT2D的文章于是就想反正我只是读又不写为什么不用T2D来做呢。
为了能够做到这一点我们得有T2D这个数据存储体,默认引擎创建T2D只能通过导入贴图来做。想想我们没加一个Array都要导一张贴图分辨率还不能动就很GG,所以这里选择新建一个CustomAsset来做,既内容浏览器里面右键创建Texture2D。首先得创建一个插件来管理我们的内容(如果不会可以看UE官网的Plugin教学)。然后我们往我们自己的Plugin内添加一个继承自BlueprintFunctionLibrary的UtilityFunctionLibrary,给它添加两个Clear和SetData的方法并且暴露给蓝图。第一个是做ClearColor使用的方法第二个则是将我们的数据直接通过内存拷贝到T2D,以此来达到比之前蓝图LoopDrawTexture快N倍的速度。
然后回到VS再添加一个继承自UFactory的CustomArrayAssetFactory来作为数据的载体。并且将刚刚的UtillityFunction引入进来调用里面的数据传递函数。
http://pic4.zimg.com/v2-94e81a71b0fca7937bd359ba4747e6e3_r.jpg这里我就直接把数据长度给到了32*32既1024,如果喜欢可以自行在加一个AssetAction类来去修改创建的T2D的数据。以上操作完成后编译启动既可以在内容浏览器里右键Texture栏里面找到我们的CustomT2D。然后随便找个能写蓝图的地方去调用,这里我作为演示就建了一个Actor去每帧延迟做Update的随机1024个数据来近似需要的Array数据,然后将其写入即可。
然后我们创建一个材质并将其输出Debug。可以看到数据读取也是完全正确的。剩下的就可以自行发挥骚操作了。手动滑稽。
页: [1]
查看完整版本: Unreal-TrickTech_材质的伪数组传递