第二十二章 Unity 光照贴图

news2025/2/28 0:26:07

光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为“光照贴图”的纹理中供以后使用。光照贴图可以包含直接光照和间接光照,以及阴影效果。但是,烘焙到光照贴图中的数据无法在运行时更改,这就是为什么移动静态物体后,阴影不会跟随移动。接下来,我们就来演示如何使用光照贴图,我们新创建一个“LightDemo”的工程。在场景中我们创建了几个游戏对象,这些游戏对象的参数详细介绍如下截图所示:

以上是平面Plane的位置参数,它的材质颜色为(96,96,96,255),颜色为灰色系。

这是立方体Cube的位置参数,它的材质颜色为(185,131,13,255),颜色为橙色系。同时,我们调整主光源的位置和旋转方向,让其从Cueb的X轴右侧45度角照射下来,

 

请注意,光源的Z轴方向是照射的方向。

 

以上是两个球体Sphere的位置参数,他们的材质颜色为(135,73,159,255),颜色为紫色系。

当阳光斜射过来的时候,球体Sphere1处于立方体Cube的阴影之中。为了方便观察,我们还是修改一下相机的位置。首先,我们先调整Scene视图的角度,如下

大家可以看到,Scene视图和Game视图的角度是不一样的。我们保持Main Camera选中状态,然后点击菜单栏选择“GameObject”->“Align Width View”。该操作我们之前讲过,就是将Game视图的视角调整到当前Scene视图的视角。如下

两者保持一致了。接下来,我们Play运行一下,

请注意,我们的主光源“方向光”的模式为“混合”,既是实时光照也是烘焙光照。

光源模式设置确定后,我们需要对游戏对象进行一些设置,尤其是外部导入的3D模型。我们知道同一个模型可以使用多张贴图,但是模型的贴图需要UV坐标的支持,因此我们需要让我们的模型支持光照贴图UV。如何让我们的模型支持光照贴图UV呢?操作也非常简单,在“Project”视图中我们选择模型文件,然后在Inspector检视视图中的“Model”选项卡下面找到“Generate Lightmap UVs”,我们点击勾选这个项目即可,从名字上我们就可以得出,这是生成光照贴图UV坐标的意思。对于我们当前场景中的Cube,我们不需要进行此操作。

接下来,我们还需要将所有的游戏物体设置为静态物体(Static),在每个游戏对象的Inspector检视视图中,游戏对象名称右边的Static勾选框,我们点击勾选上,该游戏对象就成为一个静态物体了。在Unity中,物体是可以区分静态和动态的,如果一个物体是静止的,那么该物体在游戏中永远不会移动、旋转和缩放。注意,我们将地面Plane,立方体Cube和球体Sphere1设置为静态物体,而球体Sphere2保持默认的动态物体。

 

 

 

接下来,我们打开Lighting窗口(Window->rendering->lighting setting)。

首先,我们需要点击“New Lighting Settings”创建一个新的光照设置文件,该文件已经在上一章节中创建了,这里我们直接使用即可。在“Lighting Mode”选项一栏,我们选择“Subtractive”模式,也就是将静态物体的直接光照,间接光照和阴影全部烘焙到光照贴图中。在上述窗口的右下角有一个“Generate Lighting”按钮,就是生成光照贴图。点击开始生成光照贴图,等待一段时间后,就制作完毕了。请注意,烘焙的时间根据场景的复杂度不同而不同,我们的场景1-2分钟就结束了,真实地游戏场景可能需要很长很长的时间,几个小时,甚至几十个小时不等。

在上面截图中,Unity为我们生成了一张直接光照的光照贴图,尺寸为512*512像素,大小为2.7M左右。这个文件就位于Project工程面板的“Scenes/SampleScene”目录下

注意,光照贴图是与场景一一绑定的关系。也就是说,场景不一样,光照贴图是不一样的。因为光照贴图被存储到了以场景名称命名的文件夹下。我们在Scene窗口移动静态Cube后发现,它的阴影并没有跟随移动,说明光照贴图起作用了。如下所示

接下来,我们Play运行当前工程

其实没有任何的改变。接下来,我们在运行状态下(Game窗口)调整他们的位置,来查看光照产生的一些效果。静态物体不能在Game窗口下移动,因此我们只给动态物体球体Sphere2添加脚本,代码如下所示:

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.Translate(Vector3.forward, Space.Self);
        }
    }

我们让Sphere2能够在自身Z轴方向能够移动,运行后效果如下

 

 

 

我们移动动态Sphere2后,发现阴影跟随移动,说明是实时光照其作用。但是,当我们移动Sphere2到Cube的阴影区域的时候,发现明显不对。Sphere2仍然是高亮的效果,它应该与Sphere1一样才对。因为动态物体不会受到光照贴图的影响。

为了让动态物体能够获得光照贴图信息,需要通过在场景中放置采样点将这些信息记录下来,并且在运行时能够让动态物体读取并使用。在Unity中,我们将这些采样点称为“light probe(光照探针)”。Light Probe主要解决了如何在动态物体上使用烘焙的照明信息。光照探针运行时效率非常高并且预计算也很快。接下来,我们就在场景中添加光照探针。

