PBRT学习笔记:光线跟踪中的景深算法

景深是人眼视觉系统中的一种自然现象。同样,相机里面也有景深的效果,这是由于相机的成像光圈的半径是有一定大小的,从而导致了成相平面中的某些点可以‘看到’镜头外面的一部分场景,而这些场景的共同作用,导致了一种模糊现象。

景深的效果在计算机图形学中被应用广泛,电影,游戏里面经常会利用景深特效来强调画面重点。相应的,已经有了很多成熟的算法在不同的渲染方法上,光栅化可以很高效的实现景深的算法。而本文将简单介绍景深效果在光线跟踪中的实现,以及一些基本原理。

首先,看看景深效果是什么样子,让我们对他有个直观的印象:


这个是经常被用来做试验的toasters场景,场景中,中间的toaster没有被模糊,而其余的toaster根据与视点的距离有着不同程度的模糊。下面我们将简单的介绍一下这种算法是如何实现的。


如果成像平面上有一点p0,p0可以向光圈发射无数条光线(因为光圈是有大小的,它不是一个理想的点),而这些光线透过光圈后,会在焦距平面相交(这个过程可以通过一些运算推导出来)。如果场景中刚好有一个物体在这里挡住了视线,这个p0所能看到的就是一个清晰的点,而这种情况的概率很小,所以这些光线更可能是在其他东西相交。而似乎从这个理论上来说,所有物体都应该被模糊了,只是程度不同。反过来思考,上图中,p1和p2两点透过光圈在成相平面上投影了不同的形状,其中p2的投影刚好是一个点,而p1由于距离焦距比较远,从而在成像平面上影射出了一块区域。由于计算机是利用有限资源来进行计算,所以实际上我们在屏幕上看到的图片是由一个一个像素所组成的。如果上述p1’所成像的区域小于一个像素的区域,从而它就不会被模糊,或者说它虽然被模糊了,但是由于计算机中的图片表现形式,这种模糊是无法表现出来的,所以可以认为是没有模糊的。那么焦距实际就不是一个平面了,而是距离平面一定范围的一段空间,在这个空间里面的物体会被清晰的呈现,而外面的物体则会不同程度的模糊。物体模糊的程度是有物体与focal plane的距离和光圈大小共同决定的。

上面简单描述了一下景深形成的基本原理,下面将介绍一下这个算法如何应用到光线跟踪算法中。


上述模型中,我们抛开从成像平面到镜头的光线投射过程。在一个没有景深效果的ray tracer里面,光圈的形状被定义为了一个点,即大小为0。所有一级光线都是从光圈所在点,即视点,出发的。为了模拟景深效果,我们首先要赋予光圈一定的大小。当光圈有了一定的面积后,我们可以在光圈上随机的取一点,而并不一定是光圈的中心(没有DOF效果的ray tracer的视点)。本文中的采样是在光圈上完全随机的采样,貌似PBRT采用了更复杂的算法进行采样。

一级光线的original point是可以按照上述办法搞定的,但是问题在于光线的方向是如何计算的。理论上来讲,可以按照光线以及一些镜头参数根据snell定律计算,但是这个过程复杂而且运算效率很低,所以一般都是通过其他办法来避免。事实上,通过光圈任何一点,折射出的一级光线都是在focal plane处相交的。我们已经确定了一级光线的原点,只要在找到光线上的一点,我们就可以确定光线的方向。所以我们只需要找到任何一个光线与focal plane的交点,即可以确定该光线的方向。为了简化,这里我们利用经过光圈中心的光线来找到与focal plane的交点,因为这个光线是不需要进行折射计算的,相对来说简单很多。

在光线跟踪算法中,只需要改变一级光线就可以生成景深效果了,所以景深效果在PBRT中的实现是放在Camera的类中的,它作为projective camera的一个基本功能存在,和其他计算模块关系相对较远。当然我们需要为每个象素多采样,才能够达到更好的效果。


左图是每个点采样一次,自然会有一些噪音。而右边的图片,每个象素采样了128次,基本上可以满足视觉要求。

本文简单介绍了一下景深效果的基本原理以及光线跟踪中的模拟方法,但是这种方法虽然可以生成带有景深效果的图片,效率却随着采样率有着严格的线形的下降。

版权声明:本文为CSDN博主(https://blog.csdn.net/codeboycjy)原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/codeboycjy/article/details/6159648

最新文章