Unity5之后加入新的渲染方式 PBR。PBR是一种着色和渲染技术,用于更精确的描述光如何与物体表面互动。PBS(Physically Based Shading)在有一些地方也叫PBR(Physically Based Rendering),是一个基于物体表面材质属性的着色方法。与之前的Blinn-Phong等算法不同。PBS通过对物体表面的材质属性与周围光照信息来进行着色计算。PBS着色系统中,一个物体不仅受到光源的影响,还会受到周围环境的影响。 这会使得整个场景更加真实。
PBS有一个大前提,就是它能够满足光能传播过程中的能量守衡。能量守衡体现在三个方面。
1、一个对象反射出来的光照信息,不可能超过它接受到的信息。也就是说,全反射是一个物体的极限。
2、一个物体越光亮,那么它的颜色信息应该越少。(可以看出,refection 和 diffuse 应该是一个插值关系)
3、一个物体越平滑,那么它的高亮点会越小,越亮。
下面以一个自己实现的 pbr 例子,例子下载地址,点击这里。
关于 pbr shader的实现这里就不再赘述了,工程附带的 readme 推导公式、源码都给的很详细。本文主要是通过此例子来验证 pbr 的一些特性。
选中材质,开启 OpenDebug 选项。通过输出参数控制来调试 pbr 的各种效果。当然这些只是在编辑器里预览,游戏运行时,可以通过 material.DisableKeyword()来关闭此选项,来避免不必要的计算。
我们都知道PBR 材质金属性越强,反射的光越少,因为大部分光都被金属吸收了,转化为热能或者说电能。
为了验证 pbr 这一特性,我们 debugmode 选中 Diffuse,如下图所示,拖拽 Matillic 属性来改变材质的金属性发现:matallic 值越大,材质的颜色越暗;反之,材质的颜色越亮。
下面我们再验证 PBR 材质的能量守恒性质:
我们把 Debug Mode 选中 None, 不要开启边缘发光效果,我们拖拽 Gloss 选项来改变材质的光滑度。通过滑动,我们可以发现,Gloss 越小,漫反射(高光部分)区域越大,但光线锐度越小;Gloss 越大,虽然高光区域越小,但光线的亮度越高,锐度越犀利。
更多的调试选项这里就不一一列举了,比如查看材质发现的方向,PBR 公式计算的过程中 法线分布函数、微平面遮挡系数、Fresnel 现象等等,等等都可以通过 DebugMode 来调试。
然而,尽管实现了 pbr 的特性,往往却不能满足美术或者说策划大大们的需求,这些需求往往并不是更真实的着色,比如说我们在展示 avatar 的时候,需要一圈外发光效果。有时候外发光的颜色使我们场景里主光的颜色,有时外发光的颜色是某一个指定的颜色。
在材质的选项中,我们没有勾选 SpecialRimColor,外发光的颜色为主光的颜色,当我们勾选之后,可以指定一个特定的外发光颜色。效果如下图所示:
处理半透明有多重方式,主要是 AlphaTest 和 AlphaBlend 两种。在例子的Example_ALPHA的 scene 中,我们给了四种 alpha 混合方式:Opaque、 Cutout、 CutoutTansparent、 Transparent四种裁剪方式。
Opaque 的渲染队列是Geometry, RenderType 是Opaque 效果是右下角,没有透明度也没有Alpha裁剪
Cutout 的渲染队列是AlphaTest,RenderType 是Opaque 效果如左下角,没有透明度但有 Alpha 裁剪
CutoutTransparent 渲染队列是Transparent, RenderType 是TransparentCutout, 有透明度也有 Alha 裁剪
Transparent 的渲染队列是Transparent, RenderType 是Transparent, 有透明度 Alpha混合处理
结语:我们可以使用 PBR,当然也可以再之基础上添加更多的效果,艺术的大脑是无限的。