第二十一章 光源

news2024/12/22 18:33:14

光源是每个场景必不可少的部分,光源除了能够照亮场景之外,还可以产生阴影效果。

Unity中分为四种光源类型

1. 方向光:Directional Light 用于模拟太阳光,方向光任何地方都能照射到。

2. 点光源:Point Light 用于模拟电灯泡的照射效果。

3. 聚光灯:Spot Light 用于模拟聚光灯照射效果。

4. 区域光:Area Light 区域光在“实时光照”模式下是无效的,只用于“烘焙光照”模式。

默认场景中会自动给我们添加一个Directional Light方向光,相当于一个太阳。

我们可以选择该光源查看它的Inspector检视视图,光源这个游戏对象,最重要的组件就是Light组件,截图如下所示

接下来,我们稍微解释一下Light组件的一些属性:

Type:当前的光源类型。可选值为 Directional、Point、Spot 和 Area。

Color:使用拾色器来设置发光的颜色。

Mode:指定光源模式。可选模式为 Realtime(实时)、Mixed(混合) 和 Baked(烘焙)。

Intensity:设置光源的亮度。

Indirect Multiplier:使用此值可改变间接光的强度。

如果是Spot聚光灯(Light组件的Type属性为Spot)的话,效果如下:

该类型的光源类似一个圆锥体,它有自己的“Range”和“Spot Angle”两个属性,前者代表光线照射的距离,后者代表圆锥体开合角度,也就是光线照射的范围。如下所示:

如果是Point点光源(Light组件的Type属性为Point)的话,效果如下:

该类型的光源有一个“Range”属性,它表示光线照射的距离,也就是圆球半径值。

最后一个是Area区域光,效果如下:

该类型的光源是通过空间中的矩形来定义的。光线在表面区域上均匀地向所有方向上发射,但仅从矩形的所在的面发射。无法手动控制面光源的范围,但是当远离光源时,强度将按照距离的平方呈反比衰减。由于光照计算对性能消耗较大,因此面光源不可实时处理,只能烘焙到光照贴图中。

光源在 Unity 中非常容易使用,可通过菜单栏 GameObject > Light 将光源添加到场景中。如果启用 Scene 视图光照(工具栏上的“太阳”按钮),则可在移动光源对象并设置其参数时预览光照效果。这里需要注意的是,方向光通常可放置在场景中的任何位置,沿自身Z轴正方向照亮整个场景,没有照射范围的限制,因此方向光跟位置没有关系,跟自身旋转有关系(直接影响物体的阴影位置)。聚光灯有位置,也有方向,但其照射范围是有限。点光源与聚光灯类似,他们都属于局部光源,主要用于场景中一些局部细节的光影效果处理。

光源的使用,有很多技巧。比如,如果游戏场景中必须使用光源,但又不希望一些游戏对象受到该光源的影响。我们可以创建一个图层Layer,并将这些游戏对象添加到该图层Layer中。在光源的检视面板中找到Culling Mask剔除遮罩属性,在下拉列表中选择该图层。那么该图层中所有游戏对象不在受到该光源的影响了。

关于光源这一块内容,大家不要忽略“环境光”,它是一个真真正正的全局光照,能够从四面八方照向游戏物体,也就是说,它不会产生阴影效果。我们可在 Lighting 窗口中找到环境光设置,默认它来自于天空盒材质贴图(光的本质就是颜色)。打开方式为菜单栏 “Window”->“Rendering”->“Lighting”,在弹出的新窗口中点击选中“Environment”。

Environment Lighting 该项为物体提供环境光。颜色来源可以是上面设定的Skybox天空盒材质球,可以使固定的颜色或渐变色。2D游戏中一般不需要任何光源,只需要设置环境光即可。我们顺便说一下下面的Environment Reflections ,该项控制环境光反射设置,同样也来源于Skybox天空盒材质球,它提供的是镜面反射效果,是基于物理的渲染(PBR)中重要的照明效果。也就是说,如果场景中有一个镜子的话,镜子里面呈现的是天空盒的样子。但是,如果这个镜子在一个房间里面的话,镜子里面呈现天空盒的样子,就不太合理了。Unity提供反射探针(Refletion Probe)技术,用于捕捉周围场景的图像,并将其储存为立方体贴图Cubemap。房间里面的镜子就可以通过反射探针(Refletion Probe)来呈现周围的景象。也就是说,当物体处于反射探针范围内时,该物体会反射反射探针范围内的环境信息。当场景中不存在反射探针时,场景中带有反射的物体会直接反射天空盒产生的环境信息。

