PBR基于物理的着色

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,当然也可以再之基础上添加更多的效果,艺术的大脑是无限的。

发布了27 篇原创文章 · 获赞 7 · 访问量 7301

猜你喜欢

转载自blog.csdn.net/yunman2012/article/details/94405512
PBR