重要性采样的方法有多种,这里我们介绍其中一种,你的实现也可以使用其他方法。我们将通过 GGX 采样来完成 E(µ)的预计算工作。先从理论上讨论 GGX

采样算法,对于给定出射方向 o 的 GGX采样,目标是采样生成入射方向 i 以计算

\(\frac{f r (i,o,h)(i,n)}{pdf i (i)}\)。因此,对于 GGX 算法有两个核心问题需要解决:如何采样和对应的概率 pdf 是什么

第一个问题,如何采样入射方向 i。

我们首先根据选用的 NDF模型,重要性采样微表面法向 m(也就是 i,o 之间的半程向量h),随后通过采样得到的微表面法向 m,利用反射关系来计算入射方向 i:

\[i = 2(m · o)m − o
\]

同时对于任意 NDF 下,采样 m 对应的概率密度 pdf m (m),有:

\[pdf_m (m) = D(m)(m · n)
\]

(这是由 NDF 中

\(∫D(m)(m · n) = 1\) 这一性质得出,文档不会涉及到关于

NDF 性质的讨论。同样,关于下述 GGX 采样点生成的推导过程也会被略去)

通过该 \(pdf_m (m)\),可以计算出 GGX NDF 对应的采样点应该为:

\[θ_m = arctan(
\frac{
α \sqrt{ξ_1}}
{\sqrt{1 − ξ_1}
}) \\
ϕ_h = 2πξ_2
\]

其中,ξ_1 ,ξ_2 ∈ [0,1)。

补充:

\[pdf_m (m) = D(m)(m · n) \\
= \frac{a^2}{PI*(((n \cdot h)^2)*(a^2-1)+1)^2} (n \cdot h) \\
= \frac{a^2}{PI*(cos^2 \theta*(a^2-1)+1)^2} cos \theta
\]

因为我们可以用球面坐标(\(\phi\),\(\theta\))表示半径向量m,因此我们可以把\(pdf_m\)表示为\(pdf_{\phi}\)和\(pdf_{\theta}\)的乘法。\(pdf_{\phi}\)不依赖角度\(\phi\),所以我们可以简单的推导出:

\[pdf_{\phi} = \frac{1}{2\pi}
\]

所以:

\[pdf_{\theta} = \frac{pdf_m(m)}{pdf_{\phi}} = \frac{2 a^2}{(cos^2 \theta*(a^2-1)+1)^2} cos \theta
\]

运用逆变换采样(Inverse Transform Sampling Method)生成具有指定概率密度分布的随机变量,我们需要先得到概率密度的累积分布,这里直接给出结果。

\[cdf_{\phi} = \int_{0}^{\phi}\frac{1}{2\pi}dx = \frac{1}{2 \pi} \phi \\
cdf_{\theta} = \int_0^{q} \frac{2a^2x}{(x^2(a^2-1)+1)^2} dx = \frac{1-q^2}{1+q^2(a^2-1)}
\]

其中 \(q=cos(\theta)\).现在反转cdf函数,以产生从均匀值\(\epsilon_1,\epsilon_2\)到角度\(\phi,\theta\)的映射:

\[\phi = \epsilon_1 * 2 \pi \\
\theta = arccos \sqrt{\frac{1-\epsilon_2}{1+\epsilon_2(a^2-1)}}
\]

或者

\[\theta = arctan \frac{a \sqrt{\epsilon_2}}{\sqrt{1-\epsilon_2}}
\]

两者是等价的。

第二个问题,如何计算采样得到的入射方向的概率。

因为我们最后生成的采

样方向是入射方向 i, 所以最后结果的权重应该是:

\[weight(i) = \frac
{f_r (i,o,h)(i,n)}
{pdf_i (i)}
\]

所以需要将之前采样微表面法线的概率密度 \(pdf_m (m)\) 转换成采样入射的概率密

度 \(pdf_i (i)\),而两者之间的转换只需要简单的乘一个 Jacobian 项即可,即:

\[pdf_i (i) = pdf_m (m) ∥
\frac
{∂ω_m}
{∂ω_i}

\]

其中,对于反射有:

\[∥
\frac
{∂ω_m}
{∂ω_i}
∥=
\frac
{1}
{4(i · m)}
\]

讨论完以上两点后,最终对于采样入射的权重可以整理为:

\[weight(i) = \frac
{(o · m)G(i,o,h)}
{(o · n)(m · n)}
\]

补充

Jacobian项

直观理解

法线分布会以宏观法线为中心对应于一个波瓣lobe,在视线确定情况下,经过反射,反射光线又会形成于另一个波瓣。这两个波瓣的大小不同,因此对应点的概率密度分布也不同。

以一定概率任意取一个法线和以其中为中心的微小的立体角范围,会对应于另一个反射光线和其微小范围;这两个范围的光线的对应概率相等,因为它们直接是1-1映射的关系;又因为范围足够小,可以近似认为是概率密度在这个小区间均匀分布,因此:

\[pdf_h*A_h = pdf_o*A_o
\]

因此概率密度分布之比与微表面积之比成反比。

