日期:2024年3月8日
书籍:《Unity 2017 虚拟现实开发标准》-人民邮电出版社-9787115507587

VR01-环境配置和光照学习

1 安装VIVE、SteamVR

相关链接:
VIVE:https://www.vive.com/cn/setup/pc-vr/
SteamVR:https://store.steampowered.com/app/250820/SteamVR/

通过 SteamVR 硬件配置(略)

2 导入美术馆场景到Unity,搭建VR测试环境

一、下载群文件 meishuguan.unitypackage
二、创建 Unity 3D 项目(非 URP 项目)
三、双击资产包导入 或 在 Untiy 内 Assets - Import Package 导入
四、在 Project 面板 - ProjectAssets 文件夹 找到 meishuguan.unitypackage

3 学习光照(Book.P50)

Unity Creative Core:https://learn.unity.com/tutorial/get-started-with-lighting#

3.1 光照入门

光线的类型、特点、光线的艺术作用、灯光师的职责、不同光源的区别

3.2 Unity 中的光照

3.2.1 直接光和间接光:

直接光:光源照亮物体直接反射到眼睛中。e.g.被光照亮的苹果

picture 0

间接光:物体被其他物体所影响反射到眼睛中。e.g.被苹果的光反射成红色的白色桌面。
picture 1

3.2.2 全局光照 Illumination

The Baked Global Illumination system

属性 作用
Lightmapping 预先计算场景中表面亮度并将结果存储在称为光照贴图的纹理中的过程。此全局照明系统使用称为渐进光照贴图的特定光照贴图系统来完成此过程。
Light Probes 一种工具,用于测量(或探测)有关穿过场景中空闲空间的光的数据。
Reflection Probes 一种在 Unity 中模拟更逼真的反射的工具。
picture 3

The Realtime Global Illumination system

属性 作用
Lightmapping 此全局照明系统使用已弃用的光照贴图器,称为 Enlighten 光照贴图器。
Light Probes 光探头在此全局照明系统中具有一些附加功能。
Unity中的实时光照

3.3 Unity中的 Directional Light 和 Sky Box

在Unity中,新建任何一个场景都会有 Directional Light 和 Sky Box。

打开美术馆场景,旋转定向光会看到透过窗户的光线发生明显变化:

picture 4

除此之外,还可以改变光源的颜色:
picture 5

天空盒是Unity中的场景环境,由各个面上不同纹理的立方体组成。天空盒有两种类型:Textured 和 Procedural。一个是直接使用材质,一个是使用参数来生成天空盒。

3.3.1 创建 Procedural 天空盒

Right Click > Create > Material > MySkybox,创建一个天空盒材质。

选中 MySkybox 材质,在右侧 Inspector 面板的 Shader 属性中,更改为 Skybox > Procedural 类型,用于 Procedural 天空盒材质编辑。

picture 6

将材质拖入 Lighting 面板 Environment 选项卡的 Skybox Material 中,调整参数。
picture 7

picture 8
Property Function
Sun 创建太阳
Sun Size 太阳大小
Atmosphere Thickness 大气密度,密度越大,吸收的光越多
Sky Tint 天空的色调
Ground 地平线以下的色调
Exposure 调整天空曝光

3.4 添加光源

3.4.1 聚光灯与点光源

Spot Lights Point Lights
聚光灯 点光源
picture 9 picture 10

3.4.2 设置环境光源

来到 Lighting > Enviroment 面板,将 Environment Lighting > Source 设置为 Skybox。

如果设置为 Gradient ,天空盒将不会影响到物体的环境光照

注意,游戏对象需要设置为静态 Static,才可以用于环境光烘培,环境光烘培是预计算的。

3.5 配置阴影

3.5.1 将项目转化为 URP 管线

安装 Universal RP
picture 11

创建管线资产:
Assets > Create > Rendering > Universal Render Pipeline > Pipeline Asset
picture 12

在导航栏 Edit > Project Setting,
Graphics > Scriptable Render Pipeline Settings,选择 UniversalRenderPipelineAsset
picture 13

转换材质
导航栏 Window > Rendering > Render Pipeline Converter
picture 14

