美文网首页征服Unity3dUnity Shader分享Unity技术分享
【Unity3D技术文档翻译】第3.1篇 光照概述

【Unity3D技术文档翻译】第3.1篇 光照概述

作者: 何三思 | 来源:发表于2018-07-01 12:45 被阅读17次
Unity3D技术文档翻译

上一章:【Unity3D技术文档翻译】第3.0篇 光照总览 & 灯光

本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Lighting overview】

光照概述

为了计算3D物体的阴影,Unity需要知道落在物体上的光的强度、方向和颜色。

这些属性由场景中的 Light 对象提供。不同类型的灯光,以不同的方式发射它们的颜色光; 有些光可能随着距离光源的距离而减弱,并且根据来自光源灯光的角度不同而具有不同的规则。想了解 Unity 中不同类型灯光的细节可以查阅 Types of light 一节。

Unity 能够以不同的方法计算复杂、高级的光照效果,每种适用于不同的情景。

选择一种光照技术

一般来说,Unity 中的光照在某种程度上可以被分为“实时(realtime)”和“预计算(precomputed)”两种,并且它们可以被组合使用,以创造一个拟真的场景光照。

在本节中,我们将简要概述不同技术提供的效果、它们的相对优势,以及各自的性能特征。

实时光照(Realtime lighting)

默认情况下,Unity 中的灯光——线性光、聚光、点光都是实时的。这意味着它们为场景提供了直接光照,并且在每一帧更新。随着灯光与游戏对象在场景中移动,光照将立即随之更新。这一效果在场景和游戏视图中都能看到。

实时光单独影响。注意阴影是完全黑色的,因为没有反射光。只有被聚光灯照射到的表面受到影响。

实时光照是场景中最基本的光照方式,可用于照亮移动的角色或其他几何体。

然而,Unity 中只使用实时灯光的时候不能反弹(bounce)。为了使用全局照明等技术创建更真实的场景,我们需要启用 Unity 预先计算的照明解决方案。

烘焙光照贴图(Baked lightmaps)

Unity 能够计算复杂的静态光效果(使用一种叫全局光照的技术: global illumination,简称 GI),并将它们存储进一张被称为光照贴图(lightmap)的参考纹理贴图中。这个计算过程被称为:烘焙(baking)。

当烘焙一张光照贴图时,场景中光源在静态对象上的效果将被计算,计算结果被写入纹理贴图中。这些纹理贴图将覆盖在游戏对象的表面,以创造出光照效果。

左边:一个简单的光照贴图场景。右边:由 Unity 生成的光照贴图。注意它们的光照和阴影信息是如何被捕捉的。

这些光照贴图中,不仅包含了照射表面的直接光,还包含反弹自场景中其他物体的反射光。光照纹理可以与物体材质上着色器的颜色(albedo(反照率))和地形(normals(法线))一起使用。

使用烘焙光照时,这些光照贴图在游戏中不能被改变,因此被称为“static(静态)”。实时光照可以覆盖和叠加在光照贴图上,但是不能改变光照贴图本身。

使用了该方法,我们就可以用游戏中移动灯光的能力换取潜在的性能提升,适配像移动平台一样的低性能硬件。

想要了解更多信息,请查看 the Lighting window reference 一节与 Using precomputed lighting 一节。

预计算实时全局照明(Precomputed realtime global illumination)

静态光照贴图不能响应场景中光照变化的情景,但是 Precomputed Realtime GI(预计算实时全局照明)能够为我们提供一个可交互的、刷新复杂场景光照的技术。

有了这种方法,就有可能创造出具有丰富的全局照明和反射光线的照明环境,这些光线会对照明的变化做出实时反应。一个很好的例子就是一天中的时间系统——光源的位置和颜色一直在变化。使用传统的烘焙光照就不可能实现这点。

使用 Precomputed Realtime GI 展示一天中时间变化的例子。

为了在可玩的帧率下实现这些效果,我们需要将一些冗长的数字处理,从实时处理转换为预先计算的处理。

预计算将游戏过程中发生的计算复杂光照行为的负担,转移到计算不那么关键的时候。我们将该过程称为“offline(脱机)”处理。

想要了解更过信息,请查看 lighting and rendering tutorial(光照与渲染教程) 一节。

收益与损耗

尽管可以同时使用 Baked GI lighting(烘焙全局光照) 和 Precomputed Realtime GI(预计算实时全局光照),然而需要注意的是:同时渲染这两个系统的性能消耗,完全等于它们各自消耗之和。不仅仅包括我们不得不存储在显存中的光照贴图配置,还包括在着色器中解码处理的性能消耗。

选择哪一种光照方法,取决于你的项目的特性和目标设备的处理性能。举个例子,在显存和处理能力比较受限的移动设备上,Baked GI lighting(烘焙全局光照)表现会更好。而在具有独立显卡,以及最新发布的主机上,使用 Precomputed Realtime GI(预计算实时全局光照),甚至两种光照方法都使用,都是可以的。

选择哪种处理方式,应该基于你的项目的特性和目标平台。注意,如果目标平台是范围较大的不同设备,通常最低性能将决定你采取哪种方式。

更多信息,请查看 Light Troubleshooting and Performance(灯光问题诊断与性能) 一节。

如果本文对你有帮助的话,点个赞或者评论一下吧!

下一章:【Unity3D技术文档翻译】第3.2篇 光照设置窗口(Lighting Window)

相关文章

网友评论

    本文标题:【Unity3D技术文档翻译】第3.1篇 光照概述

    本文链接:https://www.haomeiwen.com/subject/mhycuftx.html