https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg

在Unity 5中,光照得到了很大的改进。现在,创建高度逼真的游戏已成为可能。但是,出于对性能的考虑,许多Unity开发的游戏仍然依赖烘焙光照。但有时候又必须使用实时和烘焙光照,而这在之前是Unity的短板。如今在5.6中,Unity已解决了这个用户呼声很高的需求。

光照功能对新手来说可能比较神秘,因为编辑器默认不会显示光照UI。而且我们的调查显示,几乎所有新手对于光照贴图都没有概念。因此,我们重构UI使它更显眼,不过,有些概念性的知识还是必须要了解的。在本系列的第一部分中,首先简要介绍实时光照与烘焙光照(光照贴图)之间的区别。之后再对混合光照进行讲解。如果你已熟悉这些概念,可以直接跳过。

预计算实时GI和烘焙GI光照

首先,Unity中新的光照模式没有为预计算实时GI带来任何新的内容,而是为用户提供了可以在场景中同时使用实时与烘焙光照的新方法。实时光照很容易理解,对灯光的任何调整会即时更新场景中的所有光照。唯一的问题是这么做产生的性能消耗。每次主动调整灯光,都会对性能造成很大影响。因此,Unity同时引入光照贴图的概念。可以烘焙光照,并将所有光照数据以光照贴图的形式保存在项目中。这样做代价很低,因为本质上它仅仅是一个纹理。

烘焙光照与实时光照的一个主要区别是:烘焙光照都是静态的,你无法移动光照贴图静态对象,否则就会出现问题。将游戏对象设置为光照贴图静态也很简单。只需在检视窗口中将它们标记为静态(或只是光照贴图静态)。这样可确保Unity会为该对象烘焙光照贴图。如果你希望对象保持动态,就无需这么做,它们默认就是动态的。

预计算GI – 日夜循环

有关这方面概念的详细介绍已超出本文范围,而且Unity官网上已有一个完备的系列教程,由David Llwelyn和光照团队亲自操刀制作,介绍了Unity中使用实时GI光照的优化技巧。

除此之外,我们最近还更新了AssetStore中的Courtyard示例,使之与Unity 5.5兼容。你可以查看下该项目,了解如何在项目中使用实时光照。

直接光照与间接光照

许多新手容易忽略的另一个重要概念是,直接光照与间接光照之间的区别。与实时光照类似,直接光的概念也很容易理解。即从一个光源发射的光子射线直接影响了一个物体。这是你能直接观察到的。

相对难理解的是间接照明这个概念。基本上,间接照明由反弹光照来实现。除了直接光照,我们还可以有反弹的光照。可见光子在一个场景中基于数学公式做简单的反弹。下图展示了间接照明的原理。

通过Light组件的“Bounce Intensity”参数,可以设置一个灯光的间接光贡献度。举例来说,如果你希望禁用间接光贡献度,可以把这个参数设置为0。

所以,预计算实时GI很有趣,在Unity中发挥的很完美。但是,它代价很高,而使用Unity的开发者多数以低端设备(移动平台)为目标,为了应对性能问题(VR),需要有优化的场景设置。然后就会选择对所有静态对象进行光照烘焙(例如,环境),对所有动态对象(例如,角色)使用实时光照。所以,这将带我们进入下一个问题。

混合光照

混合光照这个术语本身已经相当的不辨自明了。混合光照让用户可以混合使用实时和烘焙光照。前面我们提到的用例是多数游戏使用的一个典型场景。例如在《Last
of Us》中,环境场景是固定的,因此其对应的所有东西都储存在光照贴图中,而所有移动对象则使用的是实时光照。

可以首先烘焙所有环境,然后对角色们使用实时光照。但这样会引致一个严重问题:所有的已烘焙对象也会接收动态光,而这意味着它们将会被双重曝光,使这些对象过于明亮。当然,也可以对这些烘焙对象进行实时光遮蔽,但这很容易造成亮度值不符。下面的图像就是此问题的一个例子。应用了相同材质的相同几何体,但其中之一是动态的,另一个是静态的:

这样可能还可以接受,但在有些情况下这可能就相当辣眼睛了:

此时就该混合模式登场了。理想情况下,混合模式会为你料理好一切,照亮相同平衡范围内的动、静态对象(从而保留了视觉逼真度与一致性)。

在Unity 5.5中,你可以在检视面板中将Light Type设置为Mixed,启用混合光照。

现在可以安全地对动态和静态对象使用混合光照了。等等……为什么当使用混合聚光灯或点光源的时候,动态对象没有投射任何阴影?

原来期望聚光灯能同时影响动态与静态的几何体。是我错了而这是默认的行为吗?是我遗漏了什么东西还是这是一个Bug?

很多开发者会好奇为何混合聚光灯不会投射任何阴影

导致该问题的原因是,混合光照仅当只有一个定向光时才能正常工作。等等,你说什么?

Subtractive模式

这就是在Unity中引入新光照模式的主要原因,基本上就是为了解决这个问题。在光照窗口中你有四种光照模式可以选择。它们是Baked Indirect, Distance Shadowmask, Shadowmask以及Subtractive。仅有三项新的光照模式加入。其中Subtractive是老的混合模式,与其他模式相比它的性能消耗要小,这在你开发诸如移动应用时,仍然有些用处。

