【USparkle专栏】假如你深怀绝技,爱“搞点研讨”,乐于分享也博采众长,咱们等候你的加入,让才智的火花磕碰交错,让知识的传递生生不息!


一、大局光照的门户

在实时烘托中,大局光照(Global Illumination,以下简称GI)始终是一个难题,GI可以拆分红高光和漫反射,高光反射暂时不在本篇的评论规模,因此咱们会首要评论各向同性的漫反射的GI。纵观近些年的分享,大方向无非是从离线烘焙到实时更新,而在这个大方向中又有两个门户:一致门户和拆分门户。

一致化门户的宗旨在于:来上一发,一切光照相关的核算通通搞定,比较经典的便是光子映射和途径追寻,以及它们的离线烘焙阉割版——光照贴图,光照贴图献身了实时性以及空间性,让动态的物体和粒子、云雾等体积烘托无法收益,以交换更高的功用。不可拆分流程最大的好处便是物理正确性,基本上是来一发就处理一切问题,中心不需求美术人员进行任何额定处理,仅经过外部调参就能到达很好的作用;而可拆分门户就显得费事许多,所谓可拆分,“拆分”的是什么呢?从统计学意义上讲,咱们可以将光照的散布区分为高中低频。比如阳光打到地面是亮黄色的,而天空是蓝色的,那么整个场景“打眼一看”便是亮处暖色而暗处冷色,剩余的高频则表现为部分的AO、纹路等。运用多种技术计划处理问题,这便是拆分流的战略。

拆分流可以认为是对工程和硬件功用的退让。因为没有离线烘托那样宽松的时刻约束,所以不得不接受一些作用上的献身。本文首要评论的根据探针的GI计划便是一个面向低频的工程解。

二、陈旧的GI:Unity Light Probe

Light Probe是最陈旧也是最耳熟能详的Probe计划。其答应用户在场景中自定义摆放,并经过四面体插值的办法取周围4个Probe的成果的加权均匀,而Probe的成果是直接静态烘焙的(理论上彻底支撑动态烘焙,仅仅Unity没有做罢了),这是一个传统且可行的集静态与动态于一身的廉价GI计划。

Probe-Based Global Illumination

这种办法的弊端也很明显,生成四面体运算量较高,对实时不友爱,以及查找四面体对GPU运算不友爱。第一点很明显,究竟假如Probe要随意摆放,那么就需求进行空间搜索去生成四面体,这个作业在运行时基本不可能做到。一同,因为四面体的散布并不是均匀的,所以希望GPU以O(1)的杂乱度且无分支的查找,也几乎并不可能,所以在Unity中是依靠CPU把查找成果核算出并传递的,这样做使得本就功用缺乏的CPU雪上加霜,而且需求随机查找的体积烘托类的GI就没有办法得到处理,这是另一个硬伤。

关于怎么处理Light Probe的问题,在本文的后半部分再打开评论,咱们先着重评论一下Light Probe运用的球谐函数的色彩贮存办法。

三、Spherical Harmonic Lighting

球谐光照(Spherical Harmonic Lighting)以下简称SH,这并不是个新鲜词汇,其完成计划在知乎上也有很多的讲解,咱们这儿着实没必要再打开评论。

但就算不知道它的原理,只需求知道有了这么一个“给它向量就能返回均匀且低频的值”的好东西以后,咱们可以做很多好玩的工作了。想要核算一个点的正确的Diffuse GI,基本上需求搜集这个点的Albedo、Normal、Position和Emission等信息,核算出点的光照成果后,以Probe到这个点的向量作为半球的法线进行蒙特卡洛半球积分,和传统途径追寻的累计办法彻底一样,只不过在运算上咱们只有一个采样点的成果,所以就需求用每个射线的PDF作为权重,与采样成果相乘累计到球谐上,这种办法是否是无偏的?当然不是,但是SH本身就偏的很离谱,所以咱们并不是很在乎,只需成果大方向对了就行了。把这个采样进程在整个球面上均匀地散布并执行多次,最终得到的成果便是球谐的成果了。

