ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Veach1997阅读笔记1-双向路径追踪的原理与实现

2021-05-06 23:04:29  阅读:703  来源: 互联网

标签:bar frac 光源 align 路径 双向 alpha Veach1997 追踪


目录

序言

Veach大佬的博士论文是渲染领域的一篇经典之作。虽然这篇文章发表于20多年前,但直到今天,仍有不少新文章在引用。Veach在文章中详细推演了路径追踪,双向路径追踪,多重重要性采样等基于物理渲染领域的核心技术,并给出了简洁的实现思路。

双向路径追踪

原理

前置的路径追踪原理本文就不多说了,网上相关的博客一大堆。
image
双向路径追踪分别从屏幕和光源各自追踪一条子路径,例如上图中路径\(x_0 x_1\)就是从光源追踪的一条子路径,我们称之为“光源子路径”(light-subpath)。同理,路径\(x_4 x_3 x_2\)是“视线子路径”(eye-subpath)。虚线表示“阴影路径”(shadow-path),如果阴影路径没有被任何物体遮挡,那么我们称\(x_1\)和\(x_2\)可见,即路径\(x_0 x_1 ... x_4\)是从光源到屏幕的一条可行的路径。
image
而对于一条可行的路径,光源子路径和视线子路径是可以人为划分的。如上图,对于一条长为2的路径,有4种不同的划分方式。根据s、t的不同,我们将子路径对记为\(\bar{x}_{s,t}\)。
有意思的地方在于,对于一对比较长的子路径对(例如之前的路径\(x_0 x_1 ... x_4\),或者表示为\(\bar{x}_{2,3}\)),没有必要一定选择\(x_1 x_2\)作为阴影路径,也可以选择\(x_1 x_3\),这样就生成了新的子路径对\(\bar{x}_{2,2}\)。同理,我们可以复用这些点产生多组不同的子路径对,而这些子路径对都会对像素的显示产生贡献。根据多重重要性采样原则,对其进行加权平均,即可得到最终的像素值。

\[F=\sum_{s\ge0}\sum_{t\ge0}w_{s,t}(\bar{x}_{s,t})\frac{f_r(\bar{x}_{s,t})}{p_{s,t}(\bar{x}_{s,t})} \]

其中\(f_r(\bar{x}_{s,t})\)是路径中每个点的BSDF的乘积。而\(p_{s,t}(\bar{x}_{s,t})\)则表示选择出这条路径的概率密度,由于在路径上每个点选择下一个方向是相互独立的,所以这个值也可以用每个点处对应方向的概率密度之积表示(阴影路径是特殊情况,之后会有分析)。\(w_{s,t}(\bar{x}_{s,t})\)则是和路径相关的权重值,权重值会有不同的选择策略。

计算

我们记:

\[C_{s,t}^*=\frac{f_r(\bar{x}_{s,t})}{p_{s,t}(\bar{x}_{s,t})} \]

那么有:

\[F=\sum_{s\ge0}\sum_{t\ge0}w_{s,t}C_{s,t}^* \]

根据以上分析,不难看出\(C_{s,t}^*\)可以写成如下形式

\[C_{s,t}^*=\alpha_s^Lc_{s,t}\alpha_t^E \]

其中\(\alpha_s^L\)只与光源子路径有关,\(\alpha_t^E\)只与视线子路径有关,\(c_{s,t}\)只与阴影路径有关。同时也可以递进的算出\(\alpha_i^L\)和\(\alpha_j^E\)。下面以路径\(y_0y_1...y_{s-1}z_{t-1}...z_1z_0\)为例:

\[\begin{align*} \alpha_0^L&=1\\ \alpha_1^L&=\frac{L_e(y_0)}{P_A(y_0)}\\ \alpha_i^L&=\frac{f_s(y_{i-3}\to y_{i-2}\to y_{i-1})}{Pdf(y_{i-2}\to y_{i-1})}\alpha_{i-1}^L,\text{for }i\ge 2 \end{align*} \]

同理有:

\[\begin{align*} \alpha_0^E&=1\\ \alpha_1^E&=\frac{W_e(z_0)}{P_A(z_0)}\\ \alpha_i^E&=\frac{f_s(z_{i-1}\to z_{i-2}\to z_{i-3})}{Pdf(z_{i-2}\to z_{i-1})}\alpha_{i-1}^E,\text{for }i\ge 2 \end{align*} \]

其中\(L_e\)表示光源的自发光,\(W_e\)表示摄像机类似于光源发光的一种属性(我暂且设定为1),\(P_A(y_0)\)表示在光源面上取到点\(y_0\)的概率,\(P_A(z_0)\)同理。

\[\begin{align*} c_{0,t}&=L_e(z_{t-1}\to z_{t-2})\\ c_{s,0}&=W_e(y_{s-2}\to y_{s-1})\\ c_{s,t}&=f_s(y_{s-2}\to y_{s-1}\to z_{t-1})G(y_{s-1}\to z_{t-1})f_s(y_{s-1}\to z_{t-1}\to z_{t-2}),\text{for }s,t>0 \end{align*} \]

至此,我们已经完成了\(C_{s,t}^*\)的计算,接下来我们计算\(w_{s,t}\)。无论使用哪一种权重策略,我们都要计算如下值:

\[p_i=p_{i,s+t-i}(\bar{x}_{s,t}) \]

以\(\beta=2\)的指数启发式平衡为例子:

\[w_{s,t}=\frac{p_s^2}{\sum_i p_i^2}=\frac{1}{\sum_i (\frac{p_i}{p_s})^2} \]

所以事实上我们只用计算\(p_i\)相对于\(p_s\)的值就好了。然而\(p_i\)和\(p_{i+1}\)之间的关系我们很容易得到。这两者之间唯一的区别就是\(x_i\)这个点是如何得到的。对于\(p_i\),它属于视线子路径;对于\(p_{i+1}\),它属于光源子路径。其他的点的生成方法没有区别,所以可以得到以下关系:

\[\begin{align*} \frac{p_1}{p_0}&=\frac{P_A(x_0)}{Pdf(x_1\to x_0)G(x_1\to x_0)}\\ \frac{p_{i+1}}{p_i}&=\frac{Pdf(x_{i-1}\to x_i)G(x_{i-1}\to x_i)}{Pdf(x_{i+1}\to x_i)G(x_{i+1}\to x_i)}\\ \frac{p_{s+t}}{p_{s+t-1}}&=\frac{Pdf(x_{s+t-2}\to x_{s+t-1})G(x_{s+t-2}\to x_{s+t-1})}{P_A(x_{s+t-1})} \end{align*} \]

这样一来,我们就能计算出最终的像素值了。

实现细节

(等待更新)

标签:bar,frac,光源,align,路径,双向,alpha,Veach1997,追踪
来源: https://www.cnblogs.com/lfq-graphic/p/14733447.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有