Eevee是一个质量非常不错的实时渲染器,做一些动画渲染非常方便。
不过有个问题困扰了不少人,那就是透明材质的渲染。对于光线追踪渲染器cycles来说没什么大问题,透明材质有比较强的真实感。但是对于基于光栅化渲染的eevee来说,透明材质如果设置不当,看起来总会有一些不符合我们现实认知的“bug”。。。事实上,这和实时渲染的渲染管线有很大关系,遵循它的工作原理,可以将错误的情况得到缓解。
实时渲染里,透明材质目前还是一个比较难解决的问题。首先我来解释一下这其中的一些工作原理。Eevee渲染路径使用的是延迟渲染(Deffered rendering),这也是目前大多数的高画质3D游戏采用的方法。延迟渲染是什么意思呢?就是先将屏幕里的各种通道信息,如法线(normal),深度(depth),漫反射(diffuse)等,它们以屏幕像素点位置的形式储存在几何缓存(G-buffer)里,这一过程称之为几何(Geometry)阶段,然后光源通过读取这些通道的信息进行渲染,这一过程称之为着色(Shading/Lighting)阶段,计算颜色,最终合成为我们屏幕里看到的画面。因为光照着色是最后计算的,所以这一方法被称之为延迟渲染。这一方法使我们的光照不再受场景复杂度的限制,主要取决于几何缓存的分辨率,很大程度上节约了光照计算量。

并且这种渲染方式衍生出了一系列基于屏幕空间/深度的渲染技术,这也是为什么eevee能在渲染属性里使用环境光遮蔽 (Screen Space Ambient Occlusion, SSAO ) ,屏幕空间反射 (Screen Space Reflection, SSR ) ,次表面散射 (Screen Space Sub-Surface-Scattering, SSSSS ) 的原因。
(Eevee渲染的采样是通过 TAA 进行采样的,依赖于前帧信息,这个下文会提到。)
尽管这是一个很高效的渲染方式,但是这种方法只适用于不透明的物体,所以我们需要将透明的物体进行另外的处理。
理想的结果应该是:
(1)如果视图里透明物体和不透明物体重叠,不透明物体在前,可以看到不透明物体遮挡了透明物体;
(2)如果视图里透明物体和不透明物体重叠,透明物体在前,可以透过透明物体看到后面的不透明物体;
(3)如果视图里透明物体和透明物体重叠,可以透过前面的透明物体看到后面的透明物体。
但实际上在eevee的结果可能是这样的:



这种问题是通常是因为物体的渲染顺序所导致的。所以在处理透明物体的时候,我们要格外注意渲染的顺序。这和eevee的混合模式有很大关系。

首先是Alpha混合(Blend)模式,如果选择为这个模式,物体就会被认为是透明物体了,不会进行正常的延迟渲染,透明物体将会在渲染完不透明物体之后才被渲染。如果是多个不透明物体,默认是距离摄影机远的物体先被渲染,距离近的后被渲染。
直接开启时可以看到,无论是不是透明材质,物体的背面都会被渲染出来。

我们可以理解为,对于一个网格物体,Alpha混合模式的渲染顺序是先渲染物体背面再渲染物体正面。这样我们便可以看到物体的背面,不过看起来会比较混乱,像是后面的部分看起来在前面。开启背面剔除我们便看不到物体的背面,看起来好像是正常的,但渲染顺序是改变了的,这对于透明物体的控制起到了很大的作用。
以玻璃/折射/原理化的透射着色器为例,这种是带折射的材质,默认单层玻璃的情况下,只需要打开屏幕空间折射即可,不需要设置Alpha混合模式。

实际上,这类折射材质和透明度是没有关系的,实际上你所看到的透明效果只是贴在物体表面的一张环境纹理,而且无法进行二次折射,这也是为什么透射的物体只能看到一层的原因,并且光栅化的折射计算只是一个近似的结果,相对于光线追踪来说有较大出入。
既然多层折射是无法实现的,那么为什么这张图看起来像是有多层折射的效果呢?

实际上这是一个trick,用到的就是Alpha混合控制渲染顺序。
下面是一个例子:


这个渲染顺序其实和网格质心点的空间位置有关系,开启Alpha混合模式后,物体被作为一个整体,距离摄影机近的物体可以完全遮挡距离远的物体,并且无法处理物体间交叉的问题。


所以,利用这些性质,就可以大致的模拟多重折射的效果了。

我的表达能力有限,建议大家多实验一下,找找感觉。。。(GIF图上传会失败我也没辙)
目前已知Alpha混合和一些体积着色器有冲突,并且不支持屏幕空间反射(需要延迟渲染的支持)。Alpha混合模式的物体反射可以通过烘培立方盒反射(Reflection Cubemap)来解决,虽然说这种方法只能解决场景的静态物体反射,但也聊胜于无。。。



然后是Alpha钳制(clip) 模式(Alpha test)
这种模式下的透明是没有渐变的,透明度只有完全为0或者完全为1,也就是只有完全透明和完全不透。它是根据图像上黑白的值来进行裁剪的,颜色值小于阈值的区域都会被裁剪,阈值越高,裁剪的范围越大。下面用一张渐变纹理做演示:


最后是Alpha hashed模式
类比于ue4的ditherTAA,可以将透明物体通过Alpha Test随机采样噪点加抖动的方式进行混合。这种模式下折射混合透明着色器也可以达到多重折射的效果,并且支持屏幕空间反射,透明物体交叉部分显示效果也会好一些,缺点也很明显,会产生很多噪点,需要通过提高采样( TAA )来缓解这个问题。


所以,大家要根据情况选择合适的混合模式。了解了它的工作方式,很多问题便迎刃而解了。
作者:seer/1214883153@qq.com