第二十一章 光源

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

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”的三种模式。他们的区别就在于是否将直接光照,间接光照和阴影烘焙到光照贴图中,烘焙的内容越多,实时计算量就越少,这个应该不难理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题总结 | Java面试题总结9- RabbitMQ模块(持续更新)

RabbitMQ 文章目录 RabbitMQ为什么使用Rabbitmq而不是其他的消息队列为什么使用消息队列解耦异步削峰 消息队列有什么优缺点MQ的高可用保障单机模式 普通集群模式(无高可用性)镜像集群模式(高可用性) MQ如何保证不重复消费、幂等性…

浏览器安全之XSS跨站脚本

基本概念 跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。 攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javas…

Vue.js 框架能力的官方认证

这两天Vue官方推出了Vue.js 认证计划。 即框架能力官方认证,即 Vue.js 框架能力证书。该认证由 Vue School 与 Vue.js 团队合作提供支持。官网:Vue.js - Official Certification Program 官方介绍此次的试题集和代码挑战由 Vue.js 核心团队审核&#xff…

react之按钮鉴权

使用HOC来完成 HOC:高阶组件,是React中复用组件逻辑的一种高级技巧。HOC自身不是React API的一部分,他是一种基于React的组合特性而形成的设计模式。 作用:用于复用组件的业务逻辑 VUE mixinReact Hoc 用户数据渲染带操作按钮渲…

Shell快速入门笔记

文章目录 Shell 快速入门笔记1、Shell概述2、Shell初体验4、注释5、变量6、数据类型6.1 字符串6.2 数组 7、参数传递8、运算符9、常用命令9.1 echo命令9.2 printf命令9.3 test命令 10、流程控制10.1 条件判断10.2 循环 11、函数12、输入/输出重定向12.0 前置知识12.1 输出重定向…

IPsec中IKE与ISAKMP过程分析(主模式-消息3)

IPsec中IKE与ISAKMP过程分析(主模式-消息1)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息2)_搞搞搞高傲的博客-CSDN博客 阶段目标过程消息IKE第一阶段建立一个ISAKMP SA实现通信双发的身份鉴别和密钥交换&…

一文详细介绍查看和启用nginx日志(access.log和error.log),nginx错误日志的安全级别,自定义访问日志中的格式

文章目录 1. 文章引言2. Nginx访问日志(access.log)2.1 简述访问日志2.2 启用Nginx访问日志2.3 自定义访问日志中的格式 3. Nginx错误日志(error.log)3.1 简述错误日志3.2 启用错误日志3.3 Nginx错误日志的安全级别 4. 文末总结 1. 文章引言 我们在实际工作中,经常使…

数字设计小思 - D触发器与死缠烂打的亚稳态

前言 本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中,D触发器是最常用的器件,也可以说是时序逻辑的核心,本文根据个人的思考历程结合相关书籍内容和网上文章,聊一聊D…

函数-函数递归及练习

目录 1、什么是递归? 2、递归的两个必要条件 3、递归的练习 3.1 接受一个整型值(无符号),按照顺序打印它的每一位 3.2 编写函数不允许创建临时变量,求字符串的长度 3.3 求第n个斐波那契数 3.4 字符串逆序&…

Go语言-数据结构与算法

go语言之专业数据结构与算法 20.4 稀疏 sparsearray 数组 20.4.1 先看一个实际的需求  编写的五子棋程序中,有存盘退出和续上盘的功能 稀疏数组的处理方法是 : 1) 记录数组一共有几行几列,有多少个不同的值 2) 思想:把具有不同值…

【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )

文章目录 一、获取大图和 Seed 随机种子二、通过 seed 种子生成类似图像 一、获取大图和 Seed 随机种子 注意 : 一定是使用 U 按钮 , 在生成的大图的基础上 , 添加 信封 表情 , 才能获取该大图的 Seed 种子编码 ; 在上一篇博客生成图像的基础上 , 点击 U3 获取第三张图的大图 ;…

STL常用梳理——VECTOR常用接口及其迭代器实现

Vector篇 Vector介绍Vector实现1、定义默认构造函数使用实现 2、迭代器Iterator迭代器使用 3、空间增长问题使用实现 迭代器迭代器介绍迭代器实现 Vector介绍 vector是STL中容器之一,特性如下: vector是表示可变大小数组的序列容器。就像数组一样&#…

Python基础合集 练习21 (错误与异常处理语句)

‘’‘try: block1 except[ExceptionName]: block2 ‘’’ block1:执行代码,表示可能会出现错误的代码块 ExceptionName: 表示要捕获的异常名称,为可选参数.如果不指定异常名称,则表示捕获所有异常 block2:表示发生异常时执行的代码块 while True: try: num int(input(请输…

设计模式——工厂模式

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、工厂模式介绍 2、披萨项目需求 3、传统方式 4、非静态简单工厂模式 5、静态简单工厂模式 6、工厂方法模式 7、抽象工厂模…

spass modeler

课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…

目标检测模型量化---用POT工具实现YOLOv5模型INT8量化

POT工具是什么 POT工具,全称:Post-training Optimization Tool,即训练后优化工具,主要功能是将YOLOv5 OpenVINO™ FP32 模型进行 INT8 量化,实现模型文件压缩,从而进一步提高模型推理性能。 不同于 Quantiz…

MYSQL-数据库管理(上)

一、数据库概述 一、数据库基本概念 1.1 数据 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。…

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址:http://arxiv.org/abs/2112.01527 项目地址:https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成: 主干特征提取器&#xff…

【Java笔试强训 29】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥求正数数…

UNIX环境高级编程——进程关系

9.1 引言 本章详细说明进程组以及会话的概念,还将介绍登录shell(登录时所调用的)和所有从登录shell启动的进程之间的关系。 9.2 终端登录 9.3 网络登录 9.4 进程组 每个进程除了有一进程ID之外,还属于一个进程组,进…