赞
踩
Unity中,有两种GI的技术:烘焙(Baked)和预计算实时(Precomputed Realtime)全局光照,这篇是讲预计算实时部分的
目录
(文章说通过优化将几个小时的预计算时间缩短到了几分钟)
当搭建完场景,准备预计算时,第一件要做的事情就是决定光图的分辨率,它的单位是纹素(texel)/单位(unit),Window>Lighting>Scene设置目录是这个
demo场景的比例是1unit=1m,更方便模拟现实。这个比例会影响光图的细节,如果比例比较大,比如1unit=5m,或者比例小5unit=1m那么场景物件的精度就会发生变化。另一个影响因素是室内和室外,室内的物件更多,更精细,而室外或地形则精度要求没这么高,所以精度高反而浪费了内存和计算开销,下面是一个1unit=1m比例的参考值
预计算需要的实时分辨率值比传统烘焙光图的低上许多,因为预计算只需要捕捉间接光,间接光都是低强度、低频。在预计算时,清晰的阴影都是由实时光提供的
传统烘焙光在1unit=1m的比例下推荐值是30texels/unit,如果用这个值
unity预计算中,一个chart就是物体映射到光图上对应uv大小的一块区域。用于计算的光照信息储存在这个小块里,信息由辐照(irradiance)和方向(directionality)组成
当预计算生成后,每一个纹素的光照信息就被包含在Chart中。所以Chart的大小和数量是决定预计算时间的重要因素
无论物体有多小,Chart默认的最小值是4x4。Unity在图表边缘至少需要4个纹素,以便在找到相应的缝合伙伴之前对其进行唯一标识
注意预计算不需要padding,因为Unity强制在导入Mesh阶段给了Chart一个半纹素的边界。也就是说Chart可以紧挨着彼此并且仍然是双线性插值而没有叠加渗色,从而节省了宝贵的光照贴图空间
如果我们有1个物体,拥有50个Chart,800个纹素。所以数量对于纹素的增加是个致命伤,更多的纹素数量就意味着更多的光照计算和数据压缩、存储,这大大增加了预计算时间开销。所以减少Charts是缩短预计算时间的重要手段(特别是小物件造成很多自动生成的边界,十分浪费)
开始条件是场景中必须有物体标记为Lightmap Static,物件右上角的Static打上勾,里面有很多的类别。GameObjects的层级结构可以更快更好的选中和调整整体类别。demo中的场景部分层次结构
标记整个Environment节点下所有子节点都为Static,然后在Lighting Window窗口开始预计算(快速迭代过程中建议勾上Auto按钮)
减少charts数量可以减少预计算时间,使用探针就是一种可以去掉部分物件的方式。这些物件会使用探针来接收间接光信息。适用的类型是小物件,它们对场景中的间接光作用不大
光照探针是一种用于实时渲染中类似光照计算的快速的技术。它通常用于在游戏世界中照明角色和其他非静态(动态)对象。 探头照明在运行时非常高效,并且可以快速预计算
探针的原理是对空间中某点的入射光进行采样,并使用球谐(Sphere harmonics)函数对此信息进行编码。它的系数存储占用很少,并且可以在游戏中快速的解码用于shader中的近似表面光照的计算
使用限制
选择使用探针的物体
最适合物体的特征是小,凸,demo中Environment/Props节点及其子节点都是一些小、作为装饰物的物体,并且数量很大,对场景中的间接光作用不大。它们在光图中作uv展开十分的浪费边界,所以全部取消Static选项,使用探针来处理
这么做以后,等预计算结束会发现场景中没有进行预计算的非静态物体跟场景中的其他物体有很大的区别,因为我们还没放上探针,这时候他们表面只有环境光(Ambient Probe)。用户不可见,但是会采样Lighting Window中设置的环境光源
探针的放置
非静态物体接收光基于与附近探针的距离。探针直接相互连接组成四面体,物体从哪一个探针读取光照信息决定于它落在哪个四面体中。为了形成四面体,探针放置时需要注意位置,要包围住物体
虽然探针在运行时相对低耗和快速,但出于性能优化的考虑,还是有值得注意的地方的。密集网格排布虽然快速,但是很多的探测器采样出来的差异不是很大,很浪费。更好的办法是在光线明显变化的区域更大密度的放置探针,比如从光到阴影的过渡区域,或者可能存在由光反射形成的强烈色差的区域
步骤1
创建一个垂直排列的原因是我们可以采样从地面弹射的间接光照,在头部高度附近以及在空中的光照。当我们在场景周围复制这些探针来创建包围体的时候,我们想确保任何位置的物体都会落在四面体中,探针之间有品红色的线可以看到
步骤2
合适的区域就是比如阴影区域,或者有明显地表材质变化的区域附近。为了保证增加探针而造成的消耗是有价值的,我们要确保它在采样一些有明显光线变化的区域。我们需要保证包含进项目的每一个项都能有收益
步骤3
demo中有两组探针组,一组用于人口密度大的村庄区域,另一个用于村外的稀疏区域。离开第一组区域后依旧会被第二组区域包围,稀疏区域不需要跟村内相同的密度,垂直方向只需要两个即可
拆分探针组更有利于定位探针,可以启用或者禁用单个组,用于清晰的调整。这些组在运行时自动合并到一块儿,并会删除重叠的探针
结束之后再次Lighting Build,现在场景中Props节点下在场景下看起来更加和谐了。在场景中不要看见探针,只要不选中探针组就行了。这就是摆放探针来获得间接光,并且节约了很多的光图Charts和计算、内存的消耗。
最后附上文章链接:
https://learn.unity.com/tutorial/precomputed-realtime-gi-global-illumination#5c7f8528edbc2a002053b557learn.unity.com(其实翻译了这么多里面具体怎么算的却一点没看!啊啊啊啊啊啊啊)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。