(六)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:上篇(全局照明GI和局部照明)

一、全局照明和局部照明

全局照明(global illumination,GI)是用于向三维场景中添加更为逼真的光照效果的一组算法总称。全局算法不仅考虑光源发出的光与被照亮物体之间的关系,即直接照明(direct illumination),还考虑光线从某一物体的表面传递到另一个物体的表面时的关系,即间接照明(indirect illmination)。而局部照明(local illumination)则只需要考虑直接照明即可,不考虑光线在物体之间的反射。直接照明和局部照明如下图:

全局照明需要考虑的是全部入射到摄像机中的光线,而局部照明则只需要考虑进入摄像机中的那一部分直接照明的光线。

 光线追踪是一种很合适实现全局照明的方法,这种技术通过跟踪场景中的光线传播的轨迹路径来模拟真实世界中的景象。但光追技术目前太慢,不适合大多数需要渲染图形的场合,只有在一些非实时的离线渲染上使用光线追踪技术去实现全局照明,如动画片等。目前,使用光栅器对给定顶点进行插值,生成片元,然后对片元进行着色操作,是生成实时图像的标准方法。

随着硬件性能的提升和渲染算法的不断改进,视频游戏等实时渲染领域在一定程度上也可以使用全局照明的方式来渲染了。普遍的方法是只为在场景中静止不动的物体预先针对间接照明进行计算,并把计算结果存储起来,然后在运行时使用这些间接光照信息进行渲染。因为待绘制物是静止不产生变化的,所示这种方法产生的效果在运行时仍然是正确的。

这种预先计算间接光照效果,最后把效果以光照贴图的方式存储,产生一张贴图的过程被比喻成“烘焙出一张糕饼”出来。所以unity把这种技术成为烘焙式全局照明(baked GI),或者称为烘焙式光照贴图(baked lightmapping)。这个光照贴图最终结果是把场景中静止的游戏对象的光照效果信息合并成一张大的纹理,供运行时使用。烘焙式全局光照可以利用更多的预结算时间支持用区域面光源产生的光照效果,以及支持更加逼真柔和的阴影。

Unity5.0之后还增加了一种预计算实时全局照明的技术,和烘焙式全局照明类似,这种新技术仍然限于应用在静态物体上,依然需要一个运行前预结算的阶段。但在预结算阶段中,除了“计算出当前光源发出的光线,沿着当前的传播路径照亮到本物体时的效果”之外,还要处理“如果在运行时有光线沿着别的传播路径传递到本物体表面时,光线应该沿着哪个方向传递出去”的问题,引擎会预计算所有可能的光线传播路径并存储,在运行时,将当前的光源输入预结算的光传播路径中,并计算光照效果。

由于存储的是传播路径,因此使用预结算实时全局照明技术在运行时,光源的数量、类型、位置等属性都可以改变。被照亮物体的材料属性,如吸收光的能力,自己发射光的能力也可以改变。在运行时,间接照明的效果也会相应更新这一切只要保持物体是静态的且形状不发生改变即可。

使用预计算实时全局照明也能产生较为柔和的阴影,但是除非场景很小,否则这些阴影的效果一般会比使用烘焙式全局照明所产生的阴影要粗糙些。

预结算实时全局照明

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值