材质显示正常
picture 15

3.5.2 配置阴影

选中 New Universal Render Pipeline Asset > Inspector > Shadows,
picture 16

Parameter Function
Max Distance 距离摄像机的最大距离,超过此距离则不再渲染远处的阴影
Depth Bias, Normal Bias 阴影细节,处理本该在亮出但是却被包含在阴影中的像素
Soft Shadow 获取更平滑的阴影

其中,Max Distance 需要修改画质最高的 URP 配置文件,比如 High、Very High、Ultra…

调整 Cascade Count,观察阴影质量变化如下:
picture 17
可以发现,每一级都在增加阴影质量

启用 Directional Light 的 Soft Shadow:
picture 18

3.5.3 Unity 中的后处理 Post-Processing

Unity 中的 Post-Processing 可以类比于摄影中的后期滤镜,可以节省场景的光照探测所消耗的算力,而简单粗暴的把摄像机中的内容调整出风格化的画面。
picture 19

在 Hierarchy > 右键 > Create Empty > Inspector > Add Component > Volume > Add Override
按需要添加效果,这里添加了:Bloom, Tonemapping, Vignette, Chromatic Aberration

3.5 烘培光源 Baked Lighting

3.5.1 实时光与烘培光

实时光 Real-time lighting
Unity 会在项目运行的时候实时计算光线,这些光线会在每一帧中被重新计算和更新,这就允许一些运动的物体和需要交互的物体能够拥有真实的光照效果,但同时这也要求计算机需要有更好的性能,比如 Nvida 在 20 系列才开始支持实时光照而推出了 RTX 系列显卡。

烘培光 Baked lighting
Unity 会在程序运行之前计算好光线,在程序运行时,只需要把提前计算好的光线数据应用在场景中即可,但这些光线不会与物体产生交互,物体不会改变预先计算好的光线状态。

生成光线数据的过程与生成 UV 贴图类似,与 UV 坐标映射到材质上一样,光照贴图叫做 lightmap。

得益于预先渲染的特性,烘培光还能让用户感受到更加真实的光照效果。

3.5.2 修改光照模式

picture 20 可以在 Inspector > Light 修改,也可以在 Light Explorer 面板中找到光源进行修改。

3.5.3 修改要被光照影响的物体为 Static 资源

正如字面意思,程序运行时不移动的物体为静态资源,即 Static。
只需要在 Inspector 面板,勾选上 Static 即可,Unity 在预计算光照的时候会自动把这些物体对光照的影响考虑进去。
picture 21

没有被勾选 Static 的物体在烘培光照的时候不会被计算进去,比如下图中的左侧灯具模型没有阴影,因为左边的模型没有勾选 Static 复选框。

picture 22

3.5.4 烘培光照

  1. Window > Rendering > Lighting > New Lighting Settings
  2. Mixed Lighting > Lighting Mode > Baked Indirect
  3. Lightmapping Settings > Lightmapper > Progressive GPU (Preview)
  4. 回到 Lighting 窗口,点击右下角 Generate Lighting
    picture 23
    此时 Unity 会出现进度条来表示灯光烘培的进度。

3.5.5 区域光 Area Light

picture 26 区域光会从区域的各个位置发射光线,适合用作室内光。区域光的创建和其他光源一样,在 Hierarchy 面板右键 > Light > Area Light

不同的是,区域光只能有烘培模式,只能被烘培使用。所以每当更改了参数,需要 Generate Light 之后才能看到更新后的效果。

3.5.6 混合光照渲染 Mixed Mode

许多灯光拥有 Mixed Mode 的渲染模式,Unity 会根据用户进入的区域和程序设定的渲染范围来自动的切换 Baked Mode 和 Real-time,对于小型项目来很实用。

但作为开发者,仍然应该规范的使用 Baked Mode 和 Real-time 的光源,来有规划的减小项目的硬件性能消耗。

3.6 利用光照探头 Light Probes 改善光照

3.6.1 什么是 Light Probes,有什么用?

