原文链接:【小玩意儿】简单实用方便的材质画进贴图
分享我一个朋友平时用的一个小玩意儿,不是什么高端的技术,感觉比较实用。朋友把 Draw Material To RenderTarget 巧妙地用了起来,封成了一个小工具,可以加速平时开发的效率。简单点说就是在引擎里把各种东西直接画进贴图,省去打开各种外部图像编辑软件的时间。
制作简易蓝图
最最最快速的方法是直接在某个 Actor 蓝图上连好节点,然后勾上 Call in Editor
(编辑器中调用),不需要写什么插件、复杂的代码、Editor Utility Widget
之类的
- 新建一个简单的 Actor 蓝图,起个名字
- 新建我们要用到的函数(事件也可以)
- 选中该函数,勾上
Call in Editor
- 把蓝图拖进场景就能按按钮直接调用函数了。
- 快速实现这个蓝图的功能,先创建一个 RT(后面都用 RT 来表示
RenderTarget
,直译为可渲染目标),然后 Draw Material To RenderTarget,然后将 RT 保存成一张贴图,对应下图中的三个函数,其中保存成贴图的函数要比较新的引擎才有。函数的各种参数直接暴露到 Detail 面板上
- 这里的
PathAndName
就是贴图保存路径。既可以是 /Content 开头也可以是 /Game 开头,后面接文件夹路径,然后是贴图名字,比如 /Game/MyTexture/111 ,也可以是直接用文件夹路径开头,如 MyTexture/111。如果直接用贴图名字开头,则贴图会保存在当前关卡的存放路径,具体实现的细节可以自行查看对应源码
- 这样我们就获得了一个能帮忙画贴图的蓝图了
试着画个圈到贴图上
- 新建一个材质,
ShadingModel
选择Unlit
(无光照),BlendMode
选Translucent
(半透明)
- 实现一下画圈材质
- 把材质拖进我们蓝图的材质槽里,点刚刚弄出来的 Draw and Save 按钮
- 贴图出现了。记得保存一下。
试着画个噪波到贴图上
- 实现一下画噪波的材质。这里用的是 Simplex 噪波。代码来自Noise - simplex - 2D。这种
Custom
节点的写法是比较常用的临时实现函数的方法,正式用的话建议直接把Custom
节点魔改好
- 拖进蓝图,绘制并保存!
试着把别人的复杂材质画到贴图上
- 比如有的美术喜欢做复杂的分层材质,虽然效果很好,但计算量也提升了,将结果烘进贴图里可以更省(缺点是丢失了动态效果、精度受分辨率影响等等)。这里拿 Paragon 的材质做示范,挑个简单点的来试试。
- 注意 Paragon 的材质里有
Fresnel
的计算,这个东西画 RT 的时候是有问题的,需要自行处理一下
- 将材质复制一份用来画 RT。先将
AO
、Roughness
和Metallic
合并成一张贴图看看
- 点击按钮绘制
- 再导个法线贴图出来。注意法线贴图在材质编辑器中采样后数值范围是 -1 到 1,需要映射回 0-1 再导出
- 压缩设置也要改成
Normalmap
。然后绘制保存一下
BaseColor
也保存一下。注意,Format
需要选择RTF_RGB8_sRGB
- 保存出来的图片需要勾选
sRGB
。也可以魔改负责保存静态贴图的蓝图函数,直接支持sRGB
的设置。
试着在一张贴图上加东西
- 比如实现一个在贴图上打水印的工具。先将蓝图修改一下,之前是直接用的材质,现在根据这个材质创建材质实例,并设置一下这个动态材质实例的
Texture Parameter
,一个 Texture 代表底图
,一个 Texture 代表画上去的水印
,再加个不透明度
参数
- 贴图对应的变量点开小眼睛,暴露在 Details 面板上
- 新建一个材质,实现两张贴图的混合。两个贴图槽的名字跟蓝图函数中的 Parameter Name 对上
- 点一下绘制按钮,贴图就出现了