这里,我就继续介绍一下天空盒。我们在DirectX课程中介绍过,它其实就是模拟现实世界中的天空。最简单的天空盒,就是一个立方体贴图而已。Unity中的天空盒本质是一个材质球。我们可以从Unity Asset Store中下载一些免费的天空盒,例如下面这个。

下载完之后,我们就可以导入当前工程中,如下所示

 

其中“Materials”目录下就是很多的天空盒材质球,而“Scenes”是给我们提供的一个场景。我们可以点进入“Scenes”看一看。

双击“Demo.unity”这个场景文件,如下所示

运行之后的效果如下

接下来,我们回到“Materials”目录下查看

上图中展示了很多的天空盒材质球,他们的本质也就是一张贴图而已。这些天空盒材质球如何使用呢?我们回到之前的默认场景,然后点击菜单栏:Window > Rendering > Lighting,再选择Environment选项面板,如下所示

我们要做的就是,将我们的材质球拖到上面红色标注的框中即可。

我们之前的场景是这样的,也就是默认的天空盒(Default-Skybox)。

改成“FS000_Day_01”之后的样子

接下来,我们介绍一下光照贴图(LightMap。大家需要明白的是,光照效果的计算是非常消耗硬件性能的,如果我们在游戏中每时每刻都要对所有的物体进行光照计算而得出其表现效果,这显然不是一个最好的方式。因此,我们可以将光照信息提前“烘焙”到贴图中,在游戏运行后,不再进行实时光照计算,而是直接从物体的光照贴图中获取信息,达到与之前一样的表现效果。Unity引擎为我们提供了功能强大的光照贴图功能,让美术人员可以在Unity编辑器里方便的烘焙光照贴图。但是,缺点就是这些光照贴图只能应用于静态物体(static,也就是不能移动的物体,并且表现效果是固定不变的,这个大家应该能够很容易理解。在上面介绍光源模式的时候,可选模式为 Realtime、Mixed 和 Baked三种。Realtime是实时光照,Baked是烘焙光照,Mixed是两者兼顾(默认项)。根据名称,我们就能大概理解这三种模式的用途了,烘焙光照的含义是会根据该光源烘焙光照贴图,光照贴图生成完毕后,该烘焙光源就可以不使用了,场景中的静态物体依然是之前的光照效果,但是动态物体就没有光照效果了,而且你如果移动静态物体的话,静态物体的阴影是不跟随移动的。这样看来,烘焙光照固然减少了计算性能,但是它不能满足动态物体的光照效果要求。那么,这个问题如何解决呢?其实就是Mixed模式,既可以保证静态物体的光照贴图效果,也可以额保证动态物体的实时光照效果。

接下来介绍两个概念:直接光照和间接光照

直射光照(Direct Lighting):光源直接照射到物体表面所产生的光照信息。

间接光照(Indirect Lighting):光源照射到物体表面以后再反射到其他物体上所形成的光照信息。间接光照让我们的场景更加逼真,因为这比较符合我们现实世界的真实光照情况。这就好比我们在一个物体旁边放置一面镜子,来自镜子的间接光照肯定会对这个物体产生光照效果的。但是,间接光照的实现需要支持实时光线追踪的硬件才能实现,比如Nvidia的RTX系列显卡。因此,在低端PC以及大部分手机上,我们还得依赖预先计算好的光照贴图来提供这些间接光照信息。没错,光照贴图既可以存储直接光照信息,也可以存储间接光照信息。在Unity中,光源主要控制的是直接光照,Lighting窗口主要控制的是间接光照。

接下来介绍另一个概念:全局光照系统(约等于烘焙)

全局光照系统是对直接光照和间接光照进行建模以提供逼真光照效果的一组技术。Unity 有两个全局光照系统:烘焙全局光照系统(Baked Global Illumination)和实时全局光照系统(Realtime Gloabl lllumination)。烘焙全局光照系统包括光照贴图、光照探针和反射探针。所有渲染管线均支持烘焙全局光照系统。实时全局光照系统包括使用 Enlighten 的实时全局光照,并为光照探针增加了额外功能。请注意,目前已弃用 Enlighten,很快就会从 Unity 中删除实时全局光照系统。这样看来,Unity全局光照主要用于烘焙光照贴图了。那么,我就来介绍一下Unity的烘焙全局光照系统,需要在Lighting窗口中进行设置。我们通过菜单栏Window -> Rendering -> Lighting打开Lighting窗口,然后点击选中“Scene”选项

默认情况下,没有光照配置,我们需要点击“New Lighting Settings”生成一个

同时在Project工程面板中,也会生成同名的光照配置文件,

我们回到“Scene”选项卡中有“Realtime Lighting”和“Mixed Lighting”两个选项。他们分别代表了烘焙全局光照系统(Baked Global Illumination)和实时全局光照系统(Realtime Gloabl lllumination)。从截图中,我们可以看出实时全局光照系统已经被废弃调了,剩下的就是烘焙全局光照系统,也就是在“Mixed Lighting”(混合光源)选项下面。为什么是混合光源?Unity默认的光源模式就是混合光源,也就是既支持实时光照,又支持烘焙,并且在烘焙的时候还支持全局光照技术(直接光照+间接光照的混合)。因为,我们上文中已经提到,烘焙光源虽然减少了性能计算,但是无法解决动态物体的光照需求。所以,动态物体还得需要实时光源才能解决。如果说,场景中既存在烘焙光源,又存在实时光源,那么光照贴图技术还有啥作用呢。当然有了,区别就在于静态物体和动态物体嘛。这道理很简单,烘焙光源用于静态物体,实时光源用于动态物体。所以说,光源推荐使用混合方式,尤其是主光源。

我们看到在“Mixed Lighting”下面有两个子选项,一个是启动烘焙全局光照系统的勾选框,另一个是“Lighting Mode”,默认值为“Shadowmask”。Shadowmask 模式下将烘焙间接光照效果到光照贴图中(也就是说间接光照不进行实时计算),同时直接光照产生的阴影也会被烘培到光照贴图中(也就是说阴影也不进行实时计算了)。也就是说,当运行工程时,改变混合光源不会影响间接光照和静态物体的阴影(固定在光照贴图里面),但其他渲染仍然是按照实时光源进行计算。因此,该模式是实时光照和光照贴图相结合的方式。需要注意的是,通用渲染管线 (URP) 不支持 Shadowmask 光照模式,虽然是默认选项。

另外还有两种模式可以选择:Baked Indirect和Subtractive。

Baked Indirect模式下,只烘培间接光照(也就是说间接光照不进行实时计算),直接光照以及阴影进行实时计算,因此性能的消耗比较大。请注意,该模式在三种渲染管线中都支持。

Subtractive模式下,同时烘焙直接光照和间接光照到光照贴图中,同时也会将静态物体的阴影也烘焙到光照贴图中。请注意,高清渲染管线 (HDRP) 不支持 Subtractive 光照模式。

三种模式对比而言,Subtractive模式性能消耗最低,因为静态物体的直接光照,间接光照和阴影都从光照贴图中获取,不再进行实时计算,当然动态物体肯定还是需要光源的实时计算的。请注意,对性能消耗最低,但是高清渲染管线不支持。其次是Shadowmask模式,该模式只烘焙静态物体的间接光照和阴影,直接光照仍然按照实时光照计算而得,相比较前者模式,性能消耗大一些。虽然性能消耗比较折中,也是Unity默认选项,但是通用渲染关系不支持。最后是Baked Indirect模式,该模式值烘焙间接光照,直接光照和阴影仍然按照实时光照计算而得,显然性能消耗最大。虽然性能消耗最大,但是所有渲染管线都支持。因此, 大家在进行游戏开发之处,就需要将这些内容确定了,选择那种渲染管线和那种模式。

在Lighting窗口中,我们还能看到Lightmapping Settings选项,下面有一些重要参数。

Lightmapper:指定使用哪个内部照明计算软件来计算场景中的光照贴图。Unity 使用一个名为渐进光照贴图 (Progressive Lightmapper) 的计算系统。默认Progressive CPU,表示采用CPU进行计算,还可以选择Progressive GPU进行计算。另外Enlighten已废弃(上面说过)。

Direct Samples:直接光照采样值

Indirect Samples:间接光照采样值

Environment Samples:环境光采样值

最后就是那个Auto Generate勾选项,如果我们勾选此项的话,Unity会自动帮我们生成光照贴图;如果我们不勾选(默认情况),我们需要点击右边的“Generate Lighting”来手动生成光照贴图。如果我们修改了光照或者场景的话,我们就需要重新生成光照贴图了。

最后我们来总结一下:Unity的四种光源类型很容易理解。比较难理解的是Unity的间接光照,它主要目的还是为了让场景更加的逼真,但是很遗憾的是,间接光照仅能用于烘焙,也就是用来生成光照贴图。光照贴图技术在Unity中大量被采用,因此光源模式才有了实时,烘焙和混合三种。默认情况下,我们推荐使用混合模式下的光源,烘焙光照贴图后,场景中的静态物体将从光照贴图中获取光照效果,而动态物体仍然通过实时光源计算获得光照效果。这样,既能保证整体的光照效果,又能减少性能的消耗。关于光照贴图的烘焙设置,需要大家了解Lighting窗口中的“Mixed Lighting”中“Lighting Mode”的三种模式。他们的区别就在于是否将直接光照,间接光照和阴影烘焙到光照贴图中,烘焙的内容越多,实时计算量就越少,这个应该不难理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb-Servlet【内含思维导图】

目录 Servlet思维导图​编辑 1.什么是Servlet 2.Servelt概述 3.Servlet-Quickstart Your Project 3.1创建一个Web项目,导入Servlet依赖 3.1.1 选择Servlet导入依赖 3.1.2 导入Servlet依赖 3.2 在Web项目,定义类,实现Servlet接口…

Java8新特性-流式操作

在Java8中提供了新特性—流式操作,通过流式操作可以帮助我们对数据更快速的进行一些过滤、排序、去重、最大、最小等等操作并且内置了并行流将流划分成多个线程进行并行执行,提供更高效、快速的执行能力。接下来我们一起看看Java8为我们新增了哪些便捷呢…

Python基础合集 练习19(类与对象3(多态))

多态 class Horse: def init(self, name) -> None: self.name name def fature(self):return 父亲-----马的名字: {0}.format(self.name)def mover(self):print(马儿跑起来很潇洒)class Monkey: def init(self, name) -> None: self.name name def fature(self):ret…

《用于准确连续非侵入性血压监测的心跳内生物标志物》阅读笔记

目录 0 基础知识 1 论文摘要 2 论文十问 3 实验结果 4 论文亮点与不足之处 5 与其他研究的比较 6 实际应用与影响 7 个人思考与启示 参考文献 0 基础知识 非侵入性是指在进行医学检查或治疗时,不需要切开皮肤或穿刺体内组织,而是通过外部手段进…

【VQGAN论文精读】Taming Transformers for High-Resolution Image Synthesis

【VQGAN论文精读】Taming Transformers for High-Resolution Image Synthesis 0、前言Abstract1. Introduction2. Related Work3. Approach3.1. Learning an Effective Codebook of Image Constituents for Use in Transformers学习一个有效的图像成分的Codebook为了在Transfor…

高性能:负载均衡

目录 什么是负载均衡 负载均衡分类 服务端负载均衡 服务端负载均衡——软硬件分类 服务端负载均衡——OSI模型分类 客户端负载均衡 负载均衡常见算法 七层负载均衡做法 DNS解析 反向代理 什么是负载均衡 将用户请求分摊(分流) 到不同的服务器上…

小记Java调用C++开发的动态链接库(DLL)

一、背景 五一快乐吖!死肥宅正趁着五一这段时间,努力提升自己! 最近使用Java拦截Windows系统中一些默认事件时,发现了一些瓶颈。 我用Java操作浏览器、用Java最小化其他应用窗口,但是我发现这个操作,他都…

【Unity-UGUI控件全面解析】| InputField 输入框组件详解

🎬【Unity-UGUI控件全面解析】| InputField 输入框组件详解一、组件介绍二、组件属性面板2.1 Content Type(内容类型)三、代码操作组件四、组件常用方法示例4.1 代码限制输入字符4.2 校验文本输入格式4.3 校验输入文本长度💯总结🎬 博客主页:https://xiaoy.blog.csdn.…

话说【永恒之塔sf】里面最有前途的职业:商人

如果有人问我永恒之塔里面什么职业最有前途!那我告诉你就是商人! 做一个NB商人比拥有一身牛b装备要更有成就感。 在老区由于进入的比较晚,所以最后随了大流被淹死在千万基纳中。为了证明商人在永恒之塔是钱途无量的,我转到了新区—…

快解析动态域名解析,实现外网访问内网数据库

今天跟大家分享一下如何借助快解析动态域名解析,在两种特定网络环境下,实现外网访问内网mysql数据库。 第1种网络环境:路由器分配的是动态公网IP,且有路由器登录管理权限。如何实现外网访问内网mysql数据库? 针对这种…

IDEA2022版教程上()

0、前景摘要 0.1 概览 0.2 套课程适用人群 初学Java语言,熟悉了记事本、EditPlus、NotePad或Sublime Text3等简易开发工具的Java初学者熟练使用其他Java集成开发环境(IDE),需要转向IDEA工具的Java工程师们关注IDEA各方面特性的J…

Hadoop大数据分析技术(伪分布式搭建)

一.安装JDK和配置SSH免密登录 (1)准备软件 (2)解压压缩包 tar -zxvf jdk-8u221-linux-x64.tar.gz (3)在此处我们配置系统环境变量,使用命令: vim /etc/profile (4&#x…

Python入门教程(高级版)

Python用了好几年了,但似乎一直没 “系统入门” 过(o(╯□╰)o)。今年(2023年)趁着五一假期,我做了一次相对完整的 “入门” ——本文是这次学习历程的详细记录。 目录 1 Python基础1.1 Python1.1.1 认识Py…

Oracle VM VirtualBox安装centos7步骤 for win10

目录 1.安装VirtualBox 2.安装vagrant 3.安装centos7 4.查看网络与百度和物理机连通情况 5.设置IP 1.安装VirtualBox 下载的链接:Downloads – Oracle VM VirtualBox 2.安装vagrant 根据自己的操作系统选择对应的版本。 Install | Vagrant | HashiCorp Developer 我的P…

asp.net+sqlserver旅游网站zjy99A2

1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…

redis使用总结

目录 redis安装与登录redis 持久化RDB(Redis DataBase)AOF(Append Only File)RDB-AOF混合持久纯缓存模式 redis 的 keyredis 的数据类型和常见应用场景StringListHashMapSet集合ZSet有序集合bitmap位图HyperLogLog基数统计GEO 地理空间Stream 流bitfiled redis 事务事务的正常执…

《基于EPNCC的脉搏信号特征识别与分类研究》阅读笔记

目录 一、论文摘要 二、论文十问 三、论文亮点与不足之处 四、与其他研究的比较 五、实际应用与影响 六、个人思考与启示 参考文献 一、论文摘要 为了快速获取脉搏信号的完整表征信息并验证脉搏信号在相关疾病临床诊断中的敏感性和有效性。在本文中,提出了一…

ChatGPT根据销售数据、客户反馈、财务报告,自动生成报告,并根据不同利益方的需要和偏好进行调整?

该场景对应的关键词库(24个): 汇报对象身份(下属、跨部门平级、领导)、销售数据(销售额、销售量、销售渠道)、财务报告(营业收入、净利润、成本费用)、市场分析&#xf…

Vulkan实战之验证层

文章目录 验证层是什么?使用验证层消息回调调试实例的创建和销毁测试配置最终代码 验证层是什么? Vulkan API是围绕最小化驱动程序开销的想法设计的,该目标的表现之一是默认情况下API中的错误检查非常有限。即使是像将枚举设置为不正确的值或…

STM32 系列 DAC的介绍与使用

STM32网上资料多,对自己来说基本的使用也是很简单的, 我的STM32专栏并没有什么系统的基础教学,基本上是某个项目用到了,或者产品使用过程出过问题 才会来记录一下,正好用到了 DAC ,一般产品还用得不多&…