视场角(Field of View, FOV)
在游戏中,FOV可以决定摄像机在固定距离能看到多大范围的场景,FOV越大,视角越广。FOV通常又分为水平FOV与垂直FOV两种。
UE4中水平FOV(
其中:
- Aspect Ratio = 屏幕宽度 / 屏幕高度(如16:9 ⇒ 16/9 ≈ 1.777)。
- 公式推导基于透视投影的相似三角形原理:
- 垂直半角(
)满足 。 - 水平半角(
)满足 。
- 垂直半角(
屏占比(ScreenSize)
一、基础公式
二、计算过程分解
步骤1:计算物体在摄像机空间的投影尺寸
- 原理:根据相似三角形,物体在近裁剪面上的投影高度与物体实际尺寸成正比,与距离成反比。
- 示例:
- 半径100cm的球体,距离摄像机500cm →
100/500 × 2 = 0.4
(标准化尺寸)
步骤2:转换为屏幕像素尺寸
- 关键转换:将投影尺寸映射到屏幕像素空间。
- FOV的作用:视场角越大,同样距离的物体在屏幕上越小。
- 示例:
- FOV = 60°(≈1.047弧度),ScreenHeight = 1080像素:
球谐函数(Spherical Harmonics)
1. 什么是球谐函数?
球谐函数是一组定义在球面上的正交基函数。它们类似于傅里叶级数(用于分解周期函数),但不是将函数分解成正弦和余弦波,而是将定义在球面上的函数分解成一系列具有不同空间频率和方向性的基函数。
想象一下球面上的任何复杂图案(比如一个房间里的光照分布,或者一个物体的粗糙度)。球谐函数可以把这个复杂图案拆解成一个个简单的、基础的图案(基函数),每个基础图案都有一个对应的强度(系数)。把这些基础图案加起来,就能近似还原出原来的复杂图案。
2. 主要特性
- 定义域: 球面
(即单位球)。 - 正交性: 就像傅里叶基函数一样,不同的球谐基函数之间是正交的,这意味着它们是彼此独立的。这使得分解和重建函数变得简单。
- 完备性: 理论上,通过足够多的球谐基函数,可以无限精确地近似任何定义在球面上的平方可积函数。
- 阶数 (Order / Band): 球谐函数按阶数
(通常从0开始) 组织。每个阶数 有 个不同的基函数,由指数 (从 到 ) 标记。 - 总共有
个基函数直到阶数 。 - 0阶 (
): 1个基函数 ( ),形状像一个均匀的球。 - 1阶 (
): 3个基函数 ( ),形状像三维空间中的三个轴向梯度。 - 2阶 (
): 5个基函数 ( ),形状更复杂,能捕捉更多细节,如凹凸。 - 更高阶可以捕捉更精细的细节和更锐利的光照。
- 总共有
3. 数学形式(简化)
实数球谐函数
它们是勒让德多项式 (Legendre Polynomials) 和三角函数组合而成的。
例如:
- 0阶:
(常数,代表环境光的平均亮度) - 1阶:
(与 Y 轴方向相关) (与 Z 轴方向相关) (与 X 轴方向相关)
- 2阶:
- 等等...
这些在笛卡尔坐标系下,可以表示为 x, y, z
以及 xy, yz, zx, x^2-y^2, 3z^2-1
等多项式的组合,这也就是为什么在 SHBasisFunction3
中我们看到 InputVector.x
, InputVector.y * InputVector.z
, VectorSquared.x - VectorSquared.y
这样的项。
4. 投影(Encoding)与重建(Decoding)
-
投影 (Encoding): 将一个球面函数
(例如来自方向 的光照) 转换成球谐系数 。这通过积分来完成:
在实际应用中,通常通过对球面进行采样并求和来近似积分。 -
重建 (Decoding): 使用求得的系数
和基函数 来近似原始函数在任意方向 上的值:
其中是使用的最高阶数。
5. 卷积(Convolution)
球谐函数的一个强大特性是,球面上的卷积操作(例如,光照函数与BRDF的卷积)在SH域中可以简化为系数的逐项相乘。
如果
其中
二、球谐函数在游戏图形学中的应用
球谐函数在游戏图形学中主要用于高效地表示、存储和计算低频(Lows-Frequency)的环境光照,尤其是漫反射间接光照。高频光照(如锐利高光)通常需要更高的阶数,计算量也会随之增大,所以SH更适合处理平滑变化的漫反射。
1. 预计算辐射度传输 (Precomputed Radiance Transfer, PRT)
这是SH最经典的应用之一,用于离线烘焙复杂场景的间接光照,然后在运行时高效地渲染。
- 光照烘焙:
- 将环境光照编码为SH系数。例如,一个Probe(探针)在一个位置采样周围环境光,然后将这些光照投影到SH基函数上,得到一组SH系数。
- 将物体表面的传输函数(考虑自遮挡、漫反射、次表面散射等)也编码为SH系数。
- 在运行时,将环境光的SH系数与传输函数的SH系数进行卷积(在SH域中是简单的乘法),就可以得到物体表面接收到的间接光照。
- 这种方法特别适用于静态几何体上的间接漫反射光照,可以预计算每个顶点的SH系数,运行时直接插值。
2. 环境贴图(Environment Maps)的替代和压缩
传统的环境贴图(如立方体贴图)需要存储每个像素的颜色信息,而且采样成本相对较高。
- SH代替环境贴图: 可以用低阶SH系数来表示环境光照,尤其是对于漫反射部分。这样可以大大减少存储空间,并且在GPU上解码更快。
- LOD (Level of Detail): 可以根据离摄像机的距离或物体的重要性,动态调整使用的SH阶数,从而控制细节和性能。
3. 实时漫反射间接光照 (Real-time Diffuse Global Illumination)
尽管复杂PRT的开销较高,但简化的SH方案可以用于实时间接光照。
- 探针系统 (Light Probes / GI Probes):
- 在场景中放置一系列光照探针。每个探针在离线或运行时捕捉其周围的环境光照,并将其编码为一组SH系数。
- 游戏对象在渲染时,根据其位置插值周围几个探针的SH系数。
- 然后,利用插值得到的SH系数重建该位置的环境光照,并用于计算漫反射间接光照。
- 这种方法在UE4、Unity等引擎中被广泛使用,通过在关卡中放置
LightmassImportanceVolume
或Light Probe Group
来实现。
- 天空盒光照: 天空盒的光照也可以编码为SH系数,用于计算场景中所有物体的间接漫反射光照,特别是在没有其他复杂GI系统时。
4. 次表面散射 (Subsurface Scattering, SSS)
SSS模拟光线进入物体内部并散射后再射出的现象(如皮肤、蜡烛)。SH可以用于近似渲染一些简单的SSS模型。
- 通过将入射光照和散射轮廓编码为SH,可以在SH域中高效地计算光线在物体内部的散射,然后重建出出射光照。
5. 体积光照 (Volumetric Lighting)
在体积光照中,光线在体积介质中散射。SH可以用于近似表示介质中各个点的光照场。
- 通过将体积分成小单元,并在每个单元中存储SH系数,可以描述光线在体积内部的传播和散射。
总结
球谐函数提供了一种强大的数学工具,用于在球面域中处理函数。在游戏图形学中,它们的核心价值在于:
- 数据压缩: 用少量系数表示复杂的光照分布。
- 计算效率: 特别是卷积操作在SH域中变得非常简单。
- 平滑性: 非常适合表示低频、平滑变化的漫反射光照。
虽然SH在高频光照(如高光)方面表现不佳,但通过与其他技术(如传统反射探针用于高光)结合使用,它成为了现代游戏引擎中实现高效且视觉效果良好的全局照明不可或缺的一部分。
参考资料
【腾讯文档】介绍UE4的FOV计算原理
https://docs.qq.com/aio/DYXFpdVZZSWZ0ZnFD
【腾讯文档】ScreenSize计算过程
https://docs.qq.com/aio/DYUNuYUxJZU1icG1s