(论文)[2008-SIG] Imperfect Shadow Maps for Efficient Computation of Indirect Illumination

ISM

  • 间接光的可见性查询,能够快速生成不那么准确的可见性结果
  • 1 个 pass 实现粗糙的多光源阴影
    • 将整个场景用很多点表示,然后对这些点做低分辨率的阴影
    • 阴影上的空洞使用 pull-push 补全(降采样再上采样)

Introduction

  • ISM 是很多低分辨率的 shadow maps
  • ISM 可以和 IR(instant radiosity)结合
  • IR 基于 VPL(virtual point lights),大的开销就在可见性上
    • ISM 可以弥补这一点

相关工作

  • Global Illumination Methods
    • 精确可见性
    • 拆分远近的几何,近处集合计算光照不需要考虑可见性
  • Real-Time Global Illumination
    • 大多需要静态场景
    • precomputed radiance transfer(PRT)
    • VPLS
    • 考虑可见性之后,算法都不太可行
      • 小场景、低频 radiance
  • Visibility Approximations in Rendering
    • 可见性不需要很准确

ISM

  • 使用 VPL,那么可见性只需要在 VPL(几百个)和光源之间计算【而不是任意两点】
    • 几百个 SM 还是不现实
  • ISM 将场景划分为点,然后通过 pull-push 填补空洞
    • 不准确,但是在 GI 里面可以接受

Scene Preprocessing

  • 场景使用点表示
  • 根据三角形面积,随机采样三角形;然后在三角形上随机采样点
    • 记录点的位置、中心坐标、三角形索引

ISM Creation

  • 单张 ISM 生成【一个 VPL 对应一张 ISM】
    • 将所有的点做投影,生成深度图
      • box splatting kernel【GL points
    • 大小基于点到对应 VPL 距离的平方
      • 假设每一个场景的点表示相同的面积
      • 面积反比于距离平方?
  • VPL 向着半球发光,因此深度图需要覆盖半球,这里使用 parabolic maps
    • ISM 本身不限制投影类型(正交、透视都 ok)
  • 动态场景:将三角形的变换转移应用到点上即可
    • 可能会不均匀,但是 ISM 本身不要求均匀
  • 1 个 pass 里面就可以渲染很多低分辨率的 ISM
    • 每个 ISM 渲染相同数量的点(fixed, random subset of the point set
    • 保存 ISM(128x128)到一个大纹理图中(4096x4096)
  • 为了减少计算量,点很少,因此深度图中会有空洞
    • 使用 pull-push 填补
  • pull-push【实现,一共 3 层】
    • pull:降采样构建 image pyramid【/2】
      • 细层有效像素值用于计算粗层的值,平均
    • push:上采样插值计算未定义的值
      • 细层未定义值从粗层插值得到,双线性
  • 加上 outlier rejection【pull/push 都有】
    • pull 的时候只计算相近值,push 的时候只修改差别大的值
    • 阈值为 5% 场景大小,\(2^l\) scale【最精细层 \(l=0\)

讨论

  • \(P\) 个点,有效分辨率为 \(N_{\text{res}}=(\pi/4)n^2\) 的 parabolic ISM
    • 每个 ISM 的平均点数 \(\bar{P}=P/N_{\text{res}}\)
  • 假设最优点采样,如果场景深度的复杂度为 \(\bar{P}\),那么就能够很好的生成深度图
    • 但是一般场景都不满足
  • pull-push 减小了这个问题;但是这样得到的深度图不可能是完美的

  • 点表示能够使得同时生成上百张 ISM

Indirect Illumination with ISMs

  • one-bounce GI
  • GPU 构建 VPLs【快】
    • Splatting Indirect Illumination 类似的方法构建【TODO:有兴趣再看
    • 点光源构建 cube map,重要性采样之后,获取 \(N_{\text{vpl}}\) 个位置
  • 其他方法也 ok(photon shooting 等)
  • 加速
    • 每个 ISM 只用部分场景点
    • 渲染的时候使用附近的 VPL【类似 Splatting Indirect Illumination】,然后用 geometry-aware blur 去除噪声
  • IR 本身的限制:材质需要是 diffuse,或者 slightly glossy
    • 否则需要大量 VPL

Multiple Bounces

  • imperfect reflective shadow maps(IRSM))
    • 类似 SM => RSM,我们也能让 VPL 的光照多一跳
  • 此时 ISM 里面存储的是 indirect illumination 信息而不是深度值
    • 交点信息从场景点反推到三角形获取

结果

  • NVIDIA GeForce 8800 GTX
  • single-bounce of indirect illumination at 640x480(G-Buffer block size 8x8)

实验

  • 当时情况下效果很好,速度 10x【对比 IR + SM】
  • \(N_{vpl}=512\):误差随着 ISM 分辨率、场景点个数的变化
    • manual 表示手动调整其他参数

  • pull-push 能解决漏光问题
  • IRSM 效果展示
  • glossy 场景展示,4096 VPLs,2k 场景点
  • VPL 太少会导致 temporal flicker,我们测试场景都还好

其他应用

  • 面光源:使用点光源近似
    • 512 个点光源近似右边的发光白条;256x256 ISM,8k 场景点

  • 环境光:1024 VPL 差不多

讨论

  • 对于场景而言,复杂的话需要更多场景点;目前手动给
  • 低分辨率 ISM,导致小物体的阴影被忽略
  • 参数需要手动给定,目前不是全自动的
    • diffuse 场景:1024 VPLs,场景点 \(P=1/4 N_{\text{res}}\times N_{vpl}\),ISM 分辨率 128x128 差不多