(论文)[2023-SIG-Course] A Gentle Introduction to ReSTIR: Path Reuse in Real-time (3)

ReSTIR

  • 主页
  • update:March 4, 2024

06-ReSTIR Path Tracing

  • 路径空间积分形式
    • DI 扩展出来

L(x1x0)=D=2AD1(j=1D1fs(xj+1xjxj1)G(xjxj+1)V(xjxj+1))Le(xDxD1)dx2dxD

  • 路径:D1 bounce

[x0,x1,x2,x3,,xD]

RIS with a path tracer

  • NEE 开启之后,会形成 path tree
    • RIS:选取一整条路径 Xi
  • 只考虑 NEE 的 RIS
    • RIS 过程:重新采样一条光路 X{X2,X3,X4,X5}X1 表示整条光路)
    • wi=mi(Xi)p^(Xi)WXi
      • mi(Xi)=1,互斥,形成的光路长度不一样,属于不同的路径子空间
        • 例如 X1,光路长度为 3
      • p^(Xi)=f(Xi)WXi=1p(Xi):这些在 PT 框架下都有容易获取

  • 如果考虑所有的光路作为 RIS 的候选,则需要考虑一条路径可能同时被 NEE、BSDF(常规 PT)采样得到
    • 那么 mi(Xi) 此时 1
    • 例如下图中,X4,X5 的 mis 将会 <1
      • X5 是 BSDF sample

mi(X5)=pBSDF(X5)pBSDF(X5)+pNEE(X5)

Reuse path samples

  • 最简单的方式:identity shift(area measure)

T([x0,x1,x2,,xD])=[y0,y1,x2,,xD]

  • 重连 y1,x2
    • 重新计算 BSDF 贡献、几何项、可见性项(发射 shadow ray)
  • biased 版本:加速、减少内存开销
    • 认为 x2y1 近似等于 x2x1:少数情况下效果不错
  • specular 的复用问题很大

Good shift mapping

  • good:假定每一个像素都有一个比较好的重要性采样 pXp¯,理想的形式应该是 shift mapping 之后生成的样本和 pX 类似
    • 下式:对于 i 像素的一个好的 shift mapping

p¯j(T(x))|Tx|p¯i(x)

  • identity shift(area measure):如果 x2 是 diffuse 的话,这是容易满足的
    • 但是如果 x2y1x2x1 距离相差太远,几何项差太多,那么结果也不好

  • 如果 x1/y1/x2 存在 specular,这样效果就很差
    • 如下图,黑色高贡献,但是蓝色几乎贡献为 0

Common shift mappings

  • 借鉴 gradient domain rendering
  • 假设相邻像素变化小
    • 那么相邻相像素 i,jp^ 归一化因子类似
    • 假设 p^f
    • 于是 good shift mapping 条件如下

fj(T(x))|Tx|fi(x)

  • 和 gradient domain rendering 用的条件一样,可以参考它所用的 shift mapping
  • Half-vector shift
    • 对于 specular,拷贝对应点(k)的 tangent-space half-vector,直到 ykxk+1 能够连接
    • 双射要求 yk,xk+1 都是 diffuse(roughness 大于给定值)
    • 出发点:尽可能保留相近的 throughput
      • 当处理 bounce 数变多(多次连不上),产生大的 divergence,效果不太好
    • 合适的材质,效果不错
  • 目的:preserve the path contribution

Efficient shift mapping for RTR

  • hybrid shift
    • random replay
    • additional distance condition
    • 只根据采样 lobe 的 roughness 进行顶点分类
  • 优点
    • 存储小:一个重连接的顶点、随机数种子
    • glossy/refraction 材质效果好
  • 目的:为了保持贡献相近

Ensuring Invertibility

两个条件

  • Distance Condition(为什么不是比例)
    • 第 2 个是为了保证可逆

