第四章 Unity 5中基于物理原理的渲染

基于物理原理的渲染physically-based rendering是Unity5中加入的最大的变化之一,也就是我们常说的PBR。前面的一些章节重复提到过它但是没有却没向大家过多的展现。如果你不仅想知道PBR的工作原理,还想搞明白如何构建它们,那么这一张正是你需要阅读的。

在这一章,你将会学习下面的几个知识点:

  • 理解金属质感的设置
  • 向PBR中添加透明度
  • 创建镜子和反射面
  • 烘培场景中的光

  • 介绍

    我们在**第三章理解光照模型 中介绍了所有的光照模型,简单的讨论了一下光是如何表现的。在编写它们的时候效率efficiency是最重要的方面。实时渲染的开销是很大的,类似于LambertianBlinnPhong这样的光照模型技术,也仅仅是在模拟现实和性能开销中的折中方案。拥有了更加强劲的GPU(graphics processing unit)后,我们就可以编写更加精细的光照模型和渲染引擎,目的就是为了模拟光的真实行为。简单概括前面的来说,这就是PBR后面的哲学。正如它的名字所表达的那样, 它是尽可能的去接近真实的物理,来处理每一个不同材质,让他们看起来都不一样。不仅如此,PBR这个术语被广泛的用于市场营销,它更像是艺术级的渲染(state-of-the-art rendering),而不是一个简单的技术。Unity5通过引入两个重要的改变,实现了PBR。首先是一个全新的光照模型(叫Standard**)。表面着色器允许开发人员指定材质的物理属性,但是他们却没有对它们应用任何的物理原理限制。PBR用新的光照模型来弥补了这个差距,应用了一些物理原理,比如能量守恒(energy conservation)[一个物体反射的光线不可能多于接收的光线],微表面散射(microsurface scattering) [粗糙表面比光滑表面的反射更没有规律],菲涅尔反射(Fresnel reflectance)[高光反射出现在掠射角内],和表面阻塞(surface occlusion)[一些角落的暗部和一些几何体很难照亮]。所有说的这方面,还有一些其他的,都被用来计算标准光照模型。第二方面让PBR开起来如此真实技术叫全局光照(Global Illumination [GI]),它是对基于物理原理的光线传输的模拟。也就是说,如果这些物体是独立的实体,那么它们不会被绘制[不会反光只吸收光的的物体,这种绝对黑体是看不见的]。它们会影响最终的渲染效果,因为光线在碰到其他物体前首先会从它们身上反射。虽然在着色器中不会自动提及这方面,但是对于了解渲染引擎是如何工作来说是很重要的部分。然而令人难过的是,实时的精确模拟光线在物体表面到底是如何反弹,这已经超出了现代GPU的能力范围。Unity5做了一些很聪明的优化,即保持了视觉质量有没有牺牲性能。然而大部分的一些进阶技术(比如反射) 需要用户的输入。上面说的这些方面都会在本章介绍。 不过希望各位留意的是,即使是PBR或者GI这些技术也不能保证你的游戏可以获得照片级的画质。要获得照片级的画面是一项很有挑战性的工作,跟每一门艺术一样,需要非常专业和杰出的技巧。


理解金属质感的设置