在 Baked 场景中,灯光数据已经保存在了 Light Map 中,动态物体不会对光照产生影响,而光照探头就是用于检测空白空间中灯光的数据,用于计算和动态物体相交的光线。

Light Probes 可以是烘培场景更加真实,与 Real-time 光源相比,Light Probes 的放置可以让场景运行更加高效。

3.6.2 如何放置 Light Probes?

picture 27 每在 Unity 中创建一个 Light Probe Group,就会包含 8 个 Light Probe 分布在 3D 容器中,可以编辑他们的位置、复制、删除它们。 picture 28 picture 29

没有 Light Probe 的区域里,Sphere 上的光线不会被计算,但在 Light Probe 的区域中, Sphere 的光线仍然会被计算。

picture 30

通过点击 Unity 上的绘制模式,可以选择 Contributors/Receivers,来查看场景中各物体对全局照明的影响:

  • 黄色:游戏对象未设置为静态,并且不会对光照贴图计算产生任何影响(颜色或光线)。它仍然从场景的光探针接收照明数据。在场景中,球体应为黄色。
  • 蓝色:游戏对象 包含在光照贴图计算中,它从场景的光照贴图接收光照数据。 这是完全烘焙的游戏对象的标准状态。场景中的环境和道具应为蓝色。
  • 红色:游戏对象包含在光照贴图计算中,它从场景的光照探针接收光照数据。 要使它变为红色,需要将球体标记为静态,并有助于场景中的光照贴图。

3.7 室内照明:自发光材质

3.7.1 创建自发光材质

自发光材质可以在室内照明中模拟很多 LED 光照。

  1. 创建自发光材质:Project 面板 > Material > 右键 > Create > Material,随便命名,比如 Emissive
  2. 选择要充当灯条的物体,Inspector 面板 > Mesh Renderer 组件 > 将 Emissive 材质拖进去
  3. 选择 Emissive 材质,在 Inspector 面板调数据
  4. Surface Inputs > Emission > Emission Map HDR,选择一个颜色,并把 Intense 调整为 2.5
  5. Generate Lighting
picture 31

在 Scene 视图中,将渲染模式改为 Emissive 也可以用于检查自发光材质,此时场景中只有自发光材质的物体显现了出来。
picture 32

如果在自发光材质的光照区域有运动的物体,还需要在该区域添加 Light Probes Group,用来探测运动物体的光照。

3.8 改善光照

3.8.1 改善投影

选中所有环境物体,勾选为 Static,并在 Mash Renderer > Lighting > Cast Shadows 中,更改为 Two Sided

这样会使场景中的投影更加真实。

3.8.2 提高反射次数

当场景中光照比较暗的时候,增加光源可能会显得多余,此时可以增加光线的反射次数来提高亮度。

注意,提高反射次数会延长烘培时间。

Lighing 窗口 > Scene > Lightmapping Settings > Max Bounces : 4

增加反射次数前后对比如下图:
picture 33
picture 34

3.8.3 增加间接光强度

Lighing 窗口 > Scene > Lightmapping Settings > Indirect Intensity : 1.8

前后对比:
picture 34
picture 35

3.8.4 改善漏光

  1. 找到漏光区域
  2. 依次排查 Directional Light > Skybox > 大光源 > 小光源
  3. 在 Inspector 面板 > Realtime Shadows > Bias,拖动相关滑块,观察漏光情况。(如果 Bias 设置得太高,会导致阴影与游戏对象看起来不匹配)
  4. Generate Lightinh

3.8.5 为模型生成光照贴图

picture 36 如果新导入的模型发生扭曲,可能是光照贴图发生错位,重新生成光照贴图即可。

将渲染模式调整为 Baked Lightmap 可以检查是否是光照贴图造成的模型扭曲。

picture 37

要修复光照贴图,选中模型。
Inspector Panel > Generate Lightmap UVs : Checked > Apply

picture 38

3.8.6 反射探针

在部分室内场景下,具有反射材质的物体可能会只反射天空和灯光,不会反射室内的材质,这样是不合常理的,于是我们需要使用到反射探针。

Hierarchy Panel > 右键 > Create > Light > Reflection Probe

picture 39 picture 40