浅谈游戏中动静态光照的运用

时间:2022-10-07 20:49:53
最近在项目中准备开始使用静态光照贴图,但是对于动静态光照的混合还未找到一种很好的运用模式,于是研究了下 UE3 和 Diablo3 的实现方法,略有收获。但因时间紧张仅粗略记录了下概要,以备后用。


UE3 的静态光照烘焙贴图分为两种:

一种为 LightingTexture,仅保存光照颜色信息,格式为 DXT1 压缩,因此不包含 alpha 通道。
但是同一个物体被不同光源所影响时可以将它们的 LightingTexture 合并为一张。

一种为 ShadowMapTexture,仅保存光源在当前物体上的投影遮挡信息,格式为 G8,只有灰度。如果一个物体被多个光源所投影,那么针对每个光源都会有一张单独的 ShadowMapTexture。


UE3 的每种光源分为四种子类型:

第一种为 StaticLight 全静态光源(光源位置颜色均不会实时改变),会烘焙 LightingTexture,但使用动态投影。

第二种为 MoveableLight 全动态光源(光源位置颜色均会实时改变),光照投影均为实时计算。

第三种为 ToggleableLight 仅颜色可改变,位置不可改变的光源,会使用 ShadowMapTexture,但不会进行实时光照计算。

第四种为 DominantLight 特性与 ToggleableLight 基本相同,但是同一个物体最多只能被一个 DominantLight 所影响,以保证其不会生成过多的 ShadowMapTextures。

注意:即便场景中没有需要烘焙 LightingTexture 的光源,也有可能为每个物体烘焙一张环境光的 LightingTexture。

如果需要清除以前烘焙过的当前场景没有使用到的光照贴图,可以存储场景,并且重新打开该场景的 Package。


Diablo3 部分光照方案:


地形以很大一个区域进行分割,其上所有地形模型统一使用一张尺寸为 2048x2048 的灰度 LightMap。该 LightMap 使用离线渲染器静态烘焙上光照的强度(无颜色)和间接光照等信息。


动态实时光照为前向渲染的顶点光照,虽然顶点光照有在模型网格较粗略时光照出现大块色斑没有细腻渐变的问题,但是当动态顶点光照计算的颜色混合上前面说的像素级 LightMap 时却能极大程度地缓解该问题,使光照区域变得更加细腻。


除此之外模型网格上也包含顶点颜色信息,其实现可能类似于 UE3 的 MeshPaint 功能。即便是使用同一模型文件的两个场景实体,也可以在场景编辑器中根据其空间位置分别在其上单独绘制顶点颜色通道。以实现美术想要的艺术性色彩控制。


因为暗黑3的视角为2.5D,没有*视角变化,所以对于场景中的路灯等光源采用绘制一个带 Alpha 渐变的几何体模型方式来模拟光晕。那么在其光晕范围之后的场景物体也会产生一种类似受光的虚假光照效果。


李晨原创

转载请标明,谢谢。