而现在的状况是,纯烘焙的Light Probe功用太惨痛,而纯实时的又需求依靠实时光线追寻,功用开支十分贵重且对硬件要求高,那么这个进程是否可以进行进一步细分以取得一个折中的成果呢?答案显然是可以的。做过途径追寻烘托器的朋友都知道,一般在采样率不高的状况下会有相当多的噪点,噪点的呈现来自采样缺乏导致的求积分的成果与正确成果有偏差,而SH也是会存在这样的问题的。当场景杂乱时,噪点往往很多,而当场景十分简略时,可能噪点就很少以至于底子没有噪点(比如在纯白色天光下烘托一个球),究竟积分的误差当然是由需求被积分的函数的杂乱程度来决定,天下乌鸦一般黑,所以这个结论对SH相同适用。那么再回到SH上,咱们就需求认识到,哪些信息是高频的,哪些又是低频的,是否可以提早烘焙高频信息,并把低频信息放到运行时,以完成一个半实时半静态的GI呢?这便是Precomputed Radiance Transfer。

四、Precomputed Radiance Transfer

Precomputed Radiance Transfer,以下简称PRT,这种办法的战略便是在离线环境从每个Probe发射很多的射线,以预核算整个场景的Albedo Emission等色彩信息,一同再发出少数射线,将磕碰到的采样点的位置和法线贮存下来,在运行时核算这些采样点的受光状况(天光、太阳光、部分光等),将这些光照信息乘到提早烘焙好的Albedo,并叠加Emission,最终得到一个看起来像那么回事的Plausible的成果。这种办法便是拆分了色彩部分的核算和灯火可见度的核算,在静态场景下支撑动态的灯火烘托,是一种半实时的计划。

这套计划有相当大的优化潜力。The Division在此之上又做了新的优化,经过搜集一块区域内的采样点,并取这些采样点的均匀值,核算出一个经过均匀后的点作为一个共享的采样点:

Probe-Based Global Illumination

Probe-Based Global Illumination

Probe-Based Global Illumination

这种直接用两层混合的操作,在以献身正确性为成本的一同,极大削减了需求贮存和核算的采样点,关于功用十分有限的设备可以说是一个不错的战略。

五、Dynamic Diffuse Global Illumination

假如要求把PRT的静态部分也一同改成动态,完成彻底动态的GI是否可以呢?NVIDIA引荐的DDGI办法便是运用硬件的求交加快,把上方PRT的烘焙进程简化到了实时,使得工程维护难度大幅度降低的一同,也支撑了动态的场景和材质,而非仅仅支撑光照,这是十分有诱惑力的。仅仅,现在的RTX功率和功用并不完善,乃至DirectX RayTracing这种软件接口和硬件之间还经常发生矛盾,本人在开发VEngine的RayTracing模块时就遇到了RTX显卡有自己的主意并拒绝了API的调用的状况,而且现在仍未修复,只能暂时绕过。这些缺点只能等候硬件厂商渐渐迭代并合作微软等软件厂家制定一套跨硬件的通用接口,而对咱们这种个人或小团体开发者来说,显然希望官方供给一个SDK直接接入项目,这也是不可行的计划,应该也是DDGI这类依靠硬件前进的功用现在最大的约束,一句话概括便是:未来可期。

Probe-Based Global Illumination

DDGI

六、Volume Based Probe

已然说到了“支撑动态场景”,那么一套对GPU友爱的,支撑视锥体积内恣意坐标采样的(粒子、体积烘托等),不需求美术人员手动摆放的Probe体系便是必需的了。作为可微函数,球谐是可以直接被作为像一般的色彩一样扔到3D贴图中并运用QuadLinear插值采样的,那么在每个别素的中心放置一个采样点,便是一个十分简略粗犷的办法。这种办法还是有两个问题,第一个便是漏光会十分严重。比如咱们现在假设一片空间内放置了4x4x4个采样点:

