UE3模块化阴影

来源:互联网 发布:我的名字叫红 知乎 编辑:程序博客网 时间:2024/04/27 17:10

模块化阴影


文档变更记录: 由 Daniel Wright 创建。

  • 模块化阴影
    • 概述
    • 版本
    • 相关设置
      • LightShadowMode(光源的阴影模式)
      • ModShadowColor(模块化阴影颜色)
      • ShadowFalloffExponent(阴影衰减指数)
      • ModShadowFadeoutExponent(模块化阴影淡出指数)
      • ModShadowFadeoutTime (模块化阴影淡出时间)
    • 为什么使用模块化阴影
    • 模块化阴影的工作原理
    • 限制
      • 双重阴影
      • 自发光失真
      • 投射的阴影可以穿过几何体
      • 阴影缓冲滤镜

概述


模块化阴影的引入是为了解决正常阴影所带来的一些性能问题,同时也是为了使美术工作人员对于阴影外观有更多的控制。在这篇文档中所说的 'normal shadows(正常阴影)'只是代表非模块化阴影,它并没有暗示关于过滤技术的任何事情。

注意:模块化阴影既能够和投射的阴影缓冲共同工作也能够和阴影体积共同工作。

版本


ModShadowFadeoutTime(模块化阴影淡出时间)功能是在 QA_APPROVED_BUILD_JUNE_2007 版本中引入的,但是阴影的淡入功能直到 QA_APPROVED_BUILD_AUGUST_2007 版本才被引入。Modulate-Better(更好的模块化)阴影模块在版本 QA_APPROVED_BUILD_JAN_2008 中被添加。

相关设置


ModShadowOptions.jpg 

LightShadowMode(光源的阴影模式)

控制着这个光源所使用的阴影类型。

  • LightShadow_Normal(光源阴影_正常) – 默认的行为并且 为了使网格物体从那个投射阴影的光源接受到阴影,需要网格物体可以被那个光源动态地照亮 。这是一个非常重要的暗示,因为它意味着如果几何体的光照贴图包含着那个投射阴影的光源的光照信息,则这个几何体不能接受正常阴影。正常阴影在 Xbox 360 上的代价是非常的昂贵的,因为它们需要额外的渲染目标空间,这需要其它的渲染目标被保存然后再被恢复。
  • LightShadow_Modulate(光源阴影_模块化阴影) - 从这个光源启用模块化阴影,它可以在任何不透明的或带蒙板的物体上投射阴影。这是性能开销最低的模式。模块化阴影是通过使多个场景颜色相乘来操作的而不是通过遮盖某个光源来操作的。

ModShadowColor(模块化阴影颜色)

这项控制着模块化阴影的颜色。

ShadowFalloffExponent(阴影衰减指数)

用于聚光源和点光源的基于距离的阴影衰减速率。较高的值意��着衰减将发生的更快。值为 1 意味着进行线性衰减。

ModShadowFadeoutExponent(模块化阴影淡出指数)

当 ModShadowFadeoutTime(模块化阴影淡出时间)的值大于 0 时,这项用于控制淡出和淡入曲线。

ModShadowFadeoutTime (模块化阴影淡出时间)

如果这项的值大于 0,那么模块化阴影将基于投射者最后一次可见的时间来进行淡出。它也会基于投射者第一次变得可见的时间进行淡入。这可以用于淡出在另一个房间内的人物的阴影,否则这个人物的阴影将会穿过墙壁被看到。请确保您在编辑器中启用了实时更新否则它将不能进行正常的工作。淡入淡出操作是依赖于帧频率的,所以任何故障都可能会导致意想不到的失真。

为什么使用模块化阴影


