0%

近平面焦平面成像平面

1
2
3
4
5
6
7
8
9
10
11
12
float scale = tan(camera.fov * 0.5);
d.y *= resolution.y / resolution.x * scale;
d.x *= scale;
vec3 rayDir = normalize(d.x * camera.right + d.y * camera.up + camera.forward);

vec3 focalPoint = camera.focalDist * rayDir;
float cam_r1 = rand() * TWO_PI;
float cam_r2 = rand() * camera.aperture;
vec3 randomAperturePos = (cos(cam_r1) * camera.right + sin(cam_r1) * camera.up) * sqrt(cam_r2);
vec3 finalRayDir = normalize(focalPoint - randomAperturePos);

Ray ray = Ray(camera.position + randomAperturePos, finalRayDir);

刚开始看这段代码的时候,没有想清楚代码里预设的内容,也即成像平面的距离是1;这里面注意两个地方,成像平面(的距离,z方向的位移)上的点来确定光线的方向,以及对焦距离确定对焦点。

Near Plane(近平面) 是裁剪用的,距离相机很近(比如 0.01),比它更近的物体不渲染。在光栅化管线中有意义,在 path tracing 中通常不需要。

Image Plane(成像平面) 是你代码中构造 rayDir 的那个虚拟平面,距离相机为 1(因为 camera.forward 是单位向量,d.xd.y 是在这个平面上的偏移)。它的作用是把像素坐标转换为光线方向,跟最终画面的”对焦”无关。

focalDist(对焦距离) 是摄影概念,表示相机到”焦平面”的距离。焦平面上的物体是完全清晰的,偏离焦平面越远的物体越模糊(景深效果)。这个值一般比较大,比如 5.0、10.0,取决于你想对焦到场景中多远的位置,是针对于场景中的距离的概念。focalPoint计算这句,是在相机空间下计算的,其参与finalRayDir的计算为什么没有带上camera.position,因为一加一减,就不需要了。

×