Veach1997阅读笔记1-双向路径追踪的原理与实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Veach1997阅读笔记1-双向路径追踪的原理与实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3762字,纯文字阅读大概需要6分钟。
内容图文
![Veach1997阅读笔记1-双向路径追踪的原理与实现](/upload/InfoBanner/zyjiaocheng/989/d6c225323a9d495eb6da0c15b19eb477.jpg)
序言
Veach大佬的博士论文是渲染领域的一篇经典之作。虽然这篇文章发表于20多年前,但直到今天,仍有不少新文章在引用。Veach在文章中详细推演了路径追踪,双向路径追踪,多重重要性采样等基于物理渲染领域的核心技术,并给出了简洁的实现思路。
双向路径追踪
原理
前置的路径追踪原理本文就不多说了,网上相关的博客一大堆。
双向路径追踪分别从屏幕和光源各自追踪一条子路径,例如上图中路径\(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\)是从光源到屏幕的一条可行的路径。
而对于一条可行的路径,光源子路径和视线子路径是可以人为划分的。如上图,对于一条长为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_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*} \]这样一来,我们就能计算出最终的像素值了。
实现细节
(等待更新)
内容总结
以上是互联网集市为您收集整理的Veach1997阅读笔记1-双向路径追踪的原理与实现全部内容,希望文章能够帮你解决Veach1997阅读笔记1-双向路径追踪的原理与实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。