如何在Ray Tracer中实现景深?

sin*_*ner 4 c++ raytracing depth

有人可以帮我解决Ray Tracer中的景深实现吗?

我正在使用一个简单的针孔相机模型,如下所示.我需要知道如何使用针孔相机模型生成DOF效果?(图片来自维基百科)

在此输入图像描述

我的基本光线追踪器工作正常.

我注意(0,0,0,1)的方向为(dx,dy,1.0f,0.0f)其中

float dx =(x*(1.0/Imgwidth)) - 0.5;
float dy =(y*(1.0/Imgheight)) - 0.5;

现在我读到的所有地方都在讨论对应放置在图像平面和场景之间的镜头进行采样.例如如下所示(图片取自维基百科):

如果光线来自一个单点位置(相机或眼睛),如何在图像平面前引入镜头?

如果有人可以帮助,那就太好了!

谢谢

Ine*_*ion 12

有3种方法可以做到这一点:

  1. 物理上正确的DOF将需要场景的多次渲染.摄像机具有景深,因为它们实际上不是针孔模型.相反,它们具有允许光在一定直径内的光圈.这相当于采用针孔相机并在该光圈内拍摄大量照片并对其进行平均.

    所以基本上,你需要在焦点周围稍微旋转你的相机多次,渲染整个场景,在缓冲区中累积输出颜色,并将所有值除以渲染次数.

  2. 一个简单的后期处理效果 - 不仅渲染场景颜色,还渲染其深度,然后使用此深度来控制模糊效果强度.请注意,这是技术需要一些技巧来获得不同模糊级别的对象之间的无缝过渡.

  3. 更复杂的后处理效果 - 如前所述创建深度缓冲,然后使用它为原始场景的每个像素渲染孔径形状的粒子.使用深度来控制粒子大小就像使用它来模糊效果强度一样.

(1)给出最好的结果,但是最昂贵的技术; (2)最便宜,(3)相当棘手,但提供良好的成本效益平衡.