陈波

场景美术:Evil3D引擎的多光源照明


光照简介

光照的必要性

光照对于3D模拟来说是必不可少的,光照使得3D模拟显得更加真实。没有光照与有光照的差异是非常大的。我们先来看一个无光照的3D模型。如下图:

image

我们可以看到,再无光照下面,3D的一个圆球跟我们2D的一个圆没有任何区别。既然没有任何区别,那么3D对于2D来说也就没有任何优势。现在我们来给这个圆球增加一盏灯光。如下图:

image

现在我们增加了光照,圆球看上去很立体。实际上我们的视觉能力完全取决于灯光以及灯光与材质之间的相互作用。非常多的场景都是通过精确的光照来实现的。

前向渲染中的光照

在前向渲染中,光照是通过逐物体的方式实现的。每一个物体都会去遍历一遍场景中的所有灯光,并且被shader或者硬件限制,每个物体只能接受大约4盏灯光。在这样的限制下我们无法通过大量的光照来实现一个满意的场景。因此常规的前向渲染引擎一般只能接受1到4盏灯光,性能也不能达到最佳。

延迟渲染中的光照

鉴于前向渲染存在光照不足的弊端,那么延迟渲染就应运而生,延迟渲染解决了大量光照的问题。延迟渲染是在后期处理的光照,因为在后期处理,因为灯光的数量已经不再成为限制。灯光与每个像素直接关联而不是与模型关联。但是延迟渲染有它的好处就存在了它的弊端。它的弊端就是因为在后期处理光照,那么后期处理光照的手段就只能统一为1种。也就是整个场景用到了延迟渲染的物体都只能使用一种材质。这个也就成为了它的最大的弊端。在前向渲染里面,我们可以为每个物体赋予不同的材质,因为光照是在物体光栅化阶段生效的,因此我们可以在不同的物体应用不同的光照效果。但是在延迟渲染里面,光照统一在后期处理,我们只能选择一种方式来实现,也就限制了我们只能使用一种材质。

前向渲染与延迟渲染的取舍

目前我们的引擎是前向渲染的架构方式。虽然延迟渲染非常诱人,但是考虑到迁移的复杂度、功能完整性、涉及的在研项目等种种原因,我们还是决定停留在前向渲染阶段。

前向渲染多光源

既然前向渲染不能被放弃,那么我们就需要解决前向渲染里面多光源的问题。因此我们在最近一段时间实现了前向渲染的多光源功能,今天我们正式发布了我们的多光源版本的Demo传送门。。我们为多光源准备了很久,我们重新实现了一种新的阴影,将阴影的计算放置到了后期计算当中,这样可以为我们的多光源节省出非常多的资源。同时我们也调研了非常多关于前向渲染的光照优化算法。最终我们选择了Forward Plus这种方式来实现多光源,该算法最初是由AMD提出的。

我们在Evil3D中为这个算法做了许多适配,使得Evil3D可以非常流程稳定的运行多光源。我们实现了这个算法之后,只是在我们的引擎里面做了一些非常微小的改动,就使得多光源版本完美的契合以前的光照系统。我们保留了之前光照系统的所有功能,这样我们可以在不影响项目运行,不增加美术工作量的前提下,可以从以前的非实时多光源版本完美的过渡到实时多光源。实时的多光源可以为我们的场景增色不少。

操作步奏

  • 首先为我们的场景增加一盏灯光
    image
  • 然后勾选我们的LightPicker,勾选PointLihgt选项即可。
    image

是不是觉得非常简单,可以不增加任何工作量完美切换到实时多光源。

PS:

  • 本文介绍的常规多光源以及我们引擎的多光源
  • 如果有疑问或者错误不足之处,请和TA组联系!欢迎交流,我们会及时补充纠正!