1 | float scale = tan(camera.fov * 0.5); |
刚开始看这段代码的时候,没有想清楚代码里预设的内容,也即成像平面的距离是1;这里面注意两个地方,成像平面(的距离,z方向的位移)上的点来确定光线的方向,以及对焦距离确定对焦点。
Near Plane(近平面) 是裁剪用的,距离相机很近(比如 0.01),比它更近的物体不渲染。在光栅化管线中有意义,在 path tracing 中通常不需要。
Image Plane(成像平面) 是你代码中构造 rayDir
的那个虚拟平面,距离相机为 1(因为 camera.forward
是单位向量,d.x 和 d.y
是在这个平面上的偏移)。它的作用是把像素坐标转换为光线方向,跟最终画面的”对焦”无关。
focalDist(对焦距离)
是摄影概念,表示相机到”焦平面”的距离。焦平面上的物体是完全清晰的,偏离焦平面越远的物体越模糊(景深效果)。这个值一般比较大,比如
5.0、10.0,取决于你想对焦到场景中多远的位置,是针对于场景中的距离的概念。focalPoint计算这句,是在相机空间下计算的,其参与finalRayDir的计算为什么没有带上camera.position,因为一加一减,就不需要了。