美文网首页何三思Unity3D技术文档翻译Unity3D
【Unity3D技术文档翻译】第3.5.2篇 线性光阴影

【Unity3D技术文档翻译】第3.5.2篇 线性光阴影

作者: 何三思 | 来源:发表于2018-07-12 08:55 被阅读6次
    Unity3D技术文档翻译

    上一章:【Unity3D技术文档翻译】第3.5.1篇 阴影详情

    本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Shadows】→【Directional light shadows】

    线性光阴影

    线性光模拟了日光和单个灯光,照亮了整个场景。这意味着阴影贴图通常将一次性覆盖场景的大部分,而这会容易导致一种叫作透视锯齿(perspective aliasing)的问题。透视锯齿意味着阴影贴图中靠近摄像机部分的像素与远处的想比,会被放大且呈块状。

    图中 A 处的阴影分辨率是合适的,但是靠近摄像机的 B 处阴影出现了透视锯齿。

    如果你使用了 soft shadows,并且设置了高分辨率的阴影贴图,那么透视锯齿就不那么明显。然而代价是,使用这些特性将增加对图形硬件的要求,帧率也可能因此下降。

    Shadow cascades(阴影分级)

    透视锯齿出现的原因是阴影贴图的不同区域,因为摄像机的透视而被不成比例地放大了。灯光的阴影贴图只需要覆盖场景中能够被摄像机看到的部分,这被定义为摄像机的 view frustum(视锥体)。你可以想象这样一个简单的例子——线性光直接从上面照下,于是你就能看到视锥体与阴影贴图之间的关系。

    视锥体的末端被阴影贴图的20个像素覆盖,而近端只被4个像素覆盖。然后,近端和远端在屏幕上表现为相同尺寸。这就导致了,对于靠近摄像机部分的阴影区域,阴影贴图的分辨率太低了。(注意,在实际使用中,阴影贴图的分辨率远高于 20*20,且通常不是完美的正方形。)

    使用一张更高分辨率的阴影贴图能够减少锯齿效果,但是在渲染时会占用更多内存和带宽。观察上图会发现,在近端,大部分的阴影贴图都被浪费了,因为它们永远不会被看到;同时对于从远处观察的摄像机,阴影的分辨率又太高了。而根据距离摄像机的距离来讲视锥体分为两个区域是能做到的。近端区域可以使用单独的小尺寸(但是分辨率不减)阴影贴图,于是像素比例会变得正常。

    这种按照阴影贴图尺寸进行分级减少的方法被称为 cascaded shadow maps(分级阴影贴图)(有时也被称为“Parallel Split Shadow Maps(平行分割阴影贴图)”)。在 Quality Settings 中,你可以为阴影分级设置 zero、two 或者 four cascades。

    阴影分级使用的越高,阴影就越不会受透视锯齿影响,但是同时也会增加渲染负担。然而,与使用高分辨率阴影贴图相比,该方法产生的负担仍然要小很多。

    阴影使用 four cascades 的例子

    阴影距离

    物体离摄像机越远,它的阴影就变得越不明显;它们在屏幕上看起来更小,而且通常不是注意力的核心。通过设置 Quality Settings 中的 Shadow Distance 属性,Unity 让你可以利用这种效果。物体与摄像机距离超过该属性值的,将不会产生阴影,并且随着距离增加逐渐淡出。

    通过设置尽可能低的阴影距离,来帮助提升渲染性能。它的工作原理是远处的物体不需要被渲染进阴影贴图中。此外,去除了远处物体的阴影,场景通常看起来反而更好。在移动设备上,设置正确的阴影距离对于性能是很重要的,因为它们不支持阴影分级。如果摄像机的远平面比设置的阴影距离小,Unity 会自动用摄像机的远平面来代替阴影距离。

    可视化的阴影参数调节

    Scene View 有一个 draw mode 叫做 Shadow Cascades,该模式下会使用不同的颜色展示不同的阴影分级。使用该模式可以帮助你调节阴影距离、阴影分级,以及确保分级比例是对的。注意,该可视化效果使用的是场景视图的远平面,通常要比阴影距离更大。因此,如果你想要游戏中摄像机的表现和阴影距离匹配,你可能需要调低阴影距离。

    场景视图中阴影分级绘制模式

    阴影压缩(Shadow Pancaking)

    为了更进一步预防 shadow acne(阴影花纹),我们正在使用一种叫做 Shadow Pancaking 的技术。该技术的想法是:当沿灯光方向渲染阴影贴图时,减少灯光空间(light space)的范围。这会增加阴影贴图的精准度,减少 shadow acne。

    该图展示了 shadow pancaking 使用原则

    在上图中:

    • 亮蓝色圆圈代表了阴影投射
    • 暗蓝色矩形代表了原始灯光空间
    • 绿线代表了优化后的近平面(排除了在视椎体中不可见的阴影投射)

    将这些阴影投射采样到优化后的近平面上(在顶点着色器中)。注意,虽然该方法通常能起效,但是会制造一个非常大的三角面穿过近平面。

    大三角面问题

    在上图例子中,只有一个蓝色三角面的顶点穿在了近平面之后,并被采样。然而,这改变了三角面的形状,并产生了错误的阴影。

    你可以通过调试 Quality Settings 中的 Shadow Near Plane Offset 属性来避免该问题。这么做将拉回近平面。然而,如果将该属性的值设置的非常高,又会导致 shadow acne,因为它提高了阴影贴图在灯光方向上覆盖的范围。除此之外,你还可以细分有问题的阴影投射三角面。想了解更多信息,请看上一节中关于 bias 的部分。

    如果本文对你有帮助的话,点个赞或者评论一下吧!

    下一章:【Unity3D技术文档翻译】第3.6篇 全局光照概述(Global Illumination)

    相关文章

      网友评论

        本文标题:【Unity3D技术文档翻译】第3.5.2篇 线性光阴影

        本文链接:https://www.haomeiwen.com/subject/awaqpftx.html