Lightmass分析 系列文章前言及目录
本文会介绍一些 Lightmass 中涉及的基础概念, 理解这些内容会帮助你更轻松的分析UE代码.
光照贴图是一张记录物体表面辐射照度的纹理, 其中一般记录着预先烘焙好的场景光照, 因为装照传输是线性的, 所以其他动态光源所形成的光照可以在这个辐射照度值上进行累加. 光照贴图是现阶段主流的漫反射间接光照的解决方案.
UE 中的光照贴图看上去比较奇怪是因为 Lightmass 会对实际的数据进行球谐编码, 光照贴图上一半存储光照信息, 一半存储方向信息.
光照贴图使用的 UV 与一般的纹理 UV 有很大的差别. 光照贴图中每一个有效像素都对应着模型表面上的一个"点", 所以我们要求模型的每一个三角面在光照贴图上的 UV 相互之间不存在重叠.
TextureMapping 是 Lightmass 用来保存中间数据和必要信息的结构. 比如物体表面的辐照度和光照贴图的尺寸等. TextureMapping 中的核心成员大多是一维数组, 但是实际上这个数组表示的是一个 2D 纹理.TextureMapping 本身没有特殊之处, 更多时候他就像是一个全局变量, 为特定流程提供必要的信息或提供保存数据的空间.
在 Lightmass 中一个经常要使用的概念是 Texel. Lightmass 的最终任务是产生场景中物体的光照贴图, 在计算过程中 Lightmass 系统经常需要知道光照贴图中某个像素在 3D 空间中表示的位置法线等几何数据. Texel 便是保存这一信息关联的载体. Texel 相当于同时存储 uv 坐标和几何数据, 通过 uv 坐标就可以得到我们需要的几何信息.
光栅化是 Lightmass 中另一个经常出现的操作. Texel 中 uv 坐标和几何数据信息的关联正是在光栅化的过程中建立的. 光栅化之后相当于产生一个名为 TexelToVertexMap 的 2D 纹理.
光栅化最重要的价值: 遍历光栅化产生的 2D 纹理就相当于在遍历场景中物体表面的每一个"点".
Lightmass 的光栅化与渲染管线的光栅化类似, 区别在于 Lightmass 要光栅化的三角形并不是经过投影等变换之后得到的, 而是整个模型表面上的三角形.
光栅化首先将一个一般的三角形水平分割为两个特殊的三角形, 然后进行水平线的扫描. 根据三角形两边的斜率计算出扫描线两个端点的坐标, 然后根据插值计算三角形内部纹素(Texel)的数据,
Lightmass 在进行光栅化时通过 SuperSampling 进行抗锯齿操作. 在计算每一个纹素时, 会施加一定的偏移然后进行多次光栅化取加权平均值.
另一个相关的概念是 Corner. Corner 的名字来源于其偏移要比正常的光栅化纹素偏移大一点, 刚好将他们包围起来. 每个纹素对应一个 Corner, 一个 Corner 内部记录了四个角落的信息. Corner 无需加权, 用来修正加权值异常的纹素.
双向反射分布函数 f(x, wi, wo) 表示在 x 点处, 从 wi 方向照入的光有多少从 wo 方向反射出去. 我们一般通过对 wi 在半球方向上积分, 计算出 x 点处沿着 wo 方向上发射出去的光有多少. 这个积分是光照方程的核心组成部分.