首先,我们菜单栏选择“GameObject”->“Light”->“Light Probe Group”游戏对象。

我们清楚的看到“Light Probe Group”,我们隐藏了其他游戏对象。操作方式就是,选中Light Probe Group”后使用快捷键Shift + H,就会进入Isolation 视图,该视图中只会显示当前选中的游戏对象。退出该视图也非常简单,再次使用快捷键Shift + H或者点击“Exit”退出。默认创建的“Light Probe Group”拥有八个光照探针(小黄球),并且组成一个立方体框架,每一个光照探针位于该立方体的一个顶点上面。我们来查看它的Inspector检视视图,

我们可以点击“Edit Light Probes”按钮来编辑这八个光照探针。你可以选中一个小黄球,移动重新摆放它的位置,也可以Delete键删除它。移动光照探针的操作与我们平时移动游戏对象是一样的。我们还可以选中一个光照探针,按Ctrl + D复制一个新的,然后移动这个新光照探针位置。那么,我们需要将这些光照探针移动到哪里呢?

我们点击“Edit Light Probes”进入编辑状态,然后点击其中一个黄色小球。我们可以选择X/Y/Z三轴来移动黄色小球。那么,我们需要将这些光照探针移动到哪里呢?光照探针是为了采集周围的“光照贴图”里面的光照数据。因此,我们需要将小球放置到Cube的阴影里面,用于获取阴影中的光照信息。这样,当Sphere2移动到阴影中的时候,就会受到阴影中的光照探针的影响。在游戏开发中,我们需要创建大量的光照探针(小黄球),我们该如何摆放他们呢?这里有一个简单的原则,为了提高光照探针的效率,应该在光照变化比较大的地方多放置光照探针,在光照变化不大的地方少放光照探针。比如应该在从明亮到阴影的过渡位置多放光照探针,在反射光较强烈的表面多放置光照探针,在大的平面上少放光照探针。这个道理应该很容易理解,光照探针并不是根据物理区域的大小来放置,而是根据光照信息的复杂程度来放置的。如果在一个很宽阔的区域,只有一个简单的平行光源照射,那么这个区域的光照信息基本是相似的,我们只需要一个或几个光照探针就足够了。总之,尽量让我们的动态物体能够处于我们光照探针的包围之中。一个场景中可以创建多个Light Probe Group游戏对象。目前,我们只需要做一些简单的移动即可,将8个小球放置阴影区域。

最后,我们需要重新烘焙一下。烘焙完成后,我们才能看见光照探头对场景中物体的作用。

烘焙过程中,我们就能看到“Light Probes”的信息了。我们重新Play当前工程,查看效果。

与之前的效果相比,我们的动态Sphere2不再那么明亮了,说明它受到了附近光照探针的影响,这样看起来比较真实一些了。Unity还提供了一个反射探针(Reflection Probe),当场景中不存在反射探针时,场景中带有反射的物体会直接反射天空盒产生的环境信息。当物体处于反射探针范围内时,该物体会反射反射探针范围内的环境信息。它的效果类似于我们日常生活中镜子的效果。这里不介绍了。

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

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

相关文章

Angular开发之——Angular介绍(01)

