【《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
【《Unity 2018 Shaders and Effects Cookbook》翻译提炼】(九)Physically - Based Rendering相关推荐
- 【《Unity 2018 Shaders and Effects Cookbook》翻译提炼】(三)法线贴图和透明材质
1.法线贴图 3D模型的每个三角形都有一个面向方向,这是它指向的方向.它通常用放置在三角形中心的箭头表示,并且与表面正交.面对方向在光线反射到表面上的方式中起着重要作用.如果两个相邻的三角形朝着不同的 ...
- 【《Unity 2018 Shaders and Effects Cookbook》翻译提炼】(八)BlinnPhong模型和 Anisotropic 高光(可用于金属性,头发)
这篇文章最好与前一篇连着看,自己可做比较. 1.BlinnPhong 模型 Blinn是计算和估计镜面反射的另一种更有效的方法.这是通过从 视图方向和光方向获得半矢量来完成饿.JimBlinn将它带入 ...
- 22.01.23 《Unity 2018 Shaders and Effects Cookbook》笔记Chapter7
7.Fragment Shaders and Grab Passes vertex and fragment shader 对光照如何影响物体表面不感兴趣,不受物理限制,对非真实感的效果很好 使用#p ...
- Unity Shaders and Effects Cookbook (3-6) 创建各向异性高光类型(Anisotropic) 模拟金属拉丝效果
这一次学习各向异性高光类型,名字真拗口,Anisotropic 这个英文单词也很拗口. 各向异性是模拟物体表面 沟槽方向性的高光反射类型,他会修改或延伸垂直方向上的高光. 比如模拟金属拉丝的效果,就可 ...
- Unity Shaders and Effects Cookbook (3-4) 使用高光贴图
在学习完上一节之后.已经了解了在Unity 中怎样实现一个高光 Shader ,可是会有一个问题.就是效果看起来不切实际,如以下的问题 我用一张图片贴到了Cube上面.然后用了一个高光材质,得到了下图 ...
- Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画
上一节中说了,在 Surface Shader 中,添加顶点函数,我们可以在 顶点函数中获取到 顶点数据,比如顶点颜色.顶点坐标等. 这一节学习获取顶点坐标,并且修改顶点坐标,来实现顶点动画. 简单介 ...
- Unity Shaders and Effects Cookbook (2-7)实现 Photoshop 色阶效果
看完了这一书上的代码,然后在网上查找 Photoshop 色阶的一些解释,大致理解为:调整色阶就是调整亮度,也就是调整纹理 R.G.B 通道的数值大小. 下面是 Photoshop 中的直方图转自ht ...
- Unity Shaders and Effects Cookbook (4-5)Cubemap与菲涅尔反射
菲涅尔是人名,他发现,当我们站在水中,直直的往下看水面,是看不到反射的太阳光的.而当我们往远处看时,就能看到很强的反光,也就是成语波光粼粼所体现的.这一现象就被命名为 菲涅尔反射. 刚看这一节的时候觉 ...
- 《Physically Based Rendering》翻译中文版——Introduction(介绍)
我自己在自学计算机图形学,现在正好学习到基于物理渲染这一块.在网上查阅大量的资料发现很少有中文的资料,想着趁着自己学习的时候,将这本书翻译过来帮助大家阅读和学习这本书中的内容.因个人能力和精力有限,在 ...
最新文章
- 黄聪:php实现上传图片和等比例缩略图压缩图片
- 人工智能应用实战系列-如何在新闻推荐中使用迁移学习
- Android 制作类似支付圆圈和打钩界面ProgressWheel
- 斐波那契数的两种求法(迭代,递归)
- Error: Could not open client transport with JDBC Uri: jdbc:hive2://henu2:10000: java.n et.ConnectExc
- pythonopencv图像形态_Python+OpenCV图像处理之其他形态学操作
- MySQL 避坑指南之隐式数据类型转换
- bzoj1934 [Shoi2007]Vote 善意的投票 最小割
- JAVA设计模式初探之组合模式
- Java关于延迟加载的一些应用最佳实践
- 农村男女离婚,为什么感觉很多都是女人什么都带不走?
- redis缓存雪崩,缓存穿透,缓存击穿的解决方法
- 【数论】nefu119 组合素数
- 全量增量数据同步方法(Hive date_add date_sub)
- 中兴机顶盒服务器地址大全,中兴机顶盒网络设置无线路由器教程
- GitHub 披露宕机原因;谷歌前 AI 研究员被解雇后成立独立研究所;常用 Linux 桌面版排行榜出炉 | 开源日报
- 数字化转型需要双模IT
- stm32定时器引脚分布,定时器2~7、9~14基本配置
- 博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)
- 业界动态-新一代万亿级消息系统Pulsar的应用实践-03