min(xkxk1,xkyk1)dmin

  • Roughness Condition(足够粗糙,这样对重连接友好)
    • :表示采样到的 lobe
      • 如果存在多个 lobe,则 =argmaxα()
    • α:roughness(specular diffuse:01

min(αxk1(k1),αyk1(k1),αxk(k))αmin

流程

  • 在 base path 形成的过程中(PT),满足如下两个条件的最小 k(k2) 对应的节点 xk 被保存为 reconnection vertex

xkxk1dmin,min(αxk1(k1),αxk(k))αmin

  • shift 的时候,使用 random replay(相同的随机数种子生成路径)生成 offset path,直到 yk1xk 相连
    • 为了可逆,同时需要满足 xkyk1dmin,min(αyk1(k1),αxk(k))αmin
    • k1=k1,直接复制
      • 如果 yk1 上不存在 k1 这个 lobe,那么 shift 失败
  • 不存在更小的 k<k 满足上述条件(指 base&offset path),否则违反可逆
    • 疑惑:所以上面的 k 是整体生成的还是只通过 base path 就能生成?
      • 只能是 base path 生成
    • 感觉像是 base path 生成之后,之后只能在 k 处重连接

Path Samples with Lobe/Technique Tags

  • 为了满足 path space 到 primary sample spaces (for the random number sequence) 的双射,需要将路径扩展到带 lobe 的

x¯=[x0,(x1,1),(x2,2),,(xD1,D1),xD]

  • 0jNlobe 表示 xj 采样到的 lobe 类型
    • Nlobe is the total number of lobes in the scene
  • 如果光源被 NEE 采样得到,D1=Nlobe 标识这个信息
  • 如此便能通过random replay 完全复现这条路径
    • 要求使用的随机数除了路径生成,不用于其他
  • 重写:长度 D+1 的路径
    • ¯=[1,2,,D1]LD
    • 上面的 x¯Ω¯D
    • mt(x):NEE、BSDF 的 MIS,D1 标识 NEE 还是 BSDF 采样

I=D=1Ω¯Df¯(x¯)dx¯=D=1¯LDADmt(x)f¯(x)dx

Primary Sample Spaces

  • ReSTIR PT uses primary sample space(PSS) parameterization for the paths.

  • PSS 好处

    • 路径积分可以直接通过 f/p 表示,不用分开记录 f,p(浮点误差小)
    • shift mapping 过程中,random replay 的顶点 Jacobian = identity,方便计算
  • PSS 形式的路径积分

    • u:随机数序列

    • UD=[0,1]N(D):超立方体,ND 表示 u 的长度

    • F(u¯)=f¯(X(u¯))/p(X(u¯))

    • X(u¯):映射到采样到的路径

    • ux¯ 是双射

I=D=1UDF(u¯)du¯

Jacobian 计算

  • 重连接的计算(其他的话是 identity)
  • ωk1xxk1xk 的单位向量
  • 根据面积采样和立体角采样建立联系
    • xk=yk

|ωk1yωk1x|=|ωk1yyk||xkωk1x|=|cosθkycosθkx|xkxk12xkyk12

  • 会影响 xk1,xk
    • 如果 xk 是光源,则只影响 xk1,红色部分为 1

|u¯yu¯x|=|u¯k1yu¯k1x||u¯kyu¯kx|

  • xk1
    • p(ω,)k1x(xk)=pωk1x(xk)pk1x:采样 lobe 和方向的联合分布,立体角度量
      • 如果是光源,那么将面积度量转化为立体角度量,lobe 采样 pk1x=1
    • p(x)dx=p(y)dy

|u¯k1yu¯k1x|=|u¯k1yωk1y||ωk1yωk1x||ωk1xu¯k1x|=p(ω,)k1y(yk)p(ω,)k1x(xk)|ωk1yωk1x|

  • xkxk=yk

|u¯kyu¯kx|=|u¯kyωky||ωkxu¯kx|=p(ω,)ky(yk+1)p(ω,)kx(xk+1)

  • 根据重连接定义:ωkx=ωky,k1x=k1y,但是采样概率不同(出射方向不同)

ReSTIR PT 细节

  • 数据结构如上
  • path sample 的内容
    • 重连接顶点
    • 随机数生成器(RNG),序列生成
    • 辅助信息
  • 假定重连接顶点 yk 不是光源(只是为了表示方便,处理类似)
  • 重采样流程
    • RNG ξ1 生成子序列 y2,,yk1,throughput 为 β
    • 通过三角形 ID(Δ)、重心坐标 λ1,λ2,计算 yk=xk
      • 动态场景需要其他处理,需要使用到 ξ2
    • ω=ωkx:入射方向,L:入射辐射度估计
    • 贡献计算如下
      • mt:考虑到 yk+1 可能是光源的 MIS 系数(不是光源,则为 1)

F(Y)=p^(Y)=βmt(ωky)fs,ωk1y(yk)/pωk1y(yk)fs,ωky(yk+1)/pωky(yk+1)L

  • Jacobian 根据式子计算
    • 可以预先计算一些和 yk1 无关的部分保存下来,避免重复计算
  • 重采样整个算法流程如所示
    • 蓝色 Xi,红色 Yi

Volume rendering

  • 体渲染的积分域:M=AV
    • 表面 + 体

Ij=D=1MD+1We(j)(x1x0)T(x0x1)G¯(x0x1)(j=1D1f¯s(xj+1xjxj1)G¯(xjxj+1)T(xjxj+1))L¯c(xDxD1)dx0dx1dx2dxD

  • 针孔摄像机,没有相机响应函数
    • 递归形式
    • 所有点的自发光到 x0 的贡献(长度为 1,2,
      • 疑问:这里似乎没有考虑直线外的光源?

L(ω0x0)=T(x0x1s)(Le(x1sx0)+P(x0,x1s))+0sT(x0x1)(σa(x1)Lem(x1x0)+P(x0,x1))dz1

  • s=||x1sx0||:最近的不透明点到像素的距离
  • x1=x0+z1ω0ω0 根据像素位置决定
  • P:"in-scattered" path contribution

P(x0,x1)=D=2MD1(j=1D1f¯s(xj+1xjxj1)G¯(xjxj+1)T(xjxj+1))L¯e(xDxD1)dx2dxD

  • 体介质
    • f¯s=fs
    • G¯=1/xjxj+12
    • L¯e(xDxD1)=σa(xD)Lem(xDxD1)
  • 表面:常规的含义
  • transmission item T
    • 计算代价高,在某些 σ 分段常数情况下,计算快

T(xy)=exp(0zyσt(xyω)dy)

  • T:Volumetric ReSTIR 使用一个简单的 p^
    • ray marching 近似 T
    • 使用低分辨率的 volumes 计算(最小化内存开销)
    • A piece-wise constant, low resolution volume
  • Volumetric ReSTIR
    • x1 依赖于 z,复用的时候复制 z1 去生成 shifted x1
    • 两个复用:vertex、direction
      • shifted path:[z1,ω1,z2,ω2,,zD1,xD]
    • vertex reuse 效果好,但是由于几何上的奇异性, direction reuse 效果不佳(opted for the slower direction reuse by default)
    • 可以参考 hybrid shift(random replay、distance threshold 等)