diff --git a/out.jpg b/out.jpg index 870bea9..b65225c 100644 Binary files a/out.jpg and b/out.jpg differ diff --git a/tinyraytracer.cpp b/tinyraytracer.cpp index 477835e..0b0e42d 100644 --- a/tinyraytracer.cpp +++ b/tinyraytracer.cpp @@ -5,14 +5,48 @@ #include #include "geometry.h" -void render() { +struct Sphere { + Vec3f center; + float radius; + + Sphere(const Vec3f &c, const float &r) : center(c), radius(r) {} + + bool ray_intersect(const Vec3f &orig, const Vec3f &dir, float &t0) const { + Vec3f L = center - orig; + float tca = L*dir; + float d2 = L*L - tca*tca; + if (d2 > radius*radius) return false; + float thc = sqrtf(radius*radius - d2); + t0 = tca - thc; + float t1 = tca + thc; + if (t0 < 0) t0 = t1; + if (t0 < 0) return false; + return true; + } +}; + +Vec3f cast_ray(const Vec3f &orig, const Vec3f &dir, const Sphere &sphere) { + float sphere_dist = std::numeric_limits::max(); + if (!sphere.ray_intersect(orig, dir, sphere_dist)) { + return Vec3f(0.2, 0.7, 0.8); // background color + } + + return Vec3f(0.4, 0.4, 0.3); +} + +void render(const Sphere &sphere) { const int width = 1024; const int height = 768; + const int fov = M_PI/2.; std::vector framebuffer(width*height); + #pragma omp parallel for for (size_t j = 0; j