Defocus blur
This commit is contained in:
parent
01d3166ae2
commit
bc35873a48
3 changed files with 45 additions and 23 deletions
|
@ -5,34 +5,42 @@
|
|||
|
||||
class camera {
|
||||
public:
|
||||
camera(point3 lookfrom, point3 lookat, vec3 vup, double vfov /*vertical field-of-view in degrees*/,
|
||||
double aspect_ratio) {
|
||||
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;
|
||||
auto theta = degrees_to_radians(vfov);
|
||||
auto h = tan(theta / 2);
|
||||
auto viewport_height = 2.0 * h;
|
||||
auto viewport_width = aspect_ratio * viewport_height;
|
||||
|
||||
auto w = unit_vector(lookfrom - lookat);
|
||||
auto u = unit_vector(cross(vup, w));
|
||||
auto v = cross(w, u);
|
||||
w = unit_vector(lookfrom - lookat);
|
||||
u = unit_vector(cross(vup, w));
|
||||
v = cross(w, u);
|
||||
|
||||
origin = lookfrom;
|
||||
horizontal = viewport_width * u;
|
||||
vertical = viewport_height * v;
|
||||
lower_left_corner = origin - horizontal/2 - vertical/2 - w;
|
||||
}
|
||||
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;
|
||||
|
||||
ray get_ray(double s, double t) const {
|
||||
return ray(origin,
|
||||
lower_left_corner + s*horizontal + t*vertical - origin);
|
||||
}
|
||||
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;
|
||||
point3 origin;
|
||||
point3 lower_left_corner;
|
||||
vec3 horizontal;
|
||||
vec3 vertical;
|
||||
vec3 u, v, w;
|
||||
double lens_radius;
|
||||
};
|
||||
|
||||
#endif // CAMERA_H_
|
||||
|
|
|
@ -59,7 +59,12 @@ int main() {
|
|||
|
||||
// Camera
|
||||
|
||||
camera cam(point3(-2,2,1), point3(0,0,-1), vec3(0,1,0), 90, aspect_ratio);
|
||||
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);
|
||||
|
||||
// Render
|
||||
|
||||
|
|
|
@ -131,4 +131,13 @@ vec3 refract(const vec3 &v, const vec3 &n, double etai_over_etat) {
|
|||
return r_out_perp + r_out_parallel;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // RTIWW_VEC3_H
|
||||
|
|
Loading…
Reference in a new issue