问题七十:计算机图形中的采样(Sampling)

为什么要学“采样”?

这个问题的答案估计很多。每个人都可能自己的答案,当然也有官方标准的答案。

别人的答案、或者官方标准的答案,与我何干?

我只是在学习“Ambient Occlusion”时需要对光线撞击点处的上半球面进行采样,以便得到阴影光线的方向。仅此而已。

 

参考书籍《Ray Tracing from the Ground Up》。


书上有关于如下知识点的详细介绍,咱不赘述。

问题七十:计算机图形中的采样(Sampling)_第1张图片

 

在这里,我们只做三件事情:

1,对比各种采样技术:罗列各种采样技术,对比它们在单位正方形上的采样结果。

2,“采样”类的架构:定义Sampler为基类,各种采样技术对应的类都是继承Sampler。明确子类和父类的“分工”。

3,映射采样点:将采样点从单位正方形映射到单位圆和单位半球(这个结果后面会用到)。

 

70.1 采样技术的分类


我们这里会罗列的采样技术有:Random Sampling、Jittered Sampling、n-Rooks Sampling、Multi-Jittered Sampling、Hammersiley Sampling。

对于这些“奇奇怪怪”的采样技术,我们需要知道的是:

它们各自采用自己的方式来做同一件事情,那就是对单位正方形进行采样,最后的结果都是得到单位正方形上所有采样点的(二维)坐标(如下方红色方框示意)

顺便说一句:后续,我们在“映射采样点”章节做的事情就是:将单位正方形上得到的采样点引射到其他图形上去。

 

70.1.1 Random Sampling


问题七十:计算机图形中的采样(Sampling)_第2张图片

70.1.2 Jittered Sampling


问题七十:计算机图形中的采样(Sampling)_第3张图片

70.1.3 n-Rooks Sampling


问题七十:计算机图形中的采样(Sampling)_第4张图片

70.1.4 Multi-Jittered Sampling


问题七十:计算机图形中的采样(Sampling)_第5张图片

70.1.5 Hammersley Sampling


问题七十:计算机图形中的采样(Sampling)_第6张图片

 

70.2 程序架构

问题七十:计算机图形中的采样(Sampling)_第7张图片

Sampler类的定义:


问题七十:计算机图形中的采样(Sampling)_第8张图片


Multi-Jittered Sampling类的定义:


问题七十:计算机图形中的采样(Sampling)_第9张图片

 

70.3 采样点映射


70.3.1将单位正方形上的采样点映射到单位圆上


问题七十:计算机图形中的采样(Sampling)_第10张图片

70.3.2将单位正方形上的采样点映射到单位半球面上


若原采样点是通过Hammersley Sampling得到的,映射后的结果如下:

问题七十:计算机图形中的采样(Sampling)_第11张图片

 

若原采样点是通过Regular Sampling得到的,映射后的结果如下:

问题七十:计算机图形中的采样(Sampling)_第12张图片

70.4 其他说明


Referrance

[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.

你可能感兴趣的:(C++,ray,trace,computer,graphics)