今天的材质学习分享:如何通过一个材质节点,卡死你的电脑
看了Ryan Brucks大神对于 Noise
节点的应用,打算使用 Nosie
节点生成一些纹理。但是这个节点能实例化的参数只有 Position 和FilterWidth,看效果非常不方便,于是使用 Custom Node 来调用了 Nosie
生成的方法,然后把参数暴露出来,实例化 Noise
的参数进行快速预览。
一开始想的有点复杂,以为需要在 Custom 里面实现所有的 Noise 算法,后来大佬说,ush 里面的方法可以直接在 Custom 里面调用。于是,剩下的就是 Ctrl+C/Ctrl+V 就够了。
- 首先我们要看一下在 HLSL 里面 Noise 是如何实现的
直接在材质里面连一个 Noise
节点,然后打开 HLSL 代码,复制 HLSL 代码,我们可以看到 Noise
函数的位置。在 shader/Private/Common.ush 1384 行
- 将
MaterialExpressionNoise
直接抄到 Custom Node 里面,并且将里面的变量参数化。
只知道 Ctrl+C/Ctrl+V 的我,在这里犯了一个无脑的错误,导致 材质指令高达 4000+。
下图,MaterialExpressionNoise
中有一个 Noise3D_Multiplexer 的函数,里面有一个 Function 的变量,我直接无脑参数化,也就相当于同时将 6 个实现 Noise 纹理的方法全部加载到材质里面,而且还是最高采用等级。导致材质指令爆炸。
这里查看了 Noise3D_Multiplexer
的代码,Function
传入 int
值,来切换生成 Noise 纹理的方式。
所以,最好的方法是将 Function
设为一个定值,来降低材质的指令,如下图,Noise3D_Multiplexer(1)
,表示只使用 GradientNoise3D_TEX
,材质指令只有 300+ 。
以下,高达 4000+ 指令的材质,如果想降低材质指令,只需要把代码里面某些变量设置为定值就可以了。
UE4.24 版百度云
提取码:dvmf