Probe-Based Global Illumination

很不幸的是,有一面墙正好掩盖在了Probe上,或许穿插在了两个格子之间:

Probe-Based Global Illumination

发生严重漏光

彩虹老师的指导下,咱们学习到可以运用SDF处理这个问题,运用SDF求导核算某点的向“外”的向量,也便是法线,可以将Probe“推”出去,使其远离几何体,关于SDF求法线的相关文档:
RTXTime:Signed Distance Field(根底篇)

Probe-Based Global Illumination

经过偏移后的Probe

因为采样时也是会发生插值发生的漏光,所以咱们需求在采样时也来一发SDF采样,把采样点也挤出去,这就能处理大部分的漏光问题了。

一同,一切的Probe有必要按规则摆放,所以即便在周围光照环境改变并不大或结构并不杂乱的状况下也有必要运用固定的核算密度,但这样在敞开的场景中将会有巨大的糟蹋。一个较为可行的计划是把Bilateral Filter的思想用上,对那些不是特别重要的Probe降低采样率的一同使其搜集混合周围的采样点,削减采样的不均匀。

七、GI Framework in Vector Engine

VEngine供给了一套强兼容性的GI计划,旨在使一套计划可以在不同项目和不同需求下作业。咱们在几乎不需求修正源码的状况下,可以切换多种GI计划(Cascade Shadow Map,AO off,SSR off,Volumetric-Light on):

Probe-Based Global Illumination

PRT in VEngine

Probe-Based Global Illumination

DDGI in VEngine(DirectX RayTracing)

在采样上,咱们完成了一套3D版Virtual Texture,经过将体素向外扩展一圈,完成敞开场景的无缝采样;因为GI的运算开支往往较大,几乎不可能在一帧内核算完成,因此咱们可以先开一张暂时的图,再核算完毕后的数帧,将成果输送回Virtual 3D Texture,因为游戏中的光照一般不会有太大的改变,所以这种战略是彻底可行的。

在SH Probe的生成方面,咱们也是采用了敞开式的规划,答应直接从硬盘或其他部分加载Albedo、Emission等Geometry信息,也答应运用实时的DirectX RayTracing封装核算GI,可以做到实时离线一体化作业。一同,RayTracing部分结合了引擎自带的Bindless Resource规划,在Mesh、Texture等资源时只需求一个ID,极大优化了求交功率,处理了现在商业引擎因为架构约束处理不了的问题。

在示例图中,故意采用了很薄的长方体模拟墙体(0.1m),彻底没有表现出漏光,这归功于SDF在采样和生成时的运用。

八、Future

咱们这套计划仍然有很大的前进空间,首先,实时核算GI关于现在绝大多数中低端核算机来说仍然是天方夜谭,一同假如是一个有动态场景的网游,可能就要求每个玩家都要在自己的核算机上重新核算一遍整个GI,那么将这个对推迟要求并不苛刻的深重作业放到服务端便是一个十分可行的计划,VEngine在规划上也考虑到了这一点,把数据流的加载笼统出来,合作网络库就可以完成联机下载。

一同,上方也提到了,将SH均匀铺盖到体素空间是十分糟蹋的,而SH在相当多的状况下改变并不大,那么用神经网络作为数据存储的前言,把SH信息训练到网络中,是一个可行度高的计划,仅仅现在VEngine现在还没有供给关于NN方面的支撑,这些作业和研讨会在日后渐渐打开。


这是侑虎科技第1493篇文章,感谢作者MaxwellGeng供稿。欢迎转发分享,未经作者授权请勿转载。假如您有任何独特的见地或许发现也欢迎联络咱们,一同讨论。(QQ群:465082844)

作者主页:www.zhihu.com/people/maxw…

再次感谢MaxwellGeng的分享,假如您有任何独特的见地或许发现也欢迎联络咱们,一同讨论。(QQ群:465082844)