简单介绍一下全局光照系统
半年前发过一次的帖子,这次正好4.0原神更新了全局光照选项,在原区再发一下
原帖名:简单介绍一下游戏画面实现技术(2)_光照系统(上)
联动隔壁简要对比帖:
4.0版本加入的“全局光照”选项开启效果对比lz仅算是业余接触过相关的技术,尽可能查询到的相关资料没有找到非常合适的,因此部分内容是靠推测,可能会与实际有些出入,恳请大家多多指正。
实际上本文介绍的主要技术部分可能在崩坏3和原神(新版本已添加)中几乎没有体现,并且理论部分偏多,但是也算是知道为什么米哈游没有选择使用。
本文约2600字。
没有接触过或刚接触3D行业的朋友可能有时会有些疑问:为什么CG动画的画面看起来比游戏的好非常多但又一下子说不上来哪里好;为什么同样是3D,MMD需要渲染很久而游戏可以60帧率甚至更高实时流畅运行。如下图,上半部分是用3d模型制作软件3d studio max的Arnold渲染器渲染得到的画面,下半部分是用相同的模型放入Unity3D(崩坏:星穹铁道、原神、崩坏3、崩坏学园2等游戏的引擎)中的效果。
明显可以看出上半部分要真实许多,但代价就是上半部分仅一帧画面就渲染了一分多钟,这种代价是实时游戏中不可能接受的。
众所周知,现实世界中,我们能看到物体表面的颜色是由于物体对光进行了吸收和反射,吸收一部分波长的光波、反射另一部分波长的光波,最终展现出了不同的颜色。
直接光照(Direct illumination)是指由光源照射到物体后直接反射到观察者眼中,而不考虑各个物体反射出的光照亮其他物体的效果,也就是说光束在场景中仅进行了一次反射。如下面这个很丑的图所示:
仅考虑直接光照的结果是,虽然各个物体本身的颜色、材质能正确反映,并且也可以产生阴影,但整体来看非常假,前面对比部分中的Unity3D的画面即是仅考虑直接光的结果。
另外举一个更直观的例子,在一个黑暗的房间中使用手电筒的时候,不应该只是照亮了手电筒照着的区域而是整个房间都会变亮。
某些恐怖游戏,如求生之路(求生算恐怖游戏吗)可能顺带利用了这一点制造黑暗恐怖氛围。
间接光照(Indirect illumination)则是物体反射出的光再照射到别的物体上面的光照部分。也就是说,光线在场景中会进行多次反射。
画了个比较烂的图大概理解一下,下图中白色箭头代表直接光照,而蓝色箭头和红色箭头代表物体反射出的间接光照。可以看到茶壶上受到间接光照的影响,两侧分别有淡淡的红色和蓝色(不知道会不会被虎扑的压图压到看不清)。
回到最开始两张图的对比可以发现,真实度区别非常大的原因主要体现在间接光的影响上。
间接光的计算目前常用的是光线追踪(ray tracing)技术。简单来讲是从光源处发射大量光束射线,射线遵循物理规则在各个物体表面吸收、反射、折射等多次后得到最终的光照画面。画面质量取决于射线数量和最大反弹次数。下图展示的是光线追踪的反向算法,从摄像机开始往光源倒推。
间接光照对于画面效果的提升显然是很明显的,但要计算间接光照需要大量的运算资源,这也是为什么CG动画画面非常惊艳而渲染时间也很长。直接光照消耗资源少,但光照效果差,并且场景中存在大量直接光源时也会比较吃性能。
全局光照(Global illumination,GI)是直接光照与间接光照的集合,因为会考虑整个场景对每个物体的光照影响而称为全局光照。
传统三维动画制作软件使用的渲染方式被称之为“离线渲染”——即将动画在后台慢慢渲染成视频后观看。离线渲染充分考虑了直接与间接光照,因而能得到良好的效果。游戏所需要的是实时渲染,在目前算力有限的情况下,除了用一些特殊的方法外,可以认为只能实时运行直接光照。
(顺带一提,近几年Nvidia和AMD都研究出了一些新技术,可以让新架构的显卡支持实时光线追踪(所谓的RTX on),虽然目前还只能做到低反弹次数、低射线数,但相较之前仅有直接光的情况极大地提升了画面水平)
如果正在阅读的朋友们理解了什么是直接光照,可能会意识到一个问题:镜子是靠反射环境实现的,直接光照没有二次反射的情况下是如何实现镜面效果的?解决方案包括了“光反射探针(Reflection Probe)”、“平面反射(Planar Reflection)”、“屏幕空间反射(Screen Space Reflection)”与效果最好的实时光线追踪等。原神和崩坏3中运用到的反射效果会在之后(如果还有之后的话)讲。
为了解决间接光照无法实时渲染、仅有直接光照非常假的问题,游戏引擎使用了一种叫做“烘焙全局光照(Baked Global Illumination)”的技术。在游戏开发时对一些静止的场景进行间接光照的计算后,将得到的间接光照信息存入“光照贴图”中,在游戏运行时“贴”在这些静止的物体上来使用。这样不仅可以得到很好的照明效果,还可以减少实时光照的数量提高运行效率。
光照贴图的问题是,仅有这些静止的场景和物体计算了间接光,但包括角色在内的可移动物体在进入这些场景时并不会得到这些间接光的照明,会出现诸如整个场景是光亮的房间,但玩家进入后发现自己角色是暗的这种情况,如下图,中间的蓝色胶囊体(实际上因为没有光照所以是黑的)在进入这个明亮的房间时并没有得到照明。这些问题也有一些对应的解决方案,之后也许会讲。
另外,还有一些方法可以在不使用实时光线追踪的情况下实现极低质量的实时全局光照(Realtime Global Illumination)。
下图中,新亚特拉的显示器这里地面的绿色光就使用了光照贴图。
后崩坏书2以及永世乐土、月球地图都用到了全局光照技术,光照效果明显提升(大概吧,我也不知道是不是)(但不知道有没有用到实时全局光照技术)。
光照贴图的另一个缺点是需要生成大量的图片会占用很多存储空间。出于对动态环境的考虑,原神并没有使用光照贴图,所有光源都是实时光(这个是弋振中,就围观砸ps4的那个技术总监,在unity技术大会上讲的)。游戏引擎中所有的灯光都可以设置是否产生阴影,为了性能考虑,移动端的部分光源实际上是不带照明效果或不产生阴影的。
游戏设计中为了节省实时运算资源,用了许多小技巧,单面渲染(实际上学名应该不叫这个)就是其中之一。一般使用的是背面剔除(Cull Back)。所有的3d模型都是由面组成的,面分为内外两面。它的思想是,由于正常情况下看模型只能看到外面(或者说“正面”),比如说一个篮球一般不会从内部向外看,因此一般会选择不渲染模型的内面,即,从背面看的时候面是透明的。这也是为什么视角卡到地形下面/水下面时可以“透视”。下图中小场景由一个茶壶与茶壶的周围由五个正面对准茶壶的面构成,当从红面的反面向场景中看时,反面没有被渲染,是透明的。
全局光照部分可能有些枯燥,但它是游戏光照系统的基础。对这些有概念后才能明白为什么游戏引擎会想方设法用低开销做出不完美的画面效果,同时会对了解游戏光照的其他技术有帮助。
本来想一次性介绍完全局光照、反射、部分后处理效果的,结果字数远远超出预期。
尝试着介绍一些深层次的技术就明显发现自己水平有限一知半解,而且许多部分过于重复,给各位带来了很差的阅读体验,深表歉意。
米饭犬殖民洗地天理难容
· 广东卧槽,先顶再看(不确定看不看的懂)
ddtygs楼主
· 山西之前也碰过几次opengl,我觉得你指的应该是全局环境光(Ambient Lighting)而不是全局光照系统(Global illumination,GI)。这个玩意是相当于给场景中所有物体染了个色和亮度,或许是因为你的环境光是选择的纯色导致物体的所有角度亮度都一样所以看着就像在发光。和GI是完全不同的概念