Unity5提供了两种不同类型的PBR着色器; 它们指的是材质的检查器面板(Inspector)中的下拉列表中的Standard着色器和Standard (Specular setup)着色器。两者的主要区别在于前者为我们暴露了Metallic这个属性,而后者没有Metallic,但暴露了Specular这个属性。metallic 属性和specular 属性代表了初始化PBR材质不同方式。推动PBR的概念之一是提供给开发人员和艺术家一种有目的性的,基于物理相关的一些属性,让他们可以调整和把玩它们。 有些材质的属性更容易用来表示它们的质金属质感强度指标,而其他的另一些属性则直接于定义了光是如何反射的,也很重要。如果你过去使用过Unity4,那么对于Standard (Specular setup)着色器应该看起来更熟悉。这个知识点会教你如何有效的使用金属质感设置(metallic setup)。有个重点需要各位注意,金属质感的工作流不仅仅用于金属材质;它是根据表面的金属质感或者非金属质感来定义材质的视觉效果的一种方式。尽管呈现的是两种不同的类型的着色器,但这**金属(Metallic )高光(Specular)**这两种方案通常来说是相等的表示。 就像Unity文档中所展示的:http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html,这两种设置都可以创建同样的材质(如下图所示):


  • 始前准备

    在这个知识点中我们将用Unity5提供的标准着色器,所以我们没有必要重新创建一个。我们通过下面的步骤来开始学习这个知识点:

    1. 创建一个新的材质球。
    2. 在这个材质球的检查器(Inspector)面板,确保Shader这个下拉菜单中选择的是Standard

    同时你需要一个带有纹理的3D模型。


  • 操作步骤

    在标准着色器中有两个主要的纹理需要配置:AlbedoMetallic。为了有效地使用金属化工作流,我们需要正确的初始化这些映射:

    1. Albedo映射应该用3D模型的**unlit(不受光照影响)**纹理初始化。
    2. 创建Metallic映射之前,先复制一份文件用留给Albedo映射。你可以在项目(Project)面板中中选择要复制的贴图,然后通过快捷键Ctrl + D**复制。
    3. 用白色 (#000000)给表示纯金属的材质的贴图区域上色。而其他要用的的颜色都用黑色(#000000)。灰色的着色应该用于表示满是灰尘的,风化的和磨损的金属表面,还有生锈表面,有刮擦的绘画等等。事实上,Unity仅仅使用了红颜色(R)通道来保存金属质感的值;而绿颜色通道(G)和蓝颜色通道(B)则被忽略了。
    4. 用图片的的alpha通道来提供材质的**光滑度(Smoothness)**信息。
    5. 把**金属质感(Metallic)**贴图关联到材质球中。**金属质感(Metallic)光滑度(Smoothness)**的滑动条都会消失,因为这两个属性现在由贴图控制了。

  • 原理介绍

    旧着色器中的光照模型条件让艺术家们很难创造出贴近现实视觉效果。之所以会这样,是因为旧的表面着色器中所有的属性间没有关联。通过介绍金属质感的工作流,Unity5将强制对游戏对象的表现将添加更多系统参数,这样的话艺术家们就能更易创建合理的材质。

    金属是电的良导体;而光是电磁波的一种形式,也就是说相比于不良导体(经常被称为绝缘体(insulators)),几乎所的金属都有相似的行为表现。导体的反射率很高,能反射大部分的光子(70-100%)。然后剩余没有被反射的光就被吸收了,不是漫反射出来,也就是说导体的漫反射元素很黑[其实我觉得翻译成很低也能说的通]。相反的是,绝缘体反射率很低(%4)而剩余的光在表面被散射掉了,所以漫反射效果明显。

    在标准着色器中,纯金属材质拥有较黑的漫反射元素并且它的高光反射的颜色由Albedo贴图来定义。相反的,对于纯粹的非金属材料来说,Albedo贴图定义的是它们的漫反射元素; 而它们的高光高光颜色其实是由射进来的光颜色决定的遵守这些规则在金属工作流中可以把albedospecular结合进Albedo贴图中去,实行精确的物理行为。在牺牲材质视觉效果控制的前提下,这能让我们节省更多的空间,而且极大的提升运行速度。


  • 相关补充

    想获得更多关于金属质感的设置的信息,你可以参考下面链接的信息:

    校准图表(Calibration chart):如何校准一个金属质感的材质球

    (http://blogs.unity3d.com/wp-content/uploads/2014/11/UnityMetallicChart.png)

    材质图表(Material chart): 如何为一些常用的材质初始化标准着色器的参数

    (http://docs.unity3d.com/Manual/StandardShaderMaterialCharts.html)

    Quixel MEGASCANS: 一个巨量的材质素材仓库[网站],还包括纹理和PBR的参数设置[网站已经变了,我纠正一下]

    (https://quixel.com/megascans/home/)

    PBR纹理的转换:传统的着色器如何转换成PBR着色器

    (http://www.marmoset.co/toolbag/learn/pbr-conversion)

    Substance Designer:一个基于节点的跟PBR一起工作的额软件

    (https://www.allegorithmic.com/products/substance-designer)

    基于物理原理渲染的理论:一个关于PBR的完全教程[源网址已经变了,帮大家重新找到了]

    (https://academy.substance3d.com/courses/the-pbr-guide-part-1-zh)