[42cursurs]Ray Tracing in One Weekend 12-Defocus Blur
마지막 기능으로 Blur 효과를 만들어 보자. Blur는 이미지를 흐리게 하는 효과다. 원문은 반영하고자하는 현실의 카메라에서 일어나는 현상을 설명한다. 하지만 저걸 다 구현할 게 아니므로 목표인 Blur를 위해 필요한 것만 챙기자.
- Blur, 즉 이미지를 흐릿하게하는 효과를 구현할 거다.
- Blur를 구현하기 위해 현실의 카메라 구조 일부를 구현한다.
A Thin Lens Approximation
실제 카메라 모델의 이미지다. 우리는 저기서 필요한 일부만 채용한다.
아래의 이미지처럼 구현할 거다.

Blur효과 자체는 결국 이미지가 흐릿하게 보이면 된다.
1. 고정되있던 광원을 lens에서 빛을 쏘는 것처럼 일정범위에서 무작위로 선정해서 광선을 쏜다.
2. 광선의 방향 벡터는 같으니 광원을 고정했을 때 닿았을 지점의 근방의 어뚱한 지점에 닿게 된다.
3. 이렇게 어뚱한 지점에 닿는 경우와 원래 닿았을 사물의 색상을 칠하는 경우가 섞이면 모자이크 처럼 이미지가 흐릿해진다.
우리는 이 아이디어로 Blur효과를 구현할 것이다.
Generating Sample Rays
Blur를 위해 무작위로 광원을 변경하는 반경이 넓을수록 Blur를 강하게 줄 수 있다.
vec3.h
vec3 random_in_unit_disk() {
while (true) {
auto p = vec3(random_double(-1,1), random_double(-1,1), 0);
if (p.length_squared() >= 1) continue;
return p;
}
}
camera.h
class camera {
public:
camera(
point3 lookfrom,
point3 lookat,
vec3 vup,
double vfov, // vertical field-of-view in degrees
double aspect_ratio,
double aperture,
double focus_dist
) {
auto theta = degrees_to_radians(vfov);
auto h = tan(theta/2);
auto viewport_height = 2.0 * h;
auto viewport_width = aspect_ratio * viewport_height;
w = unit_vector(lookfrom - lookat);
u = unit_vector(cross(vup, w));
v = cross(w, u);
origin = lookfrom;
horizontal = focus_dist * viewport_width * u;
vertical = focus_dist * viewport_height * v;
lower_left_corner = origin - horizontal/2 - vertical/2 - focus_dist*w;
lens_radius = aperture / 2;
}
ray get_ray(double s, double t) const {
vec3 rd = lens_radius * random_in_unit_disk();
vec3 offset = u * rd.x() + v * rd.y();
return ray(
origin + offset,
lower_left_corner + s*horizontal + t*vertical - origin - offset
);
}
private:
point3 origin;
point3 lower_left_corner;
vec3 horizontal;
vec3 vertical;
vec3 u, v, w;
double lens_radius;
};
main.cc
point3 lookfrom(3,3,2);
point3 lookat(0,0,-1);
vec3 vup(0,1,0);
auto dist_to_focus = (lookfrom-lookat).length();
auto aperture = 2.0;
camera cam(lookfrom, lookat, vup, 20, aspect_ratio, aperture, dist_to_focus);
아래와 같은 이미지를 출력한다. Blur효과는 뷰포트에 가까울수록 Blur효과가 약하게 난다. 사물이 뷰포트에 가까울수록 광선이 무작위로 생성된 전후에 닿은 사물의 오차가 적기 때문이다.
Author And Source
이 문제에 관하여([42cursurs]Ray Tracing in One Weekend 12-Defocus Blur), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sayi/42cursursRay-Tracing-in-One-Weekend-12-Defocus-Blur저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)