Chapter17 全局光照
17.1 概述
全局光照,简称 GI
作用:用来模拟光的互动和反弹等复杂行为的算法
两个系统:Enlighten & Progressive Lightmapper。通过 Lighting 窗口的 Lightmapper 进行切换
设置全局光照: Window -> Lighting -> Setting
17.1.1 Enlighten
通过GI算法实现实时全局光照,消耗较少性能提供更真实丰富的光照效果,提供全系的光照流程,提供了 更快的迭代模式,需要更高品质和细节时,场景会被预计算与烘焙效果替换。
优点:让用户实时看到光照结果,但任何图形的变动都要对场景重新烘焙
17.1.2 Progressive Lightmapper
渐进光照贴图,一种无偏移的蒙特卡洛方法路径追踪器,可以配合全局光照使用烘焙光照贴图,改善场景光照烘培工作流程。
优点:健壮性更高,间接以光照贴图的全分辨率进行烘焙,下次更少,可以轻松预测渲染所需的时间,进度条上的倒计时可以呈现给用户。可以随时停止烘焙,并在添加或增设内容及样本后继续烘焙。渲染速度不一定比 Enlighten 快,但从烘焙到得到视觉反馈的时间显著缩短。
17.1.3 Lightmap seam stitching
光照贴图缝合技术,可以平滑烘焙光照贴图渲染的 GameObject 中不需要的硬边缘
作用: 与 Progressive Lightmapper 一起用于光照贴图烘焙,仅适用于单个 GameObject。
在GameObject启用缝合:在 GameObject 的 Mesh Render 组件中,打开 Lightmao Settings 部分(仅当用户使用渐进式光照贴图 Progressive Lightmapper 时才可以访问) 然后勾选 Stitch Seams。
17.2 实践
烘焙光照的方式:Mixed 混合 & Baked 烘焙
Mixed 和 Baked 区别?
- Mixed:
提供介于实时和 Baked 之间的光照方式,将间接光照烘焙到贴图,并始终提供直接光照动态物体阴影是实时的 - Baked:
将光源的直接光照和间接光照都烘焙到光照贴图中,动态物体无法产生阴影
什么光照系统可以使用烘焙:Lightmapper 设置为 Progressive 或 Enlighten 时都可以进行烘焙流程
Auto Generate 作用:默认勾选,如果场景中参数变化,会自动重新生成光照贴图。取消勾选时,在用户需要重新烘焙时,手动生成光照贴图。
光源类型设置为 Baked 后,在此烘焙光照贴图,然后关闭光源,此时动态游戏对象无阴影
17.3 系统参数详解
17.3.1 FBX模型导入设置
导入时注意事项:确保模型的 UV 值在 0.0 到 1.0 之间,否则无法对该模型进行烘焙,烘焙时提示警告。
如何解决:在 Project 视图下 Assets 文件夹中选择模型实例对应的 FBX 文件,在 Inspector 视图中 Import Settings 面板下勾选 Generate Lightmap UVs,单击 Apply 按钮应用设置。
17.3.2 Reflection Probe 反射探针
像一个捕获其周围各个方向的球形摄像机,从四面八方捕捉周围环境的球状影像将捕获的图像存储为一个立方体贴图,可供具有反射材质的物体使用。
特点:同一个给定的场景或对象,可以添加几个反射探针。可以设置为使用 距离最近的反射探针生成的立方体贴图,物体上的反射可以根据环境变化。
添加反射探针: GameObject -> Light 中,选择 Reflection Probe。
面板作用: 在 Inspector 的 Reflection Probe 面板上部有两个按钮,分别由编辑探针大小,和修改探针在场景中位置属性的功能。
17.3.3 Light Probe Group 光照探针组件
一种快速计算实时渲染应用中的光照技术,常用于处理游戏世界的人物⻆色或是动态物体的光照,允许移动对象接受由全局光照所计算出来的复杂反射光源。
优点:在运行时有不错的处理性能 (消耗低),而且预计算也相当快速。
特点:如果没有添加光照探针,动态对象就无法接受全局光照
注意事项:
- 密度不应太高
- 距离太近的光照探针在特定光照条件下的采样结果几乎一致
- 推荐在光照变化明显的区域设置密度较高的探针
17.3.4 Lighting 窗口
如何打开 Lighting 窗口:Window -> Lighting -> Settings
作用:实时 GI 开销较大,Lighting窗口允许用户根据需要调整光照过程,如定制用户的场景或优化质量,提升质量和分配储存空间,同时包含照明相关的设置,包括环境光,天空盒,雾效等。
Auto Generate:不论切换 Scene, Global maps 还是 Object maps,它始终在底部启用时,光照贴图随着用户编辑的场景更新。关闭时,Generate Light 复选框激活,需要使用按钮手动触发更新,Generate Light 按钮下拉菜单中有一个选项可以清楚场景烘焙的数据 (不清除 GI 缓存)。
环境参数 :重点,⻅ P342 表 17-3 (实时光照,混合光照,光照贴图参数*)
17.3.5 Light Explorer 光探测器
允许用户选择和编辑光源
Window -> Lighting -> Light Explorer
Chapter18 导航网格寻路 Nav Mesh
18.1 Unity的导航寻路系统
导航网格: Nav Mesh 是 3D游戏世界中用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。
如何使用导航网格:系统可以根据用户所编辑的场景内容,自动的生成导航网格。实际导航时,只需要给导航物体挂载导航组件,导航物体变便会形根据目标点来寻找符合条件的路线,并沿着该路线行进到目的地。
Unity Nav Mesh组成:
- Nav Mesh:
- 导航网格
- 描述游戏世界的步行表面的数据结构
- 允许从游戏世界两点间,生成一个可以行走的路径
- 数据结构是根据关卡自动生成或烘焙的
- Nav Mesh Agent:
- 导航网格代理
- 代理组件可以帮助用户创建⻆色
- 代理使用 Nav Mesh 对游戏世界进行推理
- 知道如何避开彼此和移动的障碍物
- Off-Mesh Link:
- 非网格连接组件
- 允许 Agent 不按照 Nav Mesh 进行移动
- Nav Mesh Obstacle:
- 导航网格障碍组件
- 用于描述运动的物体
- Agent 会有选择地绕过它,从而避免与之碰撞或穿透
18.2 实践操作
P347
- 添加导航网格
选中对象,在 Inspector视图右上⻆static下拉列表中选择 Navigation Static。此时,对象标记为 Navagation Static
Window -> Navigation
在 Navigation 窗口中单击 Bake选项卡 右下⻆的 Bake按钮生成 Nav Mesh
烘焙完成后会在 Assets 中自动创建一个 NavMesh 目录 - 添加 Agent
选择游戏对象,Inspector -> Add Component -> NavMesh Agent
或者
Component -> Navigation -> NavMesh Agent
添加完成后,对象上会出现绿色的圆柱框,绿色圆柱框即为 Navigation 视窗中的 Baked Agent Size - 为游戏对象添加材质
Assets -> Create -> Material - 实现跳跃
在 Navigation 视窗中,编辑 Generated Off Mesh Links 的两个参数,Drop Height 和 Jump Distance,之后重新Bake即可。注意,设置的 Drop Height 应比场景中测量的高度值大一些,以便非网格连接正确
18.3 系统参数详解
18.3.1 Navigation 窗口
Window -> Navigation
面板属性:
- Object 物体参数面板
- Navigation Static: 勾选后,该游戏对象将参与导航网格的烘焙
- Generate Off MeshLinks: 勾选后,自动根据 Drop Height 和 Jump Distance 的参数设置,用关系线来连接分离的网格
- Navigation Area: 导航区域设置。在默认情况下分为 Walkable,Not Walkable,Jump
- Bake 烘焙参数面板
- Areas 导航区域设置,用于对导航网格分层
- Agents 代理设置
- 默认只能由 Humanoid 代理烘焙出 Nav Mesh
- 为了将导航网格烘焙成其他代理类型,需要使用 NavMesh Sur法测组件
18.3.2 Nav Mesh Agent
18.3.3 Off Mesh Link
18.3.4 Nav Mesh Obstacle
注意:如果 Nav Mesh Obstacle 未勾选 Carve 复选框,当⻆色寻路有障碍物阻挡时,将不会自动绕开,而是处于被阻挡状态
18.4 导航网格寻路的高级技巧
18.4.1 使用 Off Mesh Link
作用: 当用户不需要在 Navigation 窗口中生成的多条非网格连接时,可以使用 Off Mesh Link 组件实 现
使用方式:
- 在 Navigation 视窗 Bake 选项卡中,将 Drop Height 和 Jump Distance 设置为 0;
- 创建一个空对象,命名为 Link,给它添加一个 Off Mesh Link 组件(Component Navigation);
- 创建一个空对象,命名为 end,将 end 设置为 Link 的子物体,将 Link 上的 Off Mesh Link 组件的 Start 设置为 Link,End 设置为 end
- 同理,其他地方也可以添加非网格连接
- 运行游戏,即可通过非网格连接寻路
18.4.2 为网格分层
Navigation -> Area -> Add Area “Bridge”
Hierarchy -> Bridge(1) -> Navigation -> Object -> Navigation Area 设为 Bridge
18.4.3 动态更改可行进层
18.4.4 使用 Nav Mesh Obstacle
Chapter19 遮挡剔除
19.1 概述
遮挡剔除技术: 当一个物体被其他物体遮挡住,而相对于摄像机不可⻅时,可以不对其渲染
重复渲染 overdraw: Unity 引擎不会自动进行遮挡剔除,因多数情况下离相机远的物体先渲染,近的物体后渲染,从而覆盖先渲染的
与视锥体剔除(Frustum Culling)的区别: 视锥体剔除只是不渲染摄像机视锥之外的物体,被遮挡的物体依然会被渲染,使用遮挡剔除功能时,视锥体剔除功能依然有效
19.2 参数详解
19.2.1 Occlusion 窗口
Window -> Occlusion Culling
遮挡剔除窗口功能: 窗口的 Object 选项卡中,选中场景中的网格渲染器,可修改静态标志
- Occluder Static:开启该标记的物体,既能遮挡,也能被遮挡
- Occludee Static:开启该标记的物体,只能被遮挡
选择 Occluder or Occludee:
- 选中对象,Inspector -> Static 下拉列表 -> 设置 Occluder, Occludee
- 选中对象,Occlusion -> Object 勾选
Occlusion Area: 在 Occlusion 视窗中可以选择遮挡区域,默认遮挡剔除应用于整个Scene。⻅ P362
Occlusion Bake 选项卡: P361
Chapter20 后期屏幕渲染特效
20.1 概述
后期处理:将全屏过滤器和效果应用于相机的图像缓冲区,并将其显示到屏幕上,可以在短时间内大幅提升产品的视觉效果
效果:
- Bloom 泛光
- Depth of Field 景深
- Chromatic Aberration 色差
- Color Grading 颜色分级
后期处理栈及其优点:
可以将一组完整的效果合并到一个后期处理管道中
- 效果总是按正确顺序配置
- 允许将多种效果组合成单通道
- 所有效果都组合在用户界面中
包含一组监视器(Monitors)和调试视图(Debug Views)
使用后期处理: 从Asset Store 中下载 Post Processing Stack 并导入
注意事项: 为获得最佳的后期处理效果,建议在启用 Allow HDR 的线性色彩空间中工作, 也建议使用延迟渲染路径。
设置 Post Processing Stack:
-
将PostProcessingBehaviour.cs脚本添加到相机上
- 将脚本从 Project 视图拖动到相机上
- 依次点击 Component Effects Post-ProcessingBehaviour
- 或使用 Inspector 视图中的 AddComponent按钮
-
使用以下方法之一创建自定义配置文件
- 右键单击 Project -> Create -> Post-Processing Profile
- Assets -> Create -> Post-Processing Profile
Tip:后期处理配置文件是项目资源,可以在场景相机项目/商店之间轻松共享
20.2 参数详解
20.2.1 Fog 雾效
雾效:是根据与相机之间距离,将颜色叠加到物体上的效果,用于模拟室外环境中的雾效, 根据相机的深度纹理创建屏幕空间雾效,支持线性,指数,指数平方雾类型
设置:在 Lighting 窗口的 Scene 选项卡中设置
注意事项:此效果仅适用于延迟渲染路径(Deferred),雾效应用在向前渲染 (forward rendered) 物体上,并使用场景设置中的雾效
20.2.2 Anti-aliasing 抗锯⻮
抗锯⻮:Anti-aliasing 提供了一组算法,可以防止锯⻮以提供更平滑的外观,VR 中不支持抗锯⻮
VR 中不支持抗锯⻮:
- Fast Approximate Anti-aliasing(FXAA):
快速近似抗锯⻮,最经济的技术,推荐用于不支持运动矢量的移动平台等,也适合作为较慢桌面系统和控制台硬件的备选方案。 - Temporal Anti-aliasing (TAA):
时间消除锯⻮,一种更高级的锯⻮消除技术,将帧累计在历史缓冲区,以便更有效地平滑物体边缘,在平滑运动边缘方面效果更好,但需要运动矢量,计算开销更大。
20.2.3 Ambient Occlusion 环境光遮罩
作用:可实时逼近全屏后期处理效果,使得互相靠近的折痕,孔,交叉点变暗,现实生活中这些区域往往有遮挡或遮挡环境光线,因此看起来较暗
特点:环境光遮罩计算开销很大,通常只能在桌面或控制台硬件上使用
20.2.4 Screen Space Reflection 屏幕空间反射
作用:是一种重新使用屏幕空间数据来计算反射的技术,通常用于创建更加微妙的反射(潮湿的地板或水坑)
特点:计算开销大,但效果很好,不建议在移动设备上使用,仅在于延迟渲染路径中可用
20.2.5 Depth of Field 景深
作用:可模拟相机镜头的对焦属性,焦点远处的物体会失焦
20.2.6 Motion Blur 运动模糊
作用:模拟相机在拍摄的物体移动速度快过相机曝光速度造成的模糊
20.2.7 Eye Adaption 眼部适应
作用:模拟眼睛适应不同程度黑暗和光线的能力,此效果会根据其包含的亮度级别范围,动态调整图像的曝光,调整是在一段时间内逐渐进行的。
20.2.8 Bloom 泛光
作用:用于再现真实世界相机的成像伪影的效果(光晕)
20.2.9 Color Grading 颜色分级
作用:改变或校正最终图像的颜色和亮度的过程,可看作成像在照片处理软件中使用过滤器
20.2.10 User Lut
作用:一种更简单的颜色分级方法,比颜色分级更先进,此方法不需要 在Color Grading 中使用的 高级的纹理格式
20.2.11 Chromatic Aberration 色差
作用:用于复制相机的缺陷,如无法将所有颜色聚焦到同一点
20.2.12 Grain 颗粒
作用:胶片颗粒是照相胶片中的金属银颗粒产生的随机光学纹理,模拟电影的某些效果
20.2.13 Vignette 渐晕
作用:模拟与中心相比,图像边缘变暗/去饱和的效果,常用语产生艺术效果,如将焦点集中到图像中心
20.2.14 Dithering 抖动
作用:模拟与中心相比,图像边缘变暗/去饱和的效果,常用于产生艺术效果,如将焦点集中到图像中心
20.2.14 Dithering 抖动
作用:有意施加噪声,以随机量化误差,防止图像中出现大规模的颜色条纹
20.2.15 Debug Views 调试视图
作用:可以查看特定的效果或路径
20.2.16 Monitors 监视器
Chapter21 Shader 开发
21.1 Shader 概述
什么是 Shader: 着色器,用来控制可编程图形渲染管线的程序
作用:替代了传统的固定渲染管线,可以在渲染管线中应用3D图形学的相关计算,极大地拓展创作者的开发空间
Unity Shader 特点:基于物理的 Standard Shader,可以创建出非常多的不同材质,不需要身后的 3D 图形学知识,也可以做出基于物理渲染的真实效果。
PBS:基于物理的着色,Physically Based Shading 简称PBS,遵从了 conservation of energy 能量守恒定律的理论。可产生自然和谐的光照效果。
21.2 内建 Shader 介绍
P387 – 389
21.2.1 内建着色器
21.2.2 内建标准着色器
21.3 Shader 的创建
Shader种类:
- Surface Shader:
表面着色器,通常使用这种 Shader,可以与灯光,阴影,投影器进行交互,使用 Cg/HLSL 编写。 - Vertex and Fragment Shaders:
顶点和片段着色器,不需要与灯光进行交互,更灵活,代码量更大,很难与渲染管线完美集成,使用 Cg/HLSL 编写。 - Fixed Function Shaders:
固定功能管线着色器,可在不支持可编程管线的老旧硬件上运行,使用 ShaderLab 编写。
SubShader:子着色器,当 Unity 使用着色器渲染时,会从上到下遍历子着色器,找到第一个能被用户设备支持的着色器,并用其进行渲染。
FallBack:备选着色器,一般会指定一个对硬件要求最低的 Shader,当所有子着色器都不能运行时,Unity 会使用备选着色器进行渲染。
Chapter22 AssetBundle 工作流程
支持在游戏运行过程中,对资源进行动态下载和加载,是 Unity 提供的一种用于存储资源的文件格式 可以表示彼此间的依赖关系,可用于下载内容(DLC)。
22.1 AssetBundle 的创建
通过 AssetBundle 的 UI 和简单的脚本,在 Unity 中创建 AssetBundle 文件
API:BuildPipeline.BuildAssetBundles
注意事项:AssetBundle 的标记名称要小写,可以有后缀
Chapter23 多人游戏和联网
其中重点看 23.9 Unity 服务重点浏览