一 概述 Angular是什么AngularJS和Angular关系Angular特性Angular的发展历史Angular学习建议 二 Angular是什么 Angular(读音[ˈŋɡjələr])是一套用于构建用户界面的javaScript框架。由Google开发和维护,主要被用来开发单页面应用程序类似于Vue.js(MVVM数据驱动…

视觉检测技术在图书生产缺陷控制中的应用

在过去我们一直向大家展示的是视觉检测应用在重工业制造之上,让很多人误以为这种新兴的检测技术更加倾向于重工业,或者说因为成本因素,这项技术对目前的轻工业来说更加的不友好,其实并不是这样的。 轻工业我们之所以很少的提机器…

docker入门和docker应用场景,镜像制作,服务编排,docker私服

一、简介 docker解决了什么问题docker和虚拟机的区别在CentOS7里安装docker 1. docker简介 我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境等等。多种环境去部署同一份代码,由于环境原因往往会出现软件跨环境迁移的问题(也就…

黏包和半包

黏包和半包 黏包: Slf4j public class HelloWorldServer {public static void main(String[] args) {NioEventLoopGroup boss new NioEventLoopGroup();NioEventLoopGroup worker new NioEventLoopGroup();try {ServerBootstrap serverBootstrap new ServerBoo…

open3d教程(二):可视化三维模型,并转换成点云(Python版本)

1、三维模型获取 可以自己用建模软件建立一个模型从free3d免费下载 2、关键函数 open3d.visualization.draw_geometries 参数: geometry_list(List[open3d.geometry.Geometry]):要可视化的几何体列表.window_name(str, optional, defaultOpen3D)&…

Linux环境下编程遇到“fatal error:stdio.h:没有那个文件或目录”错误解决办法

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下linux环境下如何解决一个常见的问题,也就是“fatal error:stdio.h:没有那个文件或目录”错误。 不少初学者在linux环境下用gcc编译C语言时,经常会遇到这个问题。 比如当…

工具推荐二

(点击上方公众号,可快速关注) GUI框架 我是个后端程序员,使用GUI框架的机会很少,主要用来编写个人或工作中的一些小工具上,经验有限,仅供参考。 Tk框架这个框架tcl语言自带,在python…

海报图片生成服务在狐友的落地实践

本文字数:22817字 预计阅读时间:58分钟 项目背景 狐友作为搜狐的一款社交产品,在流量传播上有着旺盛的需求点。而在流量传播所需的众多载体之中,海报图片以其简单的分享形式、可定制的视觉体验、自带二维码识别导流等特点&#xf…

入门与 Follow GPT 的路径分析:LLM 道阻且长,行则将至

动手点关注 干货不迷路 本文只用于技术交流,仅代表作者个人观点。 作为 CEO,Sam 将 OpenAI 的内部氛围组织的很好,有位 OpenAI 的前员工告诉拾象团队,当 2018 年 GPT-2 的论文被驳回时,Sam 在团队周会上将拒信的内容朗…

ONES X 高测股份|用数字化,重构新材料企业的研发管理体系

近日,ONES 签约高硬材料切割的领军企业——高测股份,助力高测股份建立有效、规范的研发测试管理体系,实现项目管理、测试管理、知识库管理、工时管理、组织效能管理等端到端的研发管理,提升测试效率和产品交付质量,并进…

用Python+OpenCV+Yolov5+PyTorch开发的车牌识别软件(包含训练数据)

目录 演示视频 软件使用说明 软件设计思路 演示视频 这是一个可以实时识别车牌的软件,支持图片和视频识别,以下是软件的演示视频。 车牌识别软件 点击查看代码购买地址 软件使用说明 1. 下载源码后,首先安装依赖库。项目所用到的依赖库已…

bash shell 基础命令

章节目录: 一、浏览文件系统1.1 Linux 文件系统1.2 遍历目录 二、列出文件和目录三、处理文件3.1 创建文件3.2 复制文件3.3 命令行补全3.4 链接文件3.5 文件重命名3.6 删除文件 四、管理目录4.1 创建目录4.2 删除目录 五、查看文件内容5.1 查看文件类型5.2 查看整个…

【Linux】Linux编辑神器vim的使用

目录 一、Vim的基本概念 二、Vim的基本操作 1、进入vim 2、正常模式切换至插入模式 3、插入模式切换至正常模式 4、正常模式切换至底行模式 5、退出Vim编辑器 三、Vim正常模式命令集 1、移动光标 2、删除文字 3、复制 4、替换 5、撤销 四、Vim底行模式命令集 1、列出行号 2、光…

【Linux】进程信号捕捉

前言 在【Linux】进程信号及信号产生中,我们提到,进程接收到信号,并不是立刻处理,而是在合适的时候才执行相应的动作,那合适的时候是什么时候呢,进程捕捉信号的过程究竟是怎么样的呢?本篇博客就…

Python入门(七)if语句(二)

if语句(二) 1.if语句1.1 简单的if语句1.2 if-else语句1.3 if-elif-else结构1.4 使用多个elif代码块1.5 使用多个elif代码块 2.使用if语句处理列表2.1 检查特殊元素2.2 确定列表不是空的2.3 使用多个列表 作者:xiou 1.if语句 前面我们理解了…

React Native技术探究:开发高质量的跨平台移动应用的秘诀

作为一个跨平台移动应用开发框架,React Native在开发过程中能够有效提高开发效率、降低开发成本、缩短上线时间,因此备受开发者的欢迎。然而,如何使用React Native开发出高质量的跨平台移动应用呢?本文将探究这个问题,…

(一)PUN 2基本介绍

一、开始 (一)基本简介 1.简介 Photon Unity Networking (PUN) 是一个用于多人游戏的 Unity 包。灵活的配对让您的玩家进入可以通过网络同步对象的房间。 RPC、自定义属性或“低级别”光子事件只是其中的一些功能。快速且(可选)可靠的通信是通过专用的…

选卡攻略!一分钟教你选择一款好的流量卡!

很多流量卡看似便宜,但用起来套路不少,所以,挑选一款流量卡并不是只看资费,而且要了解它的各个方面,比如:优惠期、合约期等等,今面,小编就带大家一块了解如何选择一款好的流量卡。 …

默认的HuggingFace模型

介绍 在本文中,我将探讨表征学习中常见的一种做法——使用预训练神经网络的冻结状态作为学习特征提取器。 具体而言,我感兴趣的是研究使用这些提取的神经网络特征训练的简单模型的性能与使用迁移学习初始化的微调神经网络的性能的比较。预期受众主要是数…

一款功能强大的多合一聚合支付Discuz插件,可直接替换DiscuzX 3.5自带的支付接口

源码介绍: Discuz论坛多合一聚合支付接口插件,该插件直接替换了自带的支付接口功能, 增强了支付的扩展性,自带支持支付宝、微信、QQ钱包官方支付, 以及彩虹易支付、我爱支付、虎皮椒等支付通道,并且可以…