让我们用Unity的技术术语来重新描述下这个模式的工作原理:选择‘Mixed’烘焙模式,标记为静态的游戏对象会把来自混合灯光的信息保存为光照贴图。但是,与标记为‘Baked’的灯光不同,混合灯光还会为场景中的非静态(动态)游戏对象提供直接光(实时)。我们提到过仅有单个定向光时它才能正常工作吧?没错,因为混合点光源和聚光灯不会在对象上投射任何阴影。

此外,Subtractive模式里还有另一个特定的功能。与其他模式不同,直接光也是烘焙的,因此在Subtractive光照模式中,没有镜面反射。

探针遮蔽

在Subtractive模式中,另一个动态对象需要使用的重要组件是光照探针组。没有光照探针,动态对象无法对用于静态对象的光照进行采样,而且更重要的是,它们无法使用遮蔽数据。因此,为了能接收阴影,动态对象需要将来自光照探针的光照进行混合。在下面的图象中,你能看到一个动态对象是如何利用光照探针做遮蔽的:

为了实现更精确的遮蔽,可以为场景中重要的对象(例如,主要角色)指定光照探针代理体(LPPV)。但是注意,这会带来额外的性能消耗。

色彩空间与Subtractive模式中的渲染路径

关于Subtractive模式还有最后一点需要提下。这个模式是为前向渲染路径和Gamma颜色空间设计与保留。不适用于延迟渲染路径和Linear颜色空间。这是因为Subtractive模式与其他模式相比,性能消耗要相对较小,主要用于低端设备,例如移动平台。有关渲染路径和色彩空间的有关详细信息,可以在官方手册中查看。最后,我们介绍了Subtractive模式在Unity
5.6中的实际应用。

在下一篇中,我们将讨论新的光照模式(Distance Shadowmask, Shadowmask 和Baked Indirect),以及如何在项目中使用它们。

Unity 5.6中的混合光照(上)的更多相关文章

  1. Unity 5.6中的混合光照(下)

    https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...

  2. 浅析Unity中的Enlighten与混合光照

    0x00 前言 在Unity的5.6版本之前的5.x中,主要使用了Geomerics公司的Enlighten[1]来提供实时全局照明以及烘焙全局照明,在5.6之后Unity引入了新的Lightmapp ...

  3. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  4. 第五章 Unity中的基础光照(2)

    目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发 ...

  5. 在Unity中高效工作(上)

    原地址:http://www.unity蛮牛.com/thread-19974-1-1.html 编的话:感谢做编程的IT朋友,帮我翻译文章,我又稍稍做了些修改.给点儿掌声哩.欢迎大家多多评论呦. 我 ...

  6. 聊聊Unity2018的LWRP和混合光照

    0x00 前言 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了** Scripting.Assetsbundle ...

  7. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

  8. (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...

  9. [转] Draw Call未被批处理?告诉你在Unity 5.6中如何查找原因 [复制链接]

    Unity在5.6之前的版本中并未提供很直接的方式来查找Draw Call未被批处理的原因,但Unity 5.6在Frame Debugger中新增了一项功能,帮助开发者查找相关信息.今天这篇文章就为 ...

随机推荐

  1. react-navigation遇到的坑

    关于goBack返回指定页面 react-navigation是提供了goBack()到指定页面的方法的,那就是在goBack()中添加一个参数,但当你使用goBack('Main')的时候,你会发现 ...

  2. (转)nginx-rtmp-module和ffmpeg搭建实时HLS切片

    1.rtmp服务器 nginx+pcre+zlib+openssl+nginx-rtmp-module ./configure \ --prefix=/usr/local/nginx \ --sbin ...

  3. Scipy.sparse矩阵的存储,读取和转化为稠密矩阵

    import numpy as np import scipy.sparse as sp m = sp.lil_matrix((7329,7329)) np.save(path,m) #用numpy的 ...

  4. Java for LeetCode 108 Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 解题 ...

  5. NISP:一级取证

    NISP:一级取证 BrupSuite工具的使用 设置浏览器代理 flag{C0ngratulati0n} flag{LMvBi8w9$m1TrgK4} flag{T4mmL9GhpaKWunPE} ...

  6. BZOJ 1492 货币兑换 Cash CDQ分治

    这题n2算法就是一个维护上凸包的过程. 也可以用CDQ分治做. 我的CDQ分治做法和网上的不太一样,用左边的点建立一个凸包,右边的点在上面二分. 好处是思路清晰,避免了凸包的插入删除,坏处是多了一个l ...

  7. 在高通平台Android环境下编译内核模块【转】

    本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei ...

  8. ManualResetEvent使用

    1.定义 MSDN定义: 通知一个或多个正在等待的线程已发生事件.此类不能被继承. 详细说明: ManualResetEvent 允许线程通过发信号互相通信.通常,此通信涉及一个线程在其他线程进行之前 ...

  9. haproxy 官方文档查看

    http://cbonte.github.io/haproxy-dconv/1.5/configuration.html#reqrep http://www.ttlsa.com/linux/hapro ...

  10. c语言字符串 数字转换函数大全

    最近学数据结构老是做实验 常用到字符串和数字的转换 想找却发现网上的资料太散 所以搜集整理一下 方便以后再用 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转 ...