2019-04-11 09:59:08 leeby100 阅读数 1169

一些网友在用Unity3d烘焙室内场景时,常常出现墙角“漏光”,很多人试图通过加大灯光阴影的分辨率和设置内墙为双面物体,似乎都无济于事,就这一问题,笔者通过如下图示给出解决方法,供大家参考:
在这里插入图片描述
在这里插入图片描述
以上是个人的一些经验,如有不妥,请大家指正,更多有关Unity3d 5.6、2017、2018、2019版的烘焙,可去网上找些相应的教程,也可参看本人编制的Unity3d布光与场景烘焙及后处理实战

消除Unity3d墙角漏光及更多烘焙缺陷,请参阅我的文章-Unity3d场景快速烘焙【2019】,如有兴趣,请关注本文!
在这里插入图片描述

2019-08-16 12:46:41 leeby100 阅读数 990

下面以一个小客厅为例,和童鞋们一起讨论Unity3d的室内烘焙,一方面是对前面知识的综合应用,另一方面满足以下做装修童鞋的学习需求。

话不多说,开工!这个例子的3D场景如下图所示:
在这里插入图片描述
拆分好的UV如下图所示
在这里插入图片描述
导入Unity3d后的场景情况如下图所示:
在这里插入图片描述
这个场景比较简单,一个窗户、一个沙发、一个茶几、一个书柜、两个落地灯、一个墙面装饰、还有一个挂画、茶几上一个杯子、两盆绿植,这里我们设想将场景烘焙成阴天的白昼气氛,也就是没有直射太阳光,室外光线完全是大气折射的太阳光,所以我们确定这个场景的主光源为从窗户投射的光线,可以使用Unity3d的面光源置于窗户附近,但我们这里选用Unity3d的材质灯光,也就是将某个模型的材质勾选“自发光”,这个模型就成了灯光了。选中窗户玻璃,勾选其材质中的自发光(Emission),将自发光强度设为1.5,发光颜色设为白色,如下图所示:在这里插入图片描述
因为这个场景不可能有运动物体,光线也不会变化,所以选用静态灯光下的静态物体的方式烘焙场景,所以将自发光材质的Global Illumination(全局光照)设为Baked,勾选光照面板中的“Baked Global Illumination”,然后烘焙,得到如下图所示的结果(烘焙用时5分钟):
在这里插入图片描述
在这里插入图片描述
从上图可见,场景太暗,但明暗关系已经有了,如果反复烘焙,太浪费时间,我们设想通过photoshop来调色,需要说明的是,这里所说的调色不是简单的图片调色,而是对整个场景调色。如下图所示,将一个特殊的色带文件与相机关联起来,对这个文件调整,就会调整相机中的场景,这样我们将这个文件(png图片)用ps打开,然后截取一张相机视图的图片,按照图片调色的方法,对截取的图片调色,然后将图片调整的参数应用于那个色带文件,保存色带文件后,Unity3d的场景就回作相应的调整,关系就是这样。
在这里插入图片描述
下面我们就来调色,首先抓取相机视图的图片,然后在ps中打开,同时也将刚所说的色带文件也用ps打开,如下图:
在这里插入图片描述
首先调一下截取的相机视图图片的亮度和对比度,亮度88,对比度-50,如下图所示:
在这里插入图片描述
然后对色带也做这样的调整,如下图所示:
在这里插入图片描述
然后保存色带文件,Unity的相机视图就会作相应的调整,调整后如下图所示:
在这里插入图片描述
原理大家都明白了吧,这样就是以用ps灵活地为Unity3d场景调色了,只要Unity3d烘焙出场景的明暗关系,剩下的就交给ps了,这样可以节省大量反复测试烘焙的时间。按照上面的方法对相机视图进行色相饱和度、色彩平衡等调整后,相机视图的场景如下:
在这里插入图片描述
在这里插入图片描述
好了,场景调色就到这里。

木地板应该有反射,所以我们需要引用Unity3d的“Reflection Probe(反射探测器)”,在层级面板空白处右键单击,在弹出的菜单中选择light下的“Reflection Probe”命令,场景中会出现一个四面体线框,如下图所示,在反射探测器的检视面板中按下节点命令,四面体的四个面上会出现黄色下把手,拖动可以调节探测器的大小,按下探测器检视面板中的移动按钮,可以调整探测器的位置,用这两个命令配合,将探测器调至和房间一样大,或者说让探测器完全包络这个房间,烘焙的时候,会将整个房间烘焙成一个比较小的全景图贴在探测器上,供具有反射的材质映射来实现真实反射。这里说明一下,当场景比较复杂时,可以用多个反射探测器拼合来满足场景的外形,场景中不需要反射的地方,就不需要布置反射探测器了。
在这里插入图片描述
反射探测器布置好后,需要重新烘焙,反射数据是通过烘焙获得的。如果熟悉了,烘焙之前就布置好反射探测器,免得重复烘焙。烘焙之后结果如下
在这里插入图片描述
上图反射效果不太好,下面我们为木地板加一个实时反射,效果如下:
在这里插入图片描述
在这里插入图片描述

