图形学数学基础之Hammersley采样
来源:互联网 发布:腾讯上班知乎 编辑:程序博客网 时间:2024/06/07 00:41
作者:i_dovelemon
日期:2017/08/02
来源:CSDN
主题:hammersley,binary
引言
在图形学里面,用到了很多的采样算法。特别当你在写一个光线追踪器的时候,会使用大量的采样算法来对BRDF,光源等进行采样。这些采样操作,一般是先通过创建一个具有均匀分布的2D随机点集合,然后通过变换,将这些2D随机点变换到具体的采样数据上去,如BRDF的方向等等。关于这部分变换和相应的原理,后面会有相应的章节来讲解,今天我们先来了解一个在实现PBR中,经常被使用到的均匀分布的2D随机采样方式–Hammersley采样。
Hammersley采样
Hammersley采样,听上去好像很深奥的样子,实际上是一个十分简单的操作。
我们知道,在计算机里面大量使用了二进制来表示数据,如下表所示的一些十进制与二进制的对应关系:
而Hammersley采样就是利用计算机使用二进制表示的特性,来构造均匀分布的2D随机采样点。它是通过对一个二进制数进行Radical Inverse方法,来构造出一个值来实现的。它的过程如下表:
从上表可以看到,Radical Inverse方法,就是简单的将给定的十进制数的二进制表示方法,反过来放在小数点之后,构造一个在[0,1]之间的值。
在明白了Radical Inverse方法之后,我们就可以构造hammersley的2D随机分布的采样点集合,如下所示:
其中N表示的是一共有多少个采样点,
在我的raytracer项目中,使用了hammersley采样,有相关的代码可供参考,如下所示:
class HammersleySampler(Sampler): def __init__(self): super().__init__(Sampler.MULTIJITTERED) def radicalInverseBase2(self, v): x = 0.0 f = 0.5 v = int(v) while v != 0: x += f * (v & 1) v = math.floor(v / 2) f *= 0.5 return x def genSamplersInUnitSqure(self, num): self.samplers = [] for i in range(num): x = i * 1.0 / num y = self.radicalInverseBase2(i) self.samplers.append(Vector2(x, y))
同时该raytracer的测试例子,能够得到如下一张图,显示了hammersley是均匀分布的:
float RadicalInverse(uint bits) { bits = (bits << 16u) | (bits >> 16u); bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); return float(bits) * 2.3283064365386963e-10f;}vec2 Hammersley(uint i, uint N) { return vec2(float(i) / float(N), RadicalInverse(i));}
总结
图形学的世界非常的奇妙,采样的理论非常美丽,后面会陆陆续续和大家介绍更多的相关内容。
参考文献
[1] Ray Tracing From Ground Up
- 图形学数学基础之Hammersley采样
- 图形学数学基础之重要性采样(Importance Sampling)
- 图形学数学基础之1D采样分布计算方法Inverse Method
- 图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)
- 计算机图形学的数学基础
- 计算机图形学的数学基础
- 图形学基础(5)——Sobol 采样
- 计算机图形学导论(1)-基础数学
- 图形学基础复习之矩阵
- [3D计算机图形学]学习笔记 第一章 计算机图形学中的数学基础
- 游戏开发学习起步之图形学基础
- 图形学基础之画心形和圣诞树
- 数学之美---计算机图形学算法(转贴)
- 图形学基础
- 图形学 基础
- 采样之拒绝采样
- 图形学中的数学
- 图形学数学--向量
- 设计模式之建造者模式
- 2659: [Beijing wc2012]算不出的算式
- [机器学习入门] 李宏毅机器学习笔记-35(Ensemble part 1;集成方法 part 1)
- POJ 3342 Party at Hali-Bula(树形DP)
- 2150: 部落战争
- 图形学数学基础之Hammersley采样
- tabs切换的实现方式
- Session会在浏览器关闭后消失吗?
- 形变目标识别DPM论文《Object Detection with Discriminatively Trained Part Based Models》阅读笔记
- c++中map容器的使用
- 2298: [HAOI2011]problem a
- 对象的深浅拷贝方法
- VMWare安装linux系统
- 2134: 单选错位