注册 登录
开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project 返回首页

NARUTO的个人空间 http://www.opengpu.org/?43244 [收藏] [复制] [分享] [RSS]

日志

PBRT阅读:第二版7.6自适应采样

已有 1523 次阅读2015-5-16 10:07 | 采样器

7.6自适应采样

AdaptiveSampler实现了一个简单的自适应采样算法,试图通过在图像比较复杂的区域增加采样来生成更加有效的高质量的图像。回想采样器和主要的渲染循环的相互关系:

1.渲染循环调用Sampler::GetMoreSamples()来采集采样点。

          2. SamplerRendererTask计算相应光线的辐射亮度值。

          3.采样点、辐射亮度、以及焦点信息传回Sampler::ReportResults()

          4.基于ReportResults()返回的布尔变量的值,SamplerRendererTask要么为准备新的采样丢弃这些采样点,要么将这些作为最后的结果传递给Film作为最后的图像结果。

这个相互作用允许采样器检查收集采样点的结果,来决定在合适的时候采集更多的采样点。这个值传递给ReportResults()可以通过各种各样的方式来做决定。

对于自适应采样的第一个难点是找到一个好的标准来决定在什么时候采样更多的点。这个难点是采样器的信息很受限制:通常,采样器能够利用的只有一系列的采样点的值,没有关于图像另外区域的信息。AdaptiveSampler,定义在samplers/adaptive.hsamplers/adaptive.cpp文件中,支持两种细化标准。第一种是基于检查是否不同的形状与不同的采样点相交,这个就表明物体在几何上可能不连续,第二种方法是检查不同的采样点的颜色是否有着很大的差异。


       AdaptiveSampler的构造函数在这里没有包含,它主要的任务是初始化下面的变量。像本章大多数其它的采样器一样,它跟踪当前采样在(xPos,yPos)。它最少生成minSamples,但是在扩展每个像素的时候可能生成maxSamples个采样。缓冲器sampleBuf通常在生成采样点的时候用来暂时储存采样点。枚举变量用来表示哪一种细化方案被采用。最后,supersamplePixel表明当前像素是否需要额外的采样点,它被初始化为false

GetSubSampler(), RoundSize(), MaxmimumSampleCount()在本质上是和低差采样器一样的。

除了记录当前被采样的像素点,AdaptiveSampler在变量AdaptiveSampler::supersamplePixel中也携带反射的状态,用来表示是否需要额外的采样。GetMoreSamples()ReportResults()函数的相互作用设置如下:

初始化:supersamplePixel初始化为falseGetMoreSamples()为当前像素初始化为minSamples个采样点。渲染循环评估这些采样点并且给ReportResults()一个反馈。如果需要更多的采样点,ReportResults()supersamplePixel设置为true,并且当前位置(xPos,yPos)不变。因此,接下来调用GetMoreSamples()将会生成一系列新的采样点maxSamples,当这些采样点提供给ReportResults()时,supersamplePixel复位为false,并且当前像素完成。

如果在初始化之后不需要更多的采样,ReportResults()supersamplePixel复位为false,然后和其他采样器一样接着往下。

     除了在(xPos,yPos)supersamplePixel保持适当的状态,ReportResults()函数大量的工作通过公用函数needsSupersampling()来完成。

     正如上面所说的那样,AdaptiveSampler支持两种不同的标准来决定什么时候来选取更多的采样点,枚举变量method用来表明哪种方法被选用。

    一个简单的测试可以表明,如果与光线相交的物体模ID不同,如果一些光线相交于不同的模型,这就可以表明是像素的边缘,因此更多的采样就很有必要。

   这个测试有几分的效果,但是对一些重要的情况就不行了。例如,物体可能拥有不同的模型id,但是没有几何边缘需要额外的采样(比如两个拥有相同材质共面的并且还共用一边的三角形)。还有一种情况,比如一些参数模型,能够折叠并且本身有就很多的边缘,这就需要采取更多的采样点。这个标准也不能够捕获图像的不连续函数,由于清晰的阴影边界,这就会引起图像的走样。

    一个不同的标准可以改善上面的一些不足,通过对比计算采样点辐射颜色的不同。如果对比很明显,我们就认为这个像素需要增加采样。这里,所有采样的平均值亮度值存储在变量Lavg里,接着就是对比每个采样点的亮度值和平均亮度值的差别。如果差值在设定的阈值之上,那么就需要更多的采样点。

    这个方法也不是总是成功,一个特别的问题来自于纹理和高频滤波器为了避免走样的值的相互作用。对于一个复杂的纹理函数,对比的衡量标准可能会认为需要更多的采样,即使图像可能不会走样。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-4-24 19:14 , Processed in 0.030698 second(s), 15 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部