Kulla-Conty BRDF补充_重要性采样GGX的更多相关文章

  1. 转 如何理解 重要性采样(importance sampling)

    分类: 我叫学术帖2011-03-25 13:22 3232人阅读 评论(4) 收藏 举报 图形 重要性采样是非常有意 思的一个方法.我们首先需要明确,这个方法是基于采样的,也就是基于所谓的蒙特卡洛法 ...

  2. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-4 基于重要性采样的材质初探

     Preface 我们今天来把第三本书从开局到现在讲的一大堆理论运用到我们的框架中,那么今天我们首先将原始的材质改为基于重要性采样原理的材质 这一篇是代码工程中进行MC理论应用的初步尝试篇  Read ...

  3. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-2 蒙特卡罗(二) 重要性采样

    书本内容:见相册 preface 还记的我们上一篇说的Monte Carlo 维度诅咒吗 上一篇算是二维的例子吧,大家看了之后是否想着写一个一维的Monte Carlo模拟积分?(我想了,没写出来) ...

  4. Flutter实战视频-移动电商-16.补充_保持页面状态

    16.补充_保持页面状态 修正一个地方: 设置了item的高度为380 横向列表为380.最终build的高度也增加了50为430. 增加了上面的高度以后,下面那个横线划掉的价格可以显示出来了. 但是 ...

  5. 对pathtracing的一些个人理解

    本人水平有限,若有错误也请指正~ 上面说到pathtracing(pt)的一些优点和缺点,优点即其实现很简单,这就是大概为什么当今市面上流行的很多渲染器如今都相继采用pathtracing算法为核心进 ...

  6. Microfacet模型采样下的brdf

    本文前言 在学习图形学(games101 from bilibili)的时候,也遇到了像这样的问题,Cook-Torrance模型无法实现粗糙度为0时,物体微表面呈现绝对镜面的效果(呈现出一面镜子), ...

  7. Ward BRDF实现心得

    最近做了Ward BRDF的实现,相对于之前的lambert,phong来说,Ward是一个真正意义上的各向异性BRDF,但同样的,Ward模型也是一个基于经验的模型,并不是物理上正确的.它由ward ...

  8. 随机采样和随机模拟:吉布斯采样Gibbs Sampling

    http://blog.csdn.net/pipisorry/article/details/51373090 吉布斯采样算法详解 为什么要用吉布斯采样 通俗解释一下什么是sampling. samp ...

  9. PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七]

    0. PGL图学习之图神经网络GraphSAGE.GIN图采样算法[系列七] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/50619 ...

  10. MCMC等采样算法

    一.直接采样 直接采样的思想是,通过对均匀分布采样,实现对任意分布的采样.因为均匀分布采样好猜,我们想要的分布采样不好采,那就采取一定的策略通过简单采取求复杂采样. 假设y服从某项分布p(y),其累积 ...

随机推荐

  1. RHCA rh442 006 中断号 缓存命中率 内存概念 大页

    IRQ均衡 硬中断 IRQ是中断号 2003 电脑 拨号 56K Modem USB 打印机 拨号成功,打印机会是乱码,他们会不兼容 因为终端号一样 (类似ip地址冲突) 在bios里面调整设备的中断 ...

  2. HTML+JavaScript+CSS做一个界面

    下面是一个web界面主要是前端没有后端功能:关于JavaScript几种比较常见的样式   Javaweb(1),html <!DOCTYPE html> <html lang=&q ...

  3. Jmeter固定定时器

    固定定时器(Constant Timer),每个线程在请求之间暂停相同的时间.时间单位是毫秒,1000毫秒=1秒 组件路径:线程组->右键添加->定时器->固定定时器 1.固定定时器 ...

  4. GeoScene Enterprise 3.1 临时许可更新

    Portal许可更新 portal 的许可更新很简单,直接打开Portal在线更新就好了 平台管理 -> 许可管理 -> 附加许可 -> 导入许可 -> 选择文件(选择授权的j ...

  5. 【SpringBoot】06 探索配置方式 Part2 占位符的使用

    配置占位符? 随机数配置生成 RandomValuePropertySource 在配置文件中使用随机数 uid = ${random.value} uid = ${random.int} uid = ...

  6. 【FastDFS】05 Java程序测试上传

    创建普通Maven工程 导入所需依赖坐标: <dependencies> <!-- https://mvnrepository.com/artifact/net.oschina.zc ...

  7. 国产最好用的操作系统——deepin,为什么不适合生产环境

    前几天看了罗永浩的视频,他推荐了一本Intel创始人的书,看了这本书后想到书中大谈Intel和Microsoft的合作才创建下了今天的PC世界.看到这我就有些不爽了,现在美国各种控制和制裁我们的芯片, ...

  8. IntersectionObserver + scrollIntoView 实现电梯导航

    电梯导航也被称为锚点导航,当点击锚点元素时,页面内相应标记的元素滚动到视口.而且页面内元素滚动时相应锚点也会高亮.电梯导航一般把锚点放在左右两侧,类似电梯一样.常见的电梯导航效果如下,比如一些官方文档 ...

  9. Wetab 标签页:内置多种免费实用优雅小组件的浏览器主页和起始页

    Wetab 是什么? Wetab 是一款基于浏览器的新标签页产品,主张辅助用户打造一个兼具效率与美观的主页. Wetab 的核心特色便是内置了多种实用.优雅的小组件. 今天这篇,主要按照分类详细介绍  ...

  10. JavaScript设计模式样例九 —— 桥接模式

    桥接模式(Bridge Pattern) 定义:是用于把抽象化与实现化解耦,使得二者可以独立变化. 目的:将抽象部分与实现部分分离,使它们都可以独立的变化. 场景:实现系统可能有多个角度分类,每一种角 ...