现在我们将玻璃的材质灯光关闭,用平行光来模拟阳光,重新烘焙(用时6分钟左右)并开启反射后效果如下:
在这里插入图片描述
在这个例子中引入了ps的后处理调色,以避免为达到好的色调和颜色及明暗对比反复烘焙浪费很多时间,好了,这个例子就讨论到这,

更多Vray级Unity3d的烘焙,请阅读我的博客文章Unity3d场景快速烘焙【2019】

2015-01-20 09:59:22 book_longssl 阅读数 2172
如何使用烘焙贴图第二种方法

1,在这里,我有2个对象(室内,沙发) 。我强调了纹理所以你可以看到他们清楚。有8个纹理(室内和沙发1 7 ) 。


2,拆开包装UVW集(通道1 )打救。


3,拆开包装UVW集(通道2 )从第一个通道的负载。


4,在烘焙材料的选择,选择“输出到源“和“保持焗材料“。此选项将自动更新,无需使用您的再次外壳材料原始材料。由于holmeren的更新^ ^ 。点击( 0)渲染到纹理窗口。


- >结果



5,重复该过程的沙发上。 (说明:在此页面顶部)。


点击M的,看看你的新出炉的材料(检查它! “自我照明槽“现在包含照明地图纹理。更多精彩请点击【狗刨学习网】

6,导出到的FBX


7,打开统一和进口的资产。因为在我们使用3dsmax的模型8纹理,使团结将他们分配到8个材料。像往常一样的光影纹理不会导出与他们相处。
进口手动从您的3dsmax的文件夹(MyDocuments/3dsmax/sceneassets/images光影纹理)寻找你的LightingMap型号名称,背面。
在这种情况下我有2 ( sofaLightingMap.TGA和wallLightingMap.TGA ) 。


8,与我们所有的纹理组合,我们现在准备把自己变成“ Lightmapped “物质默认材料。我选择Lighmapped / VertexLit 。正确的光影纹理分配到正确的材料模型。



    Yes !放在正确的光影。
9,时间“翻耕“我们的内部纹理。


    是的!完成!

    如果我想用随开垦耕种非纹理质地?嗯,我碰到一些错误,以及在出口,但我找到了一种方法才能办到。

1,我的uvw使用和以前一样。只是这一次不同质地的墙壁。
( 1墙壁,地板为1和1的沙发) 。


    墙上的纹理



2,出口如常。
3,导入统一和改变其扩散材料Lightmapped材料。
4,运用光影质感,地板和瓷砖只有质地。


5,完成!

--------------------------------------------------- 
-------------------------------------------------- -
结论和问题...
第一种方法:
我们将在我们的网状材料,因为我们在一个模型指定一个不同的纹理很多。较小的纹理清晰,但与形象,给耕种制度感谢。新增30 kb.Mat
第二种方法:
我们使用较少的材料和质地少,但更大的决议(我的自定义纹理墙上有512x512分辨率)。新增11 kb的。垫
我不知道这两个之间的性能差异。因此,如果任何人都可以分享您的意见,我将十分感激。
使灯光映射完成了我的小教程。
2018-01-18 15:25:44 u013690172 阅读数 4743

Unity引擎即将迈入2017的新时代,并且不久前我们也发布了Unity 2017的首个测试版Unity 2017.1.0 Beta。在本教程中,我们将通过实际案例来说明如何在一个简单的游戏场景中使用Unity 2017的Shadowmask功能。场景设置包括室内和室外两部分。室内部分的阴影将使用Shadowmask模式,而室外的阴影将使用Distance Shadowmask。场景非常简单,以便能更好的解释这些功能的实现原理。

在介绍细节前,让我们先看下大致内容:

⊙场景设置与光照参数

通过API切换Shadowmask和Distance Shadowmask

修改光照贴图参数避免带状阴影瑕疵(针对软阴影)

快速了解其他可加强效果的后处理特效

我们的教程将从调整光照参数开始。考虑到要进行数次迭代,我们要先将默认参数调低。否则即便是默认的设置也会对性能造成显著影响。完成后我们可以将参数重新调整为高质量。

【Unity 2017中的混合光照教程】

场景设置与光照参数

首先,我们要先禁用Realtime Global Illumination,因为本教程不涉及此功能。但是,我们要使用Baked Global Illumination,并保持光照模式为Shadowmask。其次,将Indirect Resolution调低至0.2,Lightmap Resolution调整为15。最后,将Lightmap Parameters从Default-Medium改为Default-Low Resolution。这些设置会产生一些阴影瑕疵以及低分辨率效果,但这会使我们场景的光照迭代速度更快。否则,哪怕是极小的参数调整也会使我们处于漫长的等待之中。

【Unity 2017中的混合光照教程】

根据计算机的设置,下一步设置是可选的。默认情况下,Lighting窗口中的Auto模式是启用的,这通常很适合小场景。但对于大型场景,每个小改变都会触发光照生成,使编辑器变慢,有时还会造成无法对场景进行编辑。因此,我通常会禁用它,在评估过上次的结果并完成更改后再生成光照。你可以任选其中一种方式。

至于色彩空间,使用Linear,以获得更精确的色彩效果,渲染路径选择延迟。这些设置都用于高端游戏,实际上,如果想使用反射探针和SSR获得正确的反射效果,就必须使用延迟路径。目前,前向模式不支持SSR,该模式下反射探针的显示也有问题。随着Unity弃用Directional Specular,目前推荐的解决方案就是使用反射探针和SSR。所以,在我们的场景设置中,反射将扮演一个非常重要的角色,因此,我们将切换到延迟渲染路径。

接下来,检查下场景中所有的对象,一个可以操作的角色,室外环境,室内环境,碰撞器,遮阳板以及光照相关对象。

为每个类型的对象创建一个新的图层,使用碰撞器为关卡设定可玩区域,使用遮阳板操纵阴影(它们对主摄像机不可见)。使用遮阳板是因为我们用于构建室内环境的几何体背面缺失,无法作为遮光物,挡住光线。而且因为它们不会在屏幕上进行渲染,我们可以将这些对象的质量设为低质量。相信我,这个技术也在真实生产环境中使用(呃,可能没有我们这里做的那么简单)。

【Unity 2017中的混合光照教程】

对于光照,我们使用四种不同的对象类型:一个定向光,环境光,反射探针以及光照探针。为了简单,我们仅使用一个定向光,因为美术光照不在本文探讨范围之内,我们仅专注讨论Shadowmask功能的技术细节。正确设置光照探针和反射探针很繁琐,而这通常又是新手容易出问题的地方。因此我们将分析布置光照探针以及反射探针的正确方式。在进行设置时,最新的Light Explorer面板将会为我们提供很大帮助。

还有一个重要的部分是环境光照。我们只是简单的将天空盒着色器指定为环境光的一部分(可以在项目中找到这个资源)。如果仔细研究这个天空盒材质,你会发现它是一个sIBL HDR。HDR图像对室外场景特别有用,它可以提供原本需要花很大成本重建的详细的BRDF信息。

最后,有来自Unity Standard Assets中的一个角色,一个附加有自定义后期处理与动画组件的自定义摄像机脚本。

通过API切换Shadowmask和Distance Shadowmask

上一节说过,当角色走出去后,我们会将Light Mode从Shadowmask切换为Distance Shadowmask,反之亦然。这样,我们可以在室内环境保持烘焙软阴影,并在室外时切换到轮廓清晰的实时阴影。而且你可能想不到,做法也相当简单。只需将下面的代码复制到一个触发器即可:

【Unity 2017中的混合光照教程】

很简单吧!

修改光照贴图参数避免带状阴影瑕疵

Unity中的默认设置与一个高质量项目的要求非常相近。正如本文开头所说的那样,这会使大场景的渲染时间显著增加,因此我们需要对参数进行一些调整。

为了进行迭代,我们调低了参数,但如果连默认设置都没法正常工作该怎么办?以Shadowmask为例,软阴影就是一个典型的问题。下面来看看这样一个案例:

【Unity 2017中的混合光照教程】

该如何解决这个问题?增加光照贴图分辨率,或者光照贴图大小?

除了光照窗口,我们还可以针对特定对象进行参数调整。还记得我们在开始时将Lightmap Parameters调整为Default-LowResolution吗?你实际上可以以实例为单位指定自定义光照贴图参数,覆盖场景设置

首先禁用了Lighting窗口中的“Compress Lightmaps”,然后为金属板创建了一个自定义光照贴图参数,并将Blur Radius设为8, Direct Light Quality设为128。现在看看结果如何:

【Unity 2017中的混合光照教程】

好多了,对吗?而且,我调整了Enlighten中关于集群优化的Precomputed Realtime GI值,然后将自定义光照贴图参数指定给了场景中不同的对象。下面是金属板的相关设置。但这些参数的细节不在本文介绍的范围之内。你可以查看Unity3D网站上有关Precomputed Realtime GI的教程以了解更多信息。

【Unity 2017中的混合光照教程】

快速了解其他可加强效果的后处理特效

除了Screen Space Reflections之外,我们还使用TAA(Temporal Anti-aliasing)Ambient Occlusion、Color Grading、Chromatic Aberration、Grain 和Vignette。对于当前的场景,这些效果的默认值就足够好了(有可能Ambient Occlusion的半径值可以再缩小一些)。不过,我们将会对TAA和颜色分级再做些微调。

我使用色彩分级(Color Grading)来营造一种魔法时刻的意境,Temperature稍高,其他的参数相应进行微调,使之与阴影产生对比。

【Unity 2017中的混合光照教程】

而TAA是目前业内最快的抗锯齿解决方案。但有一个缺点:TAA与透明度相容性不佳,而且有时与环境遮蔽一起混合时会出现问题。除此之外,它仍是一个相当不错的效果,应用之后可以带来显著的变化。

要使用它,必须首先禁用Quality Settings中的MSAA。转到Edit > Project Settings > Quality,在Rendering部分找到Anti Aliasing。将其改为“Disabled”。然后,还必须在摄像机上禁用它。选择层级窗口中的主摄像机,在探查器的Camera组件中找到“Allow MSAA”选项,取消勾选。

现在可以启用TAA了。选择后期处理探查器,启用Anti-aliasing。切换到Temporal Anti-aliasing。你可以增加spread的值,不惜代价避免抖动,但给你个专业建议,绝对不要将spread设置为1.0。我们的测试表明,spread最佳的区间为0.9到0.97,具体根据场景设置而定。

转载自unity官方平台感谢大家的关注 如有侵权请联系我们进行删除

2017-02-15 17:26:40 mryu9958 阅读数 1854

初步介绍

新年假期结束了,想不想掌握一个新技能迎接全新的一年呢?不妨来阅读一下Unity预计算实时GI系列文章。本文是该系列的第一篇。

    
在Unity中有两种区别很大的技术被用于计算全局光照GI或光源反射,它们就是烘焙全局光照(Baked GI)和预计算实时全局光照(Precomputed Realtime GI)。本文主要介绍预计算实时全局光照(PRGI),学习如何使用Unity全局光照计算系统 — Enlighten系统来优化一个场景,让预计算只需要几分钟而非几小时。

为什么要使用PRGI

当启用PRGI时,光照预计算指的是计算静态几何对象周围光的反射,并存成数据给Runtime执行使用的过程。这个过程减少了原本必须在Runtime执行时的光照计算量,可以让项目在保持FPS稳定的同时,还允许使用实时反射光照。

当启用烘焙GI(Baked GI)时,预计算的过程会计算并产生传统的光照贴图(Lightmap),这些贴图会以资源(Assets)的形式存在项目中,但是无法在Runtime执行时被更改。而PRGI则是使用不同的方法生成光照贴图, PRGI计算的结果会被存成光照数据文件(Lighting Data Asset),这些数据可以在Runtime执行时实时产生和更新一组低分辨率的光照图。

不过,除非场景已经为PRGI计算优化过,否则完成这些计算所需的时间可能会很长。下面我们一起来看一下如何针对Enlighten系统来做场景优化,从而把预计算时间从几小时缩小到几分钟。我们将会涵盖以下几个要点:

如何定义适合当前场景的光照分辨率
了解什么是光照图(Charts),以及它是如何影响计算时间的
如何开始预计算
使用光照探针来降低光照方案的复杂度
改进由Unity PRGI自动拆解出的UV
了解何谓集群(Clusters),以及如何用它来产生GI照明
了解如何使用光照贴图参数来微调单个游戏对象上的光照

一旦我们学习并了解了这些技术,我们就可以充分利用PRGI的优点:快速的光照迭代,以及在打光过程中和在游戏过程中对实时反射光照进行快速试验的能力

PRGI优化演示
在下图所示的场景里,用没有优化过的默认设置,在我们的测试机上预计算光照大约花了7.5个小时。显然这是无法接受的!


无优化场景(上图) :预计算7.5小时,有优化场景(下图):预计算2.25分钟

使用本教学所介绍的技术进行大约30分钟的场景准备后,这个场景的预计算仅仅花了2.25分钟就得到了产品等级的效果。这个技术的好处是显而易见的,因为我们可以在游戏过程中快速迭代场景照明而不需要重新计算GI和改变GI照明。

学习前准备
您可以在Asset Store资源商店上下载官方光照优化素材包,跟着我们进一步学习。本教学所用的是Scenes/Article目录下的范例场景:
LightingTutorialOptimal:展示PRGI如何设定能用最短的时间呈现出产品等级的结果。
LightingTutorialNonOptimal:呈现了我们在项目中常看到的问题,要么造成无法烘焙,要么花费无法接受的时间烘焙,这是一个很好的错误示范。
LightingTutorialStart:我们在教学过程中用到的场景,我们会按照步骤一步一步将它变成一个产品等级的结果。


Unity预计算实时GI (二)实时分辨率


我们已经在《Unity预计算实时GI (一)介绍》中聊到Unity预计算实时GI的必要性和学习准备,并且了解到实现这个过程需要考虑的问题。本文我们对如何定义一个适合场景的光照分辨率进行了相关介绍,一起来学习一下吧!


如何调整实时分辨率?

当使用PRGI来计算场景照明时,首先要做出的决定之一是确定场景的实时分辨率(Realtime Resolution),因为它决定每个世界单位所使用即时光照的贴图像素数量。Realtime Resolution设定可以在Lighting窗口中找到并调整,方法如下:

Unity的Lighting窗口:主要显示整个场景会用到的光照设定。

  • 通过Window > Lighting菜单,开启Lighting窗口,并选择Scene标签页。
  • 确保Precomputed Realtime GI选项打上勾,在它下面找到Realtime Resolution属性,即可设置它的值。

但这个分辨率应该如何设置呢?

选择适当的分辨率
在设定场景时,首先要要了解你的项目使用的单位比例,可能在你的项目里一个单位等于现实世界的1米、一英尺或一公分。Unity没有默认真实世界的单位,所以要由开发者自行决定。

在这个范例里我们采用1 unit(单位) = 1 meter(米)。因为这和Unity的物理概念不谋而合。举例来说Unity的重力预设就是以每秒多少单位来计算的,因此设定1单位 = 1米对于一个真实世界的场景来说是恰当的。

Realtime Resolution的值通常可以由游戏世界的规模来制定。例如,你的场景是一个拥有丰富光照变化的室内环境。在这种情况下,高一点的值比如2 - 3,可以捕捉到更详细或"高频"的光照。

如果你的场景是一个规模较大的户外环境,可能覆盖了几百甚至上千单位(平方米)的表面,而这些表面并不会剧烈地改变反射光的颜色。在这样的情况下,把适合计算复杂室内场景的设定用在有大量相同特征的室外环境是很浪费的。我们会浪费宝贵的CPU时间和内存去更新那些对整体外观贡献不大的光照贴图。为了教学目的,我们会提高PRGI计算期间必须考虑的光照贴图的像素数量,这会对预计算的时间造成很大的影响。针对室外环境,可以为场景中尺寸较大的游戏对象设置0.5 - 1的texel,针对地形可以设置0.1- 0.5的texel。

Unity PRGI所需要的Realtime Resolution值比传统光照贴图密度要小好几个等级,这是因为我们只从这些光照图里获取间接光数据,且这些数据通常分辨率都很低。所以使用PRGI时,清晰的阴影通常都是通过实时运算而非高分辨率的光照图来提供的。

在这里使用传统光照惯用的值,例如:30 texels,可能会导致预计算失败或无法计算。室内场景比较适合的值是2 - 3,室外场景则是0.5 - 1。这是我们在使用1单位 = 1米的前提下,如果单位大小不同这些值就需要调整。

具体可以参考以下的场景与Realtime Resolution值对照表(1单位代表1米):

室内:2-3 像素/单位
户外:0.5-1 像素/单位
地形:0.1-0.5 像素/单位

当设定场景实时分辨率时,Unity会指定给场景内的静态对象。新建的带有Mesh Renderer且标记为静态光照(Lightmap Static)的对象,会使用这个值一直到它被其他设置修改。

除了帮场景加上分辨率设定外,我们还能针对每个对象调整光照贴图的分辨率,在需要高分辨率来提供更高真实感的情况下,我们可以选择性的提高这个值。通常是将场景里最多的对象分辨率设为默认值,然后手动调高需要更多照明细节对象的值。

练习一下
如果你想跟着做,打开教学素材包里的LightingTutorialStart场景。

在范例场景里,我们有一个户外环境,具有中等大小的地形与相当一致的色调。所以我们设定Realtime Resolution为0.5像素/单位就足以处理从场景其他对象来的光照反射。然而,场景里也有些贴图细腻的木屋。由于场景里有比地形对象还多的房子,我们应该把默认的分辨率设定为适合房子的数值。然后我们可以单独修改地形对象的分辨率,这样可以降低场景准备的工作量。考虑到这点,我们用1作为我们的默认分辨率,操作步骤如下:
  • 开启Lighting窗口(Window > Lighting) 然后选择Scene页签
  • 设定Realtime Resolution值为1

由于我们的世界单位设定为1单位 = 1米,这表示由PRGI所产生的光照图将会是1x1米的大小,或许你看起来很低,那是因为我们只抓取间接光照。还会从场景里的直接光源计算清晰的阴影和反光。



Unity预计算实时GI (三)了解光照图


我们曾经为大家介绍了预计算实时GI的必要性,以及在实现预计算实时GI时,如何定义一个适合场景的光照分辨率。本文我们一起来看看光照图,了解一下它是如何影响计算时间的。

光照图是什么?
在Unity PRGI里,一个光照图(Chart)是表示一个光照贴图(Lightmap)的区域,用来映射场景对象的光照贴图UV。你可以认为它是能影响对象的一张瓦片图。一张光照图由两部分组成:辐照度(光照)和方向性(主要光线方向编码)。

当产生PRGI数据时,图表里的每个texel都会被计算光照。换句话说,场景里面有大量的光照图可能会增加PRGI耗时的主要原因之一,因此理解光照图的运作原理以及如何管理它们来优化光照计算的时间是很重要的。

光照图的尺寸

最小的4x4 texel的UV光照图

如上图所示,这是最小的4x4单位的UV光照图,为了防止贴图过滤造成的渗色,UV贴图始终被光照图包住并空出一半texel的宽度。

在预设的情况下,每张光照图最少要有4x4 texel的大小,所以说不管世界中的物体或对应的UV有多大,一张图表至少需要16个texel。因此如果有一个1x1米的对象并带有一个图表,间接分辨率是1,那这个对象就会需要16个texel来表现。最后Unity会将这些图表缝合在一起,作为模型边缘的光线取样参考。Unity需要每张图表的边缘至少有4个texel,方便在缝合不同光照图时有对照的依据。

要注意的是使用实时GI时不需要自己去填这些UV的边,因为Unity在处理网格汇入的流程时,会自动将光照UV图向内挤出一个边框的空间。这样就能让相邻的图表无需做渗色处理,也能保持双线性插值(Bilinearly Interpolated),能节省宝贵的光照贴图空间。

光照图如何影响计算时间?

要弄清楚这个问题,我们可以试想一下: 1x1对象如果带有50张光照图,Unity会为它创建800个texel。尽管这个数字看上去不是很大,但说明了当图表的量一大就会快速拉高texel的量。越多的贴图像素意味着更为繁重的光照运算要处理,更多的光照数据要计算、压缩和储存,这些因素都会提高场景的复杂度,并导致运行时长时间的计算和较低的效率。

不合理的光照图规划一般是导致计算耗时过长或无法完成的主因。也因为如此,我们许多减少计算时间的方向大多都是思考如何降低场景内光照图的数量。


Unity预计算实时GI (四)开始预计算


我们在先前已经为大家介绍了预计算实时GI有关的内容,从初步的介绍,到实时分辨率计算,再到光照图的认识,已经为预计算的实现打下了基础,下面就一起看看如何开始预计算吧!

计算全局光照需要启动PRGI流程,在开始预计算之前,我们必须确保场景里面至少必须有一个对象被标为静态(Lightmap Static)。 

可以通过层级视图(Hierarchy)的功能,您可以轻松管理并选择哪些对象要用于计算光照。 管理这些对象有非常多的方法,但这不是今天教学讨论的目的。但这里需要,重点指出的就是:好的对象管理流程可以大大提升对象利用率。 

在本文示例中,我们会将所有对象放在一个名为"Environment"的父对象下方进行管理,这个群组会放所有可见的,并且带有MeshRenderer组件,用来组成场景环境的静态对象。 在它下方还会有一些放有各种场景对象的子群组。 

对场景中的对象进行分类有助于频繁重复选择对象的操作 

最好的做法是先从Lighting设置中确定初步大方向,然后边做边调整细节设置:
        •        选择场景里的"Environment"对象
        •        勾选检视面板(Inspector)右上方的Static
        •        如果系统跳出对话框,提示是否要将该对象下的子对象也一起标记为静态对象,请选择”Yes, change children"。 这样就能确保所有在Environment里的对象都变为静态对象并纳入光照计算。

现在场景内有了一些静态对象之后,我们就可以开始计算GI了,步骤如下:
        •        打开Lighting界面(Window > Lighting)然后选择Scene标签页
        •        确认勾选界面最下方的Auto(最下方Build按钮旁,如果打勾Build按钮会灰掉)
        •        然后系统就会开始计算光照。 画面的右下角会出现一个蓝色的进度条,显示目前的工作(几分之几)以及需要计算的工作量。
        •        如果未勾选Auto,也可以手动点击Build进行计算,系统会先询问是否要存档后开始计算光照。 本次教学建议直接勾选Auto即可。

 
进度条显示目前进度,并提示等待计算的工作量 

Unity预计算实时GI (五)光照探测


预计算实时全局光照(PRGI)是优化场景的一种手段,我们曾经详细介绍过它的必要性定义适合当前场景的光照分辨率,以及影响计算时间的光照图的概念。本文我们聊聊如何使用光照探针(Probe Lighting)来降低光照方案的复杂度,这种方法非常适用于场景中的小物体,一起来一探究竟吧!

何谓光照探测
光照探测是一种快速计算实时渲染应用中的光照技术,通常会用于处理游戏世界的人物角色或是动态物体的光照,它的优点在于运行时有不错的处理性能而且预计算也相当快速。

光照探测的原理是通过放置在3D空间里的探针来接收光照信息,然后用类似球谐函数(spherical harmonics)的数学方法将信息编码在一个球体上。这些系数占用空间很小,在游戏运行时能快速”解包",以便Shader可以存取并计算表面光照,在Unity中这个功能叫做光照探针(Light Probes)。它是一种让对象接收场景间接照明的好方法,虽然被光照探针指定的对象无法计算场景的光照反射,但通常影响不大。

使用光照探测是有些限制的,其中一个限制:在不提高探针数量的前提下很难在球形范围上表现出高频或斑驳的光照,并且其精度和消耗成本成正比。也就是说,在考虑性能的前提下,必须限制使用较低阶的球谐函数。

实际上,一个3D坐标只能用一个球体来记录光照信息,所以光照探测不适合用于有大量光照投射在大物体表面的情况,所以不得不提到另外一个限制:当用球谐函数在一个球体上进行编码时,通常不擅于处理拥有特大平面的物体或是带有很深的凹洞的物体。如果想要将光照探测技术用于大型物体,可以参考Unity手册中Unity提供的另一个光照探测代理体(Light Probe Proxy Volumes, LPPV)技术做进一步了解。

尽管有这些限制,光照探测还是很适用于和符合条件的小物体一起搭配使用,以较低的成本消耗发挥出卓越效果。 我们后续将深入探讨如何设置及摆放光照探针(Light Probes),现在只了解适当使用光照探测功能可以降低光照贴图的数量。

为对象设置光照探针
尽管我们一般将环境里的对象都设置为静态后再做光照计算,但其实整个环境里有很多对象都适合用光照探测技术进行处理。减少场景里光照图的数量是加快预计算时间的关键,将对象的静态标签清除之后,它们不再受到PRGI计算的影响的同时,光照贴图的数量也会降低。 


 
使用光照探测的最佳物体就是像这种凸起的小碎石

从Unity编辑器的层级视图(Hierarchy)看Environment下的子对象,会发现Props下的对象几乎都是点缀场景用的小物体,例如:石头、水桶或木板。 这些物体非常多,而且很多小物体的UV可能不太好展开。获取不失真的光照贴图UV可能会产生很多UV Shell,一旦UV Shell过多就会需要额外的光照图,更多的光照图代表将产生更多的贴图像素。

假设这些物体很小,不太可能对场景的间接照明产生什么影响,而且它们表面能显示的光照细节也有限,所以这样的物体非常适合用光照探测技术来计算,不但可以加速预计算时间,同时要存到内存中的光照图和Shader解码的数量也变少了,在运行时的性能也会因此提升。具体操作如下:
  • 从层级视图(Hierarchy)选择Props对象
  • 在检视面板(Inspector)中取消勾选最右上角的Static
  • 在弹出的提示框中,选择"Yes, change children"


这时等待计算完成,就能看到场景最终的光照计算结果,你会发现被探测光影响的非静态物体(non-Static objects)和周围的物体有些格格不入,和场景的光照也不匹配。 这是因为我们还未设置光照探针(Light Probes),导致这些物体被纳入环境探针(Ambient Probe)的光照计算。 环境探针本质上是一个在场景里无法看到的隐形探测器,只对Lighting视图中的Ambient Source所指定的来源进行采样。

 
在没有光照探针影响下,非静态物体的位置可能看起来有些异样

为了让非静态物体的摆放位置更为合理,我们需要花点时间来将光照探针放置在场景的周围,方便对世界中的间接照明进行采样。

放置光照探针
非静态物体会通过附近的光照探针接收光照信息,光照探针会基于探针之间的空间划分四面体,然后检查物体属于哪个四面体来决定物体"读取"哪个探针。 为了正确地产生这些四面体,探针之间的位置关系在3D空间里就必须要放得有体积感。

 
画面中那些白色的球体就是光照探针在场景里的样子 

光照探测技术执行的消耗非常低,预计算也非常快。然而考虑到性能,也有些需要注意的地方:尽管设置简单,但密度太高的探针可能会浪费资源,因为太接近的探针在特定光照条件下的采样结果没什么差异。 最好的做法是在光照变化明显的区域放置密度较高的探针,例如由亮转暗的区域,或是强光反射的区域。设置光照探针的具体方法如下:
  • 从GameObject菜单新建一个光照探针群组(GameObject > Light > Light Probe Group)
  • 开始放置光照探针,从层级视图(Hierarchy)选择刚才新建的光照探针群组对象
  • 在检视面板(Inspector)中找到Light Probe Group组件,选择Edit Light Probes开始编辑
  • 可以从场景直接点选那些探针,留下角落的一个光照探针,其他可以全部删除
  • 将剩下的一个光照探针移到地形上方,然后按住Ctrl + D( Mac是按Cmd + D)键复制
  • 用移动工具(按W键)将复制的二号光照探针沿着Y轴往上约2米(2 meters)
  • 再复制一次光照探针,并将新光照探针的Y轴上移更高,约5米

 
Light Probe Group组件的Edit Light Probes按钮位置


这样的垂直光照探针分布为的是可以同时采样到地面、头部高度和天空的间接光照(Indirect Light)。 当我们开始将这组光照探针大量复制到场景其它位置来产生光照探测区域时,要确保可玩区域都会被探针所产生的四面体覆盖到,可以看到光照探针之间会以品红色的线串联表示这些区域。

 
光照探针的位置和它们之间所产生的四角面
  • 全选刚刚建立好的三个光照探针(按住Shift并点选每个光照探针或是拖拽进行框选)
  • 复制整个光照探针组并移到场景其它需要采样的地方


需要采样的地方不外乎是有阴影的区域或是地形材质色调会变化的地方。请记住,我们的目的是对场景里的间接或反射光照进行采样。 为了让每个光照探针的性能都用在刀刃上,尽量确保它们对一些光照变化明显的地方进行采样,如果光照探针放在一致性很高的光照区域,那光照探针反映给动态物体的结果不会太明显。 如同游戏优化的各方面技巧一样,尽量确保每个光照探针都有其存在的必要。

继续重复上述操作,在照明区域大密度地放置光照探针直到产生一个像笼子般的区域,涵盖所有的可玩区域。 布置这些光照探针时,请记得每一次都要检查最底部的光照探针要和地面保持一定的距离。

在我们的示例LightingTutorialOptimal场景中带有两组光照探针,VillageLightProbeGroup比较密集、用于村庄区域,ExtentsLightProbeGroup比较稀疏、用于村庄外无法到达的区域。 第二个光照探针组涵盖了整个游戏世界以防止任何非静态物体离开可玩区域,这一组不需要像村庄那组探针那么密集,垂直轴方向只要两个探针就够了。

将光照探针拆成两组,方便定义光照探针的用途,每个光照探针组都可以独立开启或关闭,方便适应场景的各种需求,这些光照探针在运行时会自动组合并执行重叠检查(de-duplication pass)以删除所有重叠的探针。

想看到光照探针的照明结果,必须等到预计算完成,如果勾选Lighting视图(Window > Lighting)下的Auto就会自动进行计算,如果未勾选,则需要按下旁边的Build按钮来手动计算。

一旦计算完成后,你会发现场景里面的非静态物体会开始接收光照探针的信息,看起来和场景光源会更匹配。如果要查看照明状态下的光照探针,可以从层级视图(Hierarchy)选择光照探针组。

现在场景里有了光照探针组,我们就能为场景中的小物体取得间接光照信息,而不需要从PRGI的流程中为这些物体生成额外的光照图。 

总结
本文我们通过对光照探针的定义、设置方法和放置技巧进行阐述,希望能为您带来处理光照的新思路。想要了解预计算的操作步骤,以及更多详情,请关注Unity官方平台。

 

默认标题--设计创建于创客贴 (2).png(192.75 KB, 下载次数: 0)

下载附件

5 天前 上传



转载请注明来源:Unity官方中文社区 (forum.china.unity3d.com)。请勿私自更改任何版权说明信息。



没有更多推荐了,返回首页