糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)

unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)

时间:2022-09-22 16:43:59

相关推荐

unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)

* 介绍

Unity中,有两种GI的技术:烘焙(Baked)和预计算实时(Precomputed Realtime)全局光照,这篇是讲预计算实时部分的

目录

如何决定光图分辨率光图中的Charts是如何影响预计算时间的如何开始预计算使用光照探针(Light Probes)减小预计算时间预计算生成自动展UV的优化簇(Clusters)是什么以及它们如何用于全局照明的照明使用Lightmap Parameters来做物件粒度的光照调整

(文章说通过优化将几个小时的预计算时间缩短到了几分钟)

* 实时分辨率(Realtime Resolution)

当搭建完场景,准备预计算时,第一件要做的事情就是决定光图的分辨率,它的单位是纹素(texel)/单位(unit),Window>Lighting>Scene设置目录是这个

具体设置如图,先在Realtime打上勾,然后修改尺寸

**选择合适的分辨率

demo场景的比例是1unit=1m,更方便模拟现实。这个比例会影响光图的细节,如果比例比较大,比如1unit=5m,或者比例小5unit=1m那么场景物件的精度就会发生变化。另一个影响因素是室内和室外,室内的物件更多,更精细,而室外或地形则精度要求没这么高,所以精度高反而浪费了内存和计算开销,下面是一个1unit=1m比例的参考值

参考值

预计算需要的实时分辨率值比传统烘焙光图的低上许多,因为预计算只需要捕捉间接光,间接光都是低强度、低频。在预计算时,清晰的阴影都是由实时光提供的

传统烘焙光在1unit=1m的比例下推荐值是30texels/unit,如果用这个值

** 理解Charts

unity预计算中,一个chart就是物体映射到光图上对应uv大小的一块区域。用于计算的光照信息储存在这个小块里,信息由辐照(irradiance)和方向(directionality)组成

当预计算生成后,每一个纹素的光照信息就被包含在Chart中。所以Chart的大小和数量是决定预计算时间的重要因素

图示是一个4x4纹素大小的Chart,Lightmap UV强制扩大了半个纹素,以防止颜色渗透(Bleeding)
/Manual/ProgressiveLightmapper-UVOverlap.html​

无论物体有多小,Chart默认的最小值是4x4。Unity在图表边缘至少需要4个纹素,以便在找到相应的缝合伙伴之前对其进行唯一标识

注意预计算不需要padding,因为Unity强制在导入Mesh阶段给了Chart一个半纹素的边界。也就是说Chart可以紧挨着彼此并且仍然是双线性插值而没有叠加渗色,从而节省了宝贵的光照贴图空间

如果我们有1个物体,拥有50个Chart,800个纹素。所以数量对于纹素的增加是个致命伤,更多的纹素数量就意味着更多的光照计算和数据压缩、存储,这大大增加了预计算时间开销。所以减少Charts是缩短预计算时间的重要手段(特别是小物件造成很多自动生成的边界,十分浪费)

* 开始预计算过程

开始条件是场景中必须有物体标记为Lightmap Static,物件右上角的Static打上勾,里面有很多的类别。GameObjects的层级结构可以更快更好的选中和调整整体类别。demo中的场景部分层次结构

可以对相同类型的对象进行分组

标记整个Environment节点下所有子节点都为Static,然后在Lighting Window窗口开始预计算(快速迭代过程中建议勾上Auto按钮)

* 光照探针(Probe Lighting)

减少charts数量可以减少预计算时间,使用探针就是一种可以去掉部分物件的方式。这些物件会使用探针来接收间接光信息。适用的类型是小物件,它们对场景中的间接光作用不大

** 探针是什么

光照探针是一种用于实时渲染中类似光照计算的快速的技术。它通常用于在游戏世界中照明角色和其他非静态(动态)对象。 探头照明在运行时非常高效,并且可以快速预计算

探针的原理是对空间中某点的入射光进行采样,并使用球谐(Sphereharmonics)函数对此信息进行编码。它的系数存储占用很少,并且可以在游戏中快速的解码用于shader中的近似表面光照的计算

使用限制

是很难在不增加阶数的情况下表现出高频或者变化频繁的光照,而增加的代价又太大了,所以我们只会使用低阶的球谐函数由于仅有一个球形表示光照,所以不适合用于大型物体,大型物体上有太多的光照变化球谐编码不适合大型平面物体或具有明显凹度的物体

选择使用探针的物体

最适合物体的特征是小,凸,demo中Environment/Props节点及其子节点都是一些小、作为装饰物的物体,并且数量很大,对场景中的间接光作用不大。它们在光图中作uv展开十分的浪费边界,所以全部取消Static选项,使用探针来处理

这么做以后,等预计算结束会发现场景中没有进行预计算的非静态物体跟场景中的其他物体有很大的区别,因为我们还没放上探针,这时候他们表面只有环境光(Ambient Probe)。用户不可见,但是会采样Lighting Window中设置的环境光源

探针的放置

非静态物体接收光基于与附近探针的距离。探针直接相互连接组成四面体,物体从哪一个探针读取光照信息决定于它落在哪个四面体中。为了形成四面体,探针放置时需要注意位置,要包围住物体

虽然探针在运行时相对低耗和快速,但出于性能优化的考虑,还是有值得注意的地方的。密集网格排布虽然快速,但是很多的探测器采样出来的差异不是很大,很浪费。更好的办法是在光线明显变化的区域更大密度的放置探针,比如从光到阴影的过渡区域,或者可能存在由光反射形成的强烈色差的区域

步骤1

创建Light Probe Group (GameObject > Light > Light Probe Group)选中新创建的Group,点击Edit Light Probes留下一个探针,其他的都删掉,并把它放在Terrian上方,然后ctrl+D复制两份按W移动,一个y坐标增加2,另一个增加5

创建一个垂直排列的原因是我们可以采样从地面弹射的间接光照,在头部高度附近以及在空中的光照。当我们在场景周围复制这些探针来创建包围体的时候,我们想确保任何位置的物体都会落在四面体中,探针之间有品红色的线可以看到

步骤2

选中刚刚创建的三个探针,然后ctrl+D复制,并移动到附近合适的区域

合适的区域就是比如阴影区域,或者有明显地表材质变化的区域附近。为了保证增加探针而造成的消耗是有价值的,我们要确保它在采样一些有明显光线变化的区域。我们需要保证包含进项目的每一个项都能有收益

步骤3

重复步骤2,在变化大的区域以更大密度放置探针,直到创建了一个稀疏的牢笼布局包含了所有的区域在摆放探针时,确认最靠近地面的是否在地面之上

demo中有两组探针组,一组用于人口密度大的村庄区域,另一个用于村外的稀疏区域。离开第一组区域后依旧会被第二组区域包围,稀疏区域不需要跟村内相同的密度,垂直方向只需要两个即可

拆分探针组更有利于定位探针,可以启用或者禁用单个组,用于清晰的调整。这些组在运行时自动合并到一块儿,并会删除重叠的探针

结束之后再次Lighting Build,现在场景中Props节点下在场景下看起来更加和谐了。在场景中不要看见探针,只要不选中探针组就行了。这就是摆放探针来获得间接光,并且节约了很多的光图Charts和计算、内存的消耗。

最后附上文章链接:

/tutorial/precomputed-realtime-gi-global-illumination#5c7f8528edbc2a002053b557​

(其实翻译了这么多里面具体怎么算的却一点没看!啊啊啊啊啊啊啊)

如果觉得《unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。