如何在UE4中做出高质量的半透次表面

如何在UE4中做出高质量的半透次表面

关于玉石次表面其实在UE中挺难出效果的,我之前也写过一篇,不过是用简单的代码在3D空间划分出了一个渐变的MASK,效果其实并不是特别出彩,感兴趣的下方有链接。经过我几个月的学习,我又发现了一种船新的方法来模拟出效果更好的次表面,甚至可以做出一些群友所说的阴间的效果。下面让我们就来分析一下到底是如何制作的,先上几张效果图。

三个方位的效果
厚重的次表面
帝王绿
半透玻璃
冰种翡翠带折射

上面就是我写的次表面的99%的效果了,还有1%的阴间效果我们留到最后。

分析:现在我们分析一下次表面的做法,其实很简单,无非就是在空间内做出渐变的mask,这个渐变的mask最好还得符合模型本身的构造,等于说越模型厚的地方颜色越深。这个时候我就想到了通过深度去模拟,最准确的方法就是在模型内部做出一个类似距离场的深度场,但是这种方法需要对底层进行修改,奈何本人技术力不够,所以我这里采取了另一种方法来进行简单的模拟,那就是用自定义深度。

自定义深度,也就是customdepth,通过这个我们可以很好的获取模型表面的深度信息,通过这个深度信息我们就可以直接叠加到物体的颜色上,这样就可以做出次表面的效果了,下面直接开整。

首先准备一个模型,我这边使用劳模弥勒佛。

默认材质的弥勒佛

模型设置:我们先把模型复制一层,本体模型用来接收自定义深度,复制的模型我们只需要他的深度值。我们将复制模型上的render in customdepth pass勾上,还有render in main pass取消勾选。复制的模型材质默认的就行,千万别给半透或者mask。

关闭render in main pass
打开customdepth pass
复制的模型

如果你复制的模型是这样的,那么关于模型的准备工作就做完了。

深度:新建材质球开始计算自定义深度,先将材质球的 混合模式改成半透,然后光照模式改成无光照,最后打开allow custom depth writes,这样就能在材质使用自定义深度了。

设置属性
打开自定义深度写入

然后我们调出自定义深度的节点,通过scenetexture调用(初始为scenecolor),选中节点在左边的属性里选择custom depth。

初始scenetexture
选择customdepth
选择后的scenetexture

我们先将customdepth取出rgb三通道并且取绝对值,然后和worldposition(减去objectpositiopn将坐标转换到本地,不然灰度不会固定)相乘(customdepth的color是4通道的),然后进行smoothstep(决定灰度范围)之后取出R通道(世界坐标轴朝向X的方向)

计算深度
深度变化

很明显从上图可以看出深度随着物体像素所占比例的缩小而发生了改变,所为了匹配像素占比的变化我们需要将customdepth除以pixeldepth,这样我们所获得的深度信息将不再发生变化。

固定深度
固定深度的节点

有了这个以后我们现在只有R轴方向,但是我们现在所需要的是厚的地方深,薄的地方浅,取R轴的效果适合模型朝R轴的负方向,所以我们可以用R轴的效果取反,来进行模型朝R轴正方向的效果,然后把两个效果相乘就行了。

R轴正方向
R轴负方向

然后我们继续加入G轴的两个朝向,只需要将深度的MASK R轴换成G轴,最后,和R轴的效果用相乘就可以了

加入G轴的方向
加入G轴后的深度效果

可以看到基本只需要G轴R轴的深度进行模拟下就可以了,Z轴也是用同样的方法,看你所需要的效果需不需Z轴的深度而决定加不加吧(我这边是加的,但是其实影响不大)。

颜色和反射:有了深度后,我们就可以叠加颜色了,直接用lerp进行深色浅色之分就行了。反射也同样很简单,只需要在颜色的基础上用cubemap和颜色做lerp,用另一个值控制就行了

颜色和反射
lerp颜色后的结果
加入反射

半透效果:有了反射之后我们可以制作他的透明度,但是并不是所有的模型都能这么做,我们先把复制出来的那层模型的reander in depthpass 取消勾选,再将透明度调低,很明显在下图可以看到,背面的部分模型也渲染了出来,理论上是可以加PASS剔除背面的,但是我不会
T T,所以这边复杂的模型我直接放弃,采取了简单的模型

关闭depthpass
复杂模型的背面渲染了出来

我这边就用UE自带的花瓶模型,半透明的计算我是直接对最终输出的深度mask再一次进行smoothstep计算,然后控制下强度范围就可以了(注意半透明是越黑越透)

透明度计算
透明度mask
简单模型的半透

深度噪波:到这里其实已经完成了大部分的功能,如果要再加一些细节的话,就是类似玉石里面的裂纹了。我们可以在原来的custom depth上面加一张noise贴图,但是由于贴图范围是0-1,对于customdepth来说基本没啥变化,而且贴图是基于物体UV的,和像素深度关系不大,所以我们必须在原来深度的基础上加上cameraposition的计算,贴图是基于UV的,直接关联的是worldposition,所以我们可以先用worldposition减去cameraposition,计算完深度后重新加上cameraposition,这样就可以在深度的信息上加上和noise的贴图深度信息了。

深度上加入噪波
加入噪波后的次表面
整体节点图

阴间特效:其实很简单,因为我们不是用的自定义深度吗,所以我们不一定只能用原模型,可以在次表面制作完成后加入另一个其它模型开启自定义深度,就有了如下阴间画面

缺点:1.模拟深度其实并不够精确,最好就是对称的模型

2.模型旋转后深度可能不匹配

3.半透明只适合比较简单的模型

4.customdepth加模型模拟的双PASS其实比较消耗性能

编辑于 2022-10-08 10:50