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