第二十二章 光照贴图

这篇具有很好参考价值的文章主要介绍了第二十二章 光照贴图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为“光照贴图”的纹理中供以后使用。光照贴图可以包含直接光照和间接光照,以及阴影效果。但是,烘焙到光照贴图中的数据无法在运行时更改,这就是为什么移动静态物体后,阴影不会跟随移动。接下来,我们就来演示如何使用光照贴图,我们新创建一个“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),当场景中不存在反射探针时,场景中带有反射的物体会直接反射天空盒产生的环境信息。当物体处于反射探针范围内时,该物体会反射反射探针范围内的环境信息。它的效果类似于我们日常生活中镜子的效果。这里不介绍了。文章来源地址https://www.toymoban.com/news/detail-433140.html

到了这里,关于第二十二章 光照贴图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第二十二章 开发Productions - ObjectScript Productions - 生成警报

    如果发生警报事件,警报会在生产运行时向适用的用户发送通知。目的是提醒系统管理员或服务技术人员存在问题。可以通过电子邮件、文本寻呼机或其他机制发送警报。所有警报还会将消息写入 IRIS 事件日志,类型为警报。 生产警报机制的工作原理如下: 当为 Productions 创

    2024年02月07日
    浏览(63)
  • UNIX网络编程卷一 学习笔记 第二十二章 高级UDP套接字编程

    TCP是一个字节流协议,又使用滑动窗口,因此没有记录边界或发送者数据发送能力超过接收者接收能力之类的事情,但对于UDP,每个输入操作对应一个UDP数据报(一个记录),因此当收取的数据报大于引用的输入缓冲区时就有问题。 UDP是不可靠协议,但有些应用确实有理由使

    2024年02月12日
    浏览(34)
  • 第二章:25+ Python 数据操作教程(第二十二节如何从 R 调用或运行 python)持续更新

    本文介绍了如何从 R 调用或运行 python。这两种工具都有自己的优点和缺点。使用这两个工具中最好的包和功能并将其组合起来总是一个好主意。在数据科学领域,这些工具在使用方面拥有良好的市场份额。R 主要以数据分析、统计建模和可视化而闻名。而Python在深度学习和自

    2024年02月07日
    浏览(26)
  • 第二十四章 Unity 纹理贴图

    通常情况下,3D网格模型只能展示游戏对象的几何形状,而表面的细节则纹理贴图提供。纹理贴图通过UV坐标“贴附”在模型的表面。当然,这个过程不需要我们在Unity中完成,而是在建模软件中完成的。通常情况下,我们通过3ds max或者maya制作完网格模型后,需要进行一个“

    2024年02月05日
    浏览(19)
  • STP和MTP(第二十二课)

    2、如何实现 1)在MSTP网络种,引入了域的概念,称为MST域 2)每一个MST域中包含一个或多个“生成树”称为“实例” 3)每个“实例生成树”都可以绑定vlan,实现vlan数据流的负载分担/负载均衡 4)默认情况下,所有的vlan都属于“实例树0:即:instance 0” 5)不同的“实例树”、

    2024年02月15日
    浏览(25)
  • 【从零开始学习JAVA | 第二十二篇】BigInteger

    目录  前言:  BigInterger: BigInteger常见的方法: 总结:         本篇我们将介绍BigInteger这个比较实用一点的API,这个API在我们实际写项目中都是很实用的API,因此大家应该对这个API有更加熟练的掌握。 在Java中,整数类型int和long的取值范围是有限的,超出该范围的整数无法

    2024年02月15日
    浏览(30)
  • Linux学习第二十二节-网卡IP设置

    1. 修改网卡IP地址 方式一:通过修改 网卡配置文件 修改 网卡配置文件位置: /etc/sysconfig/network-scripts/网卡名 #ifconfig   表示用于显示和设置网卡的参数 #ip addr   表示用于显示和设置网卡的参数   #systemctl restart network 表示重启网络 #ifup 网卡名 表示启动该网卡设备 #ifdown 网卡

    2024年02月17日
    浏览(29)
  • 【从零开始学习C++ | 第二十二篇】C++新增特性(下)

    目录 前言: 类型推导: constexpr: 初始化列表: 基于范围的for循环: 智能指针之unique ptr Lambda表达式: 总结:         本文我们将继续介绍   C++ 11 新增十大特性的剩余六个,如果没有看过介绍前四个特性的小伙伴的可以点进我C++的专栏就可以看到。 类型推导(

    2024年02月14日
    浏览(24)
  • 【Zookeeper源码走读】第二章 服务器的启动过程

    通过运行zk的启动脚本,找到zk服务器端的入口类。脚本如下: 所以,zk的入口类是 QuorumPeerMain ,以下是该类的 main() 方法的完整代码: 跟踪方法中的 initializeAndRun() ,代码如下: 方法中,继续跟踪 ZooKeeperServerMain.main(args) ,代码如下: 上面的代码就是初始化 ZooKeeperServerMai

    2024年02月03日
    浏览(19)
  • 【Kubernetes】第二十二篇 - k8s 部署 MySQL 服务(secret、deployment、service)

    上一篇,介绍基于 k8s 项目部署流程设计; 本篇,介绍 MySQL 服务的部署; 部署 MySQL 可以为指定 node 添加污点,专门用于 mysql 部署(当前只有一个节点,不考虑); 为了保证mysql容器重启时数据不会丢失:创建 mysql 数据目录,用于存储 mysql 数据,实现 MySQL 数据的持久化;

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包