本书版本为“占红来 译”版,笔记会持续更新,有错误的地方欢迎指正,谢谢!
引言
PBR(Physically-Based Rendering):基于物理基础的渲染。
Unity是如何做到PBR的:
- 标准光照模型(Standard),用户可指定材质的物理属性;
- 全局光照(GI),模拟物理世界中光线传播的技术。
但是PBR和GI并不会自动让你的游戏美轮美奂,获得好的拟实感是一个颇具挑战性的工作。
理解金属光泽属性
Unity5提供了两种类型的PBR着色器:Standard和Standard(Specular setup)。
两者的区别:前者有一个金属光泽属性,后者则换成了一个高光属性。金属光泽和高光属性虽是两种不同的类型,但表现力是差不多的。
常识:导体会反射大部分光子(70%以上),其余的没有反射的光子被材料吸收掉而不是散射(偏离原方向的光称为散射光)掉,所以散射成分会非常暗;而绝缘体相反,反射率非常低(4%左右),其余的没有反射的光子被散射,所以散射成分会非常亮。
给PBR添加透明度
可用于制作透明/半透明材料:褪色物体、树叶、眼镜、玻璃瓶、水晶等。
标准着色器提供了三种实现透明度的方式:
半透明材料(即使最右边那个球体Alpha为0,即完全透明,你也可以看到PBR作用后的高光等特效。)
a) 在材质的Inspector中,将渲染模式(Rendering Mode)设置为透明(Transparent);
b) 再由Albedo映射中的Alpha控制透明度。
褪色物体(PBR效果随着球体的透明度降低而减弱,最右边那个完全透明的物体也就不可见了。)
a) 在材质的Inspector中,将渲染模式(Rendering Mode)设置为褪色(Fade);
b) 再由Albedo映射中的Alpha控制透明度。
带孔的几何体
a) 在材质的Inspector中,将渲染模式(Rendering Mode)设置为剪切(Cutout);
b) 再使用Alpha Cutoff滑块来调节剪切阈值。在Albedo映射中,所有Alpha通过值小于或等于该阈值的像素点都会被隐藏。
用途:制作树叶
有一个很高效的方法:将树叶纹理设置为一个长方形,控制好各部分的Alpha值,这样就可以做到树叶本身不透光,但树叶的其他部分是完全透明的。
另外,可以用剪切渲染模式来制作中间有孔的几何体:
创建镜面和反射型表面
之前章节涉及的光照模型只会考虑真正的光源,而不会计算从其他表面反射来的光,全局照明通过给PBR着色器提供其周围环境信息可以做到这一点。但是,实时反射的代价是相当昂贵的,还需要很多人工的微调,才能得到下图这个效果:
要实现这种效果,需要一个反射探头(Reflection Probe),并将其放置在“镜子”面前。
操作步骤:
- 将“镜子”材质着色器修改为Standard,并把渲染模式修改为Opaque;
- 将其Metallic和Smoothness属性设置为1;
- 选择反射探头(GameObject|Light|Reflection Probe),然后修改其尺寸(Size)和探头原点(Probe Origin),确保其在“镜子”前面并包裹了所有你想反射的物体;
- 将探头类型改为实时(Realtime)。再确保其剪切遮罩(Culling Mask)设置为Everything。
- 最后,如果你的探头是用来做一个真实的镜子,应该选中Box Projection选项。如果用于制作金属表面或玻璃桌等则不需要。
自己做的(垃圾)效果:
亲身经历,真的很耗性能!
工作原理:
当着色器需要周围信息时,周围信息通常使用立方体贴图。当探头被设置为实时之后,会在每一帧的开始时渲染其对应的立方体贴图。
这里有一个小技巧:把游戏中始终不会动的几何体提前烘焙好其反射效果(详情请见下一节)。此时,反射探头应该设置为Baked,并且这种方式只对那些标注了静态(Static)的物体有效。
可以混合使用Realtime和Baked探头来提升游戏的真实感,Baked探头可以提供非常高质量的反射效果,Realtime探头非常适合反射运动型的物体。
在场景中添加烘焙光
上述描述的就是光线烘培,光线烘焙指的是:计算一个物体上的全局照明,并将其结果保存为 光线映射图(lightmap) 的过程。
需要三个步骤:
- 配置静态物体;
- 配置光线探头;
GameObject|Light|Light Probe Group
它由8个相互连通的球体组成,需要把静态区域围起来:
手动烘焙:Lighting->最下方点击Build
自动烘焙:Lighting->最下方勾选auto(建议不要勾选!)
光线烘焙让每一个静态物体都重新添加了新的纹理,盲目使用的话,会增加游戏的包体大小。另外,实时烘焙光线是不可能事件~