跳转至

光传播体积Light Propagation Volumes(LPV)

最早出现在CryEngine 3

快且好

关键问题

查询从任何点中从任意方向来的光线

关键思想

光线直线传播不改变

关键解决方案

使用==3D网格==将光线从==直接光照表面==传播光线到任意位置

LPV步骤

  1. 生成场景光照辐射点集
  2. 将虚拟光源的点集注入到辐射体积中
  3. 体积辐射传播

  4. 通过最终的光传播体积进行场景照明

1.生成

这是为了能找到直接光照的表面 - 只需要简单的应用RSM - 可以使用一组减少的漫反射surface pathces(又称虚拟光源

2.注入

  • 将场景换分为3D格子
  • 对于每个格子,我们可以找到之前封闭的那些虚拟光源
  • 对他们的定向辐射分布进行求和
  • 将他们压入球谐函数的前两阶(总共4)
  • ![[Pasted image 20250304121629.png]]

3. 传播

  • 对于每个网格,收集他从他本身格子之外的==六个邻近格子==传来的辐射
  • 求和,并再次使用SH去表达
  • 重复==这个传播多次,直到体积变得==稳定

4. 渲染

  • 对于任何着色点,找到它所在的格子
  • 抓取他在格子中从个方向获得的辐射
  • 着色

LPV问题

  • 漏光,按理来说,光照本不应该穿墙。但是LPV会让较薄的在体积中的物体获得一样的的照明 ![[Pasted image 20250304124040.png]]

解决方案

  • 将格子划分的更细,但是又带来了性能上的问题(更多的计算、存储)
  • 增加模型墙体厚度 ![[Pasted image 20250304124226.png]]

(Voxel Global Illumination)VXGI

VXGI介绍

  • 依旧是tow-pass算法
  • 和Rsm的两个区别
    • 直接照射像素->变为->直接照射体素
    • 在RSM中采样->变为->在3D中跟踪反射锥

场景处理

  • 体素化整个场景
  • 构建层次结构

![[Pasted image 20250304130245.png]]

Pass 1

  • 每个体素存储incident光线分布,normal法线分布等信息
  • 在层次结构上更新

Pass 2