【《Unity 2018 Shaders and Effects Cookbook》提炼总结】(九)Physically - Based Rendering

    制作过程中最重要的方面时效率,实时着色很昂贵,而Lambertian或BlinnPhong等技术是计算成本和现实之间的折中。

    拥有更   强大的GPU允许我们逐步写更强大的光照模型和渲染引擎,目的是模拟光的实际行为,简而言之,这就是PBR(Physical—Based Rendering)背后的哲学。

   PBR(Physical—Based Rendering)在Unity5中引入,是一着色模型,旨在以光在现实世界中的工作方式类似的方式呈现图形。

   Unity以两种主要方式实现PBR:

        第一种是全新的照明模型(称作Standard),Surface Shaders允许开发人员指定材质的物理属性,但它们不强加实际的物理约束。PBR通过使用照明模型(lighting model)来填补这一点,该模型强制执行物理原理,例如能量守恒(物体不能反射能量总是不大于接收值),微表面散射(粗糙表面反射光线比光滑表面相比更不规律),菲涅耳反射率(镜面反射出现在入射余角)和表面遮挡(暗角和其它难以照亮的几何图形的暗角)。所有这些方面以及许多其它方面,是被用于计算标准照明模型。

      使PBR如此逼真的第二个方面称为全局照明(GI),并且是基于物理的光传输的模拟。这意味着对象不会在场景中绘制 ,就好像它们是单独的实体一样。它们都有助于最终的渲染, 正如它的名字所暗示的,它视图尽可能地接近物理背后地过程,给每个材料一个独特地面。 因为光可以在击中其它东西之前反射它们。这一方面不是在Shader本身中捕获的,而是在渲染引擎如何工作的重要部分。不幸的是,准确地模拟光线实际上如何让实时反射到表面上超出了现代GPU的能力。Unity进行了一些巧妙地优化,是我们能够在不牺牲地情况下保持视觉保真度。然而,一些最先进地技术(例如反射)需要用户输入。

      重要地是要记住,PBR和GI并不能自动保存你的游戏是真实的,实现照片写实是一项非常具有挑战性的任务,就像每件艺术品一样,它需要出色的专业知识和卓越的技能。

了解金属设置

      Unity提供了三种不同类型的PBR着色器;它们在材质的Inspector面板shader选项卡的下拉菜单中分别称为Standard,Standard(Roughness Setup)和Standard(Specular setup).主要的区别在于Standard和Standard(Roughness Setup)公开Metallic属性,但Standard包含Smoothness属性,而第二个替换Smoothness with Roughness。Standard(Specular setup)包含Smoothness,但用Specular替换Metallic属性。Smoothness和Roughness是彼此相反的,因此1意味着平滑0意味着粗糙,反之亦然,无论我们使用哪种着色器,通常都可以获得相同的结果,因此它主要归结于个人偏好。

     这些设置代表了初始化PBR材料的不同方式。推动PBR的一个概念是能够提供美术和开发人员可以调整和使用的有意义的物理相关属性,某些材料的属性更容易表示,表明它们的金属质。对于另一些人来说,更重要的是要明确它们是如何直接反射光线的。金属工作流程不仅适用于金属材料;它是一种根据材料表面的金属或非金属性来定义材料。尽管呈现为两种不同类型的着色器,但Metallic和Specular设置通常具有同样的表现力。

为PBR增加透明度

     透明度是游戏中的一个重要方面,标准着色器支持三种不同的方式。如果我们需要具有透明或半透明属性的真实材质, 眼镜,瓶子,窗户和水晶是PBR透明shader的理想选择。这是因为我们仍然可以通过添加透明或半透明效果来获得PBR引入的所有真实感。如果我们需要透明度来表示不同的东西,例如UI元素或像素元素。

注意:为了获得透明的标准材质,更改其Albedo颜色属性的alpha通道是不够的。除非我们争取设置了它的渲染模式,否则我们的材质将不会显示为透明。
    

   a.创建一个材质命名为TransparencyMat.

   b.确保材质的Inspector面板的Shader属性是被设置为Standard或者Standard(Specular setup)。

   c.将新创建的材质指定给我们想要指定的对象。

Standard Shader提供三种不同类型的透明度,尽管非常相似但它们有微妙的差异,适合不同的环境。

Semi-transparent materials(半透明材质)

一些材质,比如透明塑料,钻石,玻璃是半透明的,这意味着它们都需要PBR的所有逼真效果。(例如镜面高光,菲涅尔折射和反射),而且允许看到附着有材料的物体后面的几何体。

    d.在材质的Inspector面板,将渲染模式(Rendering Mode)设置为透明。

    e.透明度由Albedo颜色的alpha通道或Albedo图确定,如果单击Albedo右侧的框,则会弹出一个Color菜单。调整A通道会使项目更明显或更不可见

透明渲染模式非常适合窗户,瓶子,宝石和耳机。

   注意:你应该注意到许多透明材质不会投影阴影。除此之外,材料的金属和平滑特性会干扰会干扰透明效果,但如果它反射所有入射光,它将不会显示为透明。

带洞的实体几何体

       游戏中遇到的大多材质都是实心的,这意味着它们不允许光线穿过它们。同事,许多物体具有非常复杂(但平坦)的几何形状。使用3D对象对叶子和草进行建模通常是过度的。更有效的方法是使用具有叶子纹理的四边形(矩形)。虽然叶子本身是实心的,但其余的纹理应该是完全透明的。

        1.从材质的Inspector面板,将渲染模式改成Cutout。

        2.使用Alpha Cutoff滑块确定截至阈值。将隐藏Albedo贴图中Alpha值等于或小于Alpha   Cutoff的所有像素。

        3.下图展示了Unity在PBR上的官方工具 (https:/​/​www.​youtube. com/​watch?​v=​fD_​ho_​ofY6A),Cutout渲染模式的效果可用于在几何体中创建孔。

       4.值得注意的是,Cutout不允许看到几何体的背面。在上一个示例中,我们无法看到球体的内部体积。如果有需要这样的效果,则需要创建自己的Shader并确保不会剔除背面几何体。

创建镜面和反射表面

       从特定角度观察物体时,镜面反射材料会反射光线,不幸的是,即使最准确的模型之一菲涅耳反射也不能正确的反射附近物体的光线。之前章节中检查的照明模式仅考虑了光源,但忽略了从其他表面反射的光。

       通过为PBR着色器提供有关周围环境的信息,全局光照使这成为可能。这允许对象不仅具有镜面反射高光,还具有真实反射,这取决于它们周围的其他对象,实时反射非常昂贵。正确完成后,它们可用于创建类似于镜像的表面,如下图所示。

      

     a.创建一个新的场景;

     b.创建一个四边形,它将作为镜像,我们可以把它的Y轴旋转一下,以便于查看。

     c.把四边形和其他物体一起放置到场景中;

     d.创建一个reflection probe(GameObject|Light|Reflection Prode)然后放置在四边形的前面。

     为了把它做成镜子我们需要做一些改变:

     a.改变shader的材质为Standard而且RenderingMode改为Opaque;

     b.将其Metallic和Smoothness属性更改到1,你可以更清楚的看到反射天空的材质;

     c.选中reflection probe而且改变它的Size和Probe Origin,知道它位于四边形的前面,并包围你想要反射的所有对象。

     d. 要在Cubemapp捕获设置下更清晰地显示项目,请将分辨率改为2048.

     e.最后,将其Type更改为Realtime,将Refresh Mode更改为Everything,设置如下图所示。

     

     它是如何运行的

         从当shader需要有关其周围环境地信息时,它通常提供一个称为cubemaps的结构,简而言之,立方体贴图是@D纹理的3D等价物;从中心角度来看,它们代表了360度的世界观。 

        Unity使用球形投影预览cubemaps,如下图所示;

       

     当cube maps是附属于相机时,它们被称为天空盒,因为它们用于提供反射天空的方式。它们可以用于反映实际场景中不存在的几何图形,例如星云,云和星星。它们被称为cubemaps的原因在于它们的创建方式:cubemap是由六种不同的纹理组成,每种纹理都附加到面上。我们可以手动创建cube maps或将其委派给reflection probe。我们可以想象reflection probe为六个摄像头的结合,创建周围区域的360度映射。这也是probe如此消耗的一个原因。通过在场景中创建probe,我们运行Unity知道镜子周围的物体。如果需要更多反射表面,可以添加多个probe。我们无需进一步操作reflection probe即可工作。standardshader将自动使用它们,我们应该可以注意到,当它们设置为Realtimes时,它们会在每个帧的来头渲染其立方体贴图。有一个技巧可以让它更快;如果你知道要反射的几何体部分不会移动,则可以烘焙反射。这意味着Unity可以在开始游戏之前计算反射,从而允许更精确的计算(并且计算成本更高)。因此,我们的reflection probe必须设置为Baked,并且仅适用于标记为static的对象。静态物体不能移动或改变,这使它们非常适合地形,建筑物和道具。每次移动静态对象的时候,Unity都会为其烘焙的反射探针重新生成reflection probe重新生成cube maps,这可能需要几分钟到几个小时。

      为了提升游戏的真实感我们可以混合Realtime 和 Baked probe。Baked prorbe 将会提供非常高质量的反射,环境反射,然而实时可以用作于移动的车和镜子等物品。场景中的Bakeing lights将会详细说明lightingbaking 如何工作。

场景中的Baking lights

       从Baking lights是非常昂贵的过程,即使使用最先进的GPU,精确计算光传输(表面之间的光反射)也可能需要数小时。为了使这个过程对游戏可行,实时渲染是必不可少的。现代引擎在现实主义和效率之间妥协;大多数计算都是在一个叫做lighting baking的过程中预先完成的。

       Light baking需要我们准备好场景,文章的最后我会附上场景场景。

       Light baking需要一些手动配置。我们需要采取三个基本但独立的过程。

配置静态几何体

       确保场景中所有对象不改变位置,大小和材质。可能的候选是建筑物,墙壁,地形,道具,树木等,在我们的例子中,除了FPSController及其子物体外,它将是所有对象。

       选中这些对象并勾选Inspector面板的Static选项,如果你选中的对象有孩子对象,Unity将会提醒你是否想让它们的孩子也保持Static。如果它们符合要求(合适的位置,大小而且材质)选择是,在弹出框中更改子项。

提示: 如果灯光符合static对象但照亮non-static几何体,请确保其Baking属性设置为Mixed。如果它只影响static对象,设置为Baked。

配置light probes

       游戏中有些物体会移动,例如主角,敌人和其他的NPC 。如果它们进入被照亮的static区域,你可能希望用light probes围绕着它,为了做到这一步,我们可以做以下这些。

       a.在菜单中,选中GameObject|Light|Light Probe Group。Hierarchy面板下将出现Light Probe。

       b.一旦选中,将出现八个相互连接的球,单击并在场景中移动它们, 以便它们包含角色可以进入的静态区域。以下截图显示了如何使用Light Probe封装静态工作空间体积的示例。

对于我们的例子,它只是玩家能够进去的中心区域。

      c.选中将会进入light probe区域的移动物体。

      d.在它们的Inspector中,展开他们的渲染器组件(通常是MeshRender)并确保Light Probes未设置未Off ,如下图所示

决定何时何地使用light probe是一个关键问题。

Baking the lights

       a.首先选择你想要bake的灯,从Inspector选项卡确认Mode在Light组件中设置为Baked:

       b.要最终烘焙灯光,请转到Window|Lighting|Settings,在那里,选择Genrate Lighting。

即使对于相对较小的场景,Light bake也可能需要几个小时,如果你不断移动static 对象或者llights,Unity将会从头开始重新启动该过程,导致编辑器严重减速。我们可以取消选中Lighting|Lightingmaps|Setting中的Auto复选框以防止这种情况发生,以便我们自己可以决定何时手动启动该过程。

它是如何工作的

       渲染中最复杂的部分是光传输。在此阶段,GPU计算光线在物体之间反弹的方式。如果物体及其灯光不移动,则此计算只能进行一次,因此它在游戏过程中永远不会改变。将对象边界为Static是告诉Unity可以进行这样的优化。

      简而言之,light baking是指金属静态物体的全局光照并将其保存在所谓的光照贴图的过程。烘焙完成后,可以在Lighting窗口中的Globe Maps中看到光照贴图。

      light baking需要付出巨大代价:记忆力。事实上,每个静态表面都重新经过纹理处理,因此它已经包含了它的照明条件。让我们想象一下,你有一片树林,都拥有相同的纹理。一旦它们变成静态,每棵树都将拥有自己的纹理,Light baking不仅会增加游戏的大小,而且如果不加选择地使用,也会占用大量纹理内存。

     我们这篇中也介绍了light probe。light baking可为Static几何形状提供极高质量的结果,但不适用用于移动物体。如果你的角色正在进入static区域,它可能会以某种方式脱离环境。它的阴影余周围环境不匹配。它的阴影与周围环境不匹配,导致美学上令人不愉快的结果。其他对象(如蒙皮网格渲染器)即使设为Static也不会接收全局光照。尽管Light probe提供了有效的替换方案,但实时light bake是不可能的。每个light probe都会在空间的特定点采样全局光照。light probe group可以在空间中采样几个点,允许在特定体积内插值全局照明,这使我们能够在移动物体上投射更好的光线,即使全局光照仅计算几个点。重要的是要记住,light probe需要封闭一个体积才能工作。最好将light probe放置在光线条件突然变化的区域。与光照贴图类似,probe消耗内存,应该明智地放置;请记住,它们仅适用于non-static几何体。

      以上均基于Unity2018.1.0f源码可见我的GitHub:

    https://github.com/xiaoshuivv/ShadersUnity2018.1.0f.git

猜你喜欢

转载自blog.csdn.net/qq_39218906/article/details/86750812
今日推荐