bri*_*rns 16
我从本页的一些信息中找到了它:http://cg.skeelogy.com/depth-of-field-using-raytracing/,特别是靠近底部的图表.我认为我做的与它的显示有点不同,但概念非常简单.
我可以解释一下发生了什么以及如何实现它的一般概念(我会尽量简明扼要).光线从所有方向(通常来说)的任何给定点反射,因此实际上并不是在渲染点和眼睛之间的单个光线,它是一个光锥离开渲染点并向眼睛扩展.您的眼睛/相机的镜头将倾向于弯曲这些光线,使锥体停止扩张并再次开始收缩.要使事物完全聚焦,锥体应收缩到视网膜/框架上的一个点,但这仅适用于距镜头一定距离的距离:参考页面中"焦平面"指示的距离(尽管我认为它应该是一个以眼睛为中心的球体,而不是一个平面.
对于焦平面前方的任何物体,光锥将更加弯曲:它将聚焦到视网膜/框架前方的一个点,然后再次开始扩展,所以当它到达框架时,它不再是一个点,但一个圆圈.类似地,对于焦平面后面的点,锥体将弯曲得更少,并且当它到达框架时将不会收敛到一个点.在这两种情况下,效果是单个点是场景最终被涂抹在多个像素上.
为了实现,您可以将这个想法转变为它的头部:不是将场景中的每个点渲染到几个像素,而是可以将几个附近的点渲染到单个像素,这当然是因为"涂抹"后会发生的事情. out"来自相邻点的光圈将最终重叠,因此每个光圈都有一个像素.
所以这就是我实现它的方式:
首先,定义一个光圈:眼睛上的平面区域中心,与视网膜/框架平行.光圈越大,DOF效果越明显.光圈通常只是圆形,在这种情况下,它很容易通过半径定义.其他形状可能导致不同的照明效果.
还定义了"焦距".我不认为这实际上是它的正确用语,但它是距离眼睛的距离,在这个距离上,事物将成为完美的焦点.
要渲染每个像素:
当然,每个像素使用的光线越多,质量就越好.我一直在使用每像素大约150条光线来获得不错但质量不高的光线.你可以看到效果很少(比如50或60条光线),但是更少的光线会在图像中产生颗粒感,特别是对于非常失焦的东西.您需要的光线数量也取决于光圈大小:较小的光圈不需要太多光线,但您不会获得尽可能多的模糊效果.
显然,你通过这样做大大增加了你的工作量,基本上将它乘以每个像素的光线数量,所以如果你在光线跟踪器中有任何优化,那么现在是一个好时机.如果您碰巧有多个处理器,那么好消息是,一旦找到像素的焦点,这就会令人尴尬地平行.
多一点解释
下面的图片可以让您了解正在发生的事情,以及为什么它与眼睛或相机中真正发生的事物等效.它显示了两个正在渲染的像素,一个像素用红色表示,另一个像素用蓝色表示.从眼睛穿过每个像素延伸到焦点"平面"的虚线是您在开始时投射的光线,以确定像素的焦点.半透明锥体指示可以随机选择以呈现每个像素的完整光线组(像素-1的红色圆锥,像素2的蓝色圆锥).请注意,由于所有光线都通过焦点,因此每个光锥会聚到精确位于焦点的点.
锥体的重叠区域表示场景中的点,这些点可能最终被渲染到像素-1和像素-2:换句话说,被抹掉.由于每个圆锥是焦点"平面"上的一个点,因此这里的圆锥之间没有重叠,因此此距离处的点仅渲染到单个像素:它们完全对焦.同时,越远离焦点"平面"(向前或向后)越远,锥体展开的越多,因此在任何给定点处锥体越多.因此,非常接近或非常远的点将倾向于渲染到大量不同的像素,因此它们将非常失焦.