对于每个使用 Normal Shadows(正常阴影)的光源,物体的动态阴影都会被描画。这个场景中的阴影是来自当前光源的丢失的光线。这是在物理上来讲更加正确的模型,然而它有一些重要的含义。一个典型的场景在同一个区域将会有几个光源,但是由于性能原因只有这些光源中的一个可以投射动态阴影。在这种情况下,阴影颜色完全由影响产生阴影的表面的光源决定。这个阴影将会非常昏暗,因为阴影投射的光源只提供了表面上全部光源的一部分, 在这种情况下,美术工作人员要想调整阴影的颜色并使它变得更暗是非常困难的,因为那需要使投射阴影的光源变得更亮(或更近、具有更小的衰减等等),而这样做可能会毁掉场景中的光照。 

一旦静态几何体的光照贴图已经建立,则 Normal shadows(正常阴影)不会投射到该几何体上。模块化阴影可以投射到整个场景上,所以解决了这个问题。 

场景中有影响人物的三个光源,仅其中的一个投射正常阴影。注意阴影是非常模糊的。
ThreeNormal.jpg

模块化阴影的工作原理


从这里开始着重讲解模块化阴影。简而言之,模块化阴影允许美术工作人员在每个动态物体上只能有一个阴影,并可以在没有改变投射阴影的光源的光照属性的情况下来控制阴影的颜色。

模块化阴影从物理上来讲并不如正常阴影正确,然而在大多数情况下这可以通过性能优势和用户控制优势进行弥补。在每次光照渲染遍数中阴影应用 ModShadowColor(模块化阴影颜色),然后它们被渲染到衰减缓冲中,而不是用于隐藏当前的光源。当已经渲染完了所有的光源,衰减缓冲将会和场景的颜色相乘。结果是无论有多少光源作用于这个表面上,阴影都会变得更暗,因为来自一个光源的阴影影响来自所有光源的光照,而不是仅影响投射阴影的那个光源。 

同样是具有影响一个人物的三个光源的场景,仅其中一个光源投射模块化阴影。注意,阴影仍然很醒目。
ThreeMod.jpg

点光源的模块化阴影基于光源的半径有一个径向衰减。这对于聚光源也是适用的,除了该衰减也会受到内锥角和外锥角的影响。定向光源没有距离衰减。

限制


双重阴影

由于模块化阴影只是针对场景的颜色进行简单地模块化,阴影重叠的区域将会有双重阴影。这个问题的解决方法是在图元附近产生其父项的阴影。比如,在战争机器 1 中所有武器的产生的使它们父项 pawns 的阴影来避免双重阴影的。请查看 AttachingActors#b_ShadowParented 来获得如何在内容中对父项进行投影。可以在代码中使用 PrimitiveComponent 的 SetShadowParent 方法来产生父项阴影。

自发光失真

模块化阴影和场景中颜色的相乘,包括不能产生阴影的自发光光源。解决方法是使用 Modulate-Better(更好的模块化)阴影模式,这将会阻止模块化阴影影响任何通道中的的自发光组件大于 1 的像素。

投射的阴影可以穿过几何体

在目前的实现中,模块化阴影会穿过几何体。这个现象的最显著情况必须通过认真的调整光源的位置来避免。通过手动地调整光源的位置来避免这种情况是非常困难的,但是通过使用光照环境可以使其变得非常容易。在某些情况下,这种现象可以通过使用 ModShadowFadeoutTime(模块化阴影淡出时间)来避免。在背面的阴影可以使用 Modulate-Better 阴影模式来避免。

真正地消除这些反射失真的方法是使用正常阴影。然而,大多数情况下使用正常阴影消耗的性能要比模块化阴影高很多。对于这个有一个例外是: 主光源。主光源允许您使用一个投射正常阴影的光源从而减少性能消耗。

阴影缓冲滤镜

模块化阴影的一个结果可能是来自某个特定光源的背面的颜色将不再和那个光源投射的阴影的颜色一致。这意味着阴影必须精确地覆盖背面,否则那个差异将非常的显著。这是某些阴影缓冲滤镜技术存在的问题,比如 VSM,它引入了深度偏移量。请查看阴影缓冲滤镜选项?和阴影缓冲滤镜技术?了解更多信息。

0 0
原创粉丝点击