Skip to main content

未烘焙的光照性能开销有多大?

该部分详细涵盖了每种光源的性能开销。

在计算开销时,使用 Draw Call Passes 作为基本单位。一个 Draw Call 是Unity为显卡提供渲染数据的过程。我们不考虑在这部分实际着色像素的性能开销,如果它不新增 Pass ,我们称之为免费Free)。否则,我们将记录它产生的 Draw Call Pass 数目。

让我们想象一个完全没有光源的空场景。

我们添加的第一个光源不是一个真正的实时光源,而是一个天空盒。这提供了环境光,并且它是免费的。来自天空和的光照将进入光照探针中,我们将在后面提到。

我们添加的第二个光源是一个方向光。这提供了主要的光照,并且它是免费的。一个考虑光照的着色器将渲染一个方向光,无论如何。

然而,这假设了它不投射阴影。如果我们打开阴影,我们将面对第一个额外的性能消耗。Unity必须渲染阴影级联——一组包含了视图中所有物体的阴影的材质。VRChat将渲染四个分级,每个分级将包含从光源视角可见的任何对象,在最坏的情况下,它将渲染四次所有对象。(诶,阴影不使用遮挡剔除)

有一个额外的性能开销。当打开阴影时,Unity将需要渲染一个渲染包含所有可见对象的深度通道的深度缓冲(Depth Buffer)。这会与主阴影通道一起渲染。深度缓冲对于着色器效果非常有用,但是它是一个额外的性能开销。

我们添加的第三个光源是一个点光源。它为它范围中的所有对象增加一个 Pass,并且再次渲染它接触到的任何对象。

点光源没有阴影。如果我们打开阴影,Unity将渲染一个六面的立方体贴图——从光与阴影的透视关系来看。这意味着在光源范围内的对象将渲染至多六次

我们添加的第四个光源是聚光灯。它与点光源工作原理相同,为它范围内的所有对象添加一个 Pass。

如果对聚光灯打开阴影,它将为阴影渲染一个 Pass。只需要一个,因为它是聚光灯。

我们添加的第五个光源是区域光无事发生,因为区域光只能在烘焙后生效。

如果设置这些光源为烘焙的(Baked),然后烘焙光源,它们将不再有性能开销。它们将被放入光照探针中,这个探针之前仅包含了环境光。

所有非静态的物体可以基于它的位置读取Unity提供的光照探针信息。这是光照的性能开销最小的形式,即使它能够重现任意数量的光源及其反射——那些正常情况下无法重现的情况。

烘焙光源是好的因为它们性能开销小,而且视觉效果良好。