aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian T <julian@jtle.dk>2020-03-09 23:29:16 +0100
committerJulian T <julian@jtle.dk>2020-03-09 23:29:16 +0100
commit1f61a690ac1c1ec1b9b15b358925abbd29c487c6 (patch)
tree8e43bc06289472d2e110687e2835da165badadb2
parentc94c3930af8c81568be50bdfaaac321b99e296d7 (diff)
Added anti aliasing
-rw-r--r--main.c2
-rw-r--r--ray.c37
-rw-r--r--ray.h2
-rw-r--r--test.pngbin55642 -> 60983 bytes
4 files changed, 34 insertions, 7 deletions
diff --git a/main.c b/main.c
index cd66dee..d1b8080 100644
--- a/main.c
+++ b/main.c
@@ -61,7 +61,7 @@ int main()
pgm_write_header(stdout, TESTW, TESTH);
for (int y = TESTH; y; y--) {
for (int x = TESTW; x; x--) {
- color_t *c = ray_trace(&s, x, y);
+ color_t *c = ray_trace(&s, x, y, 8);
if (c) {
pgm_write_pixel(stdout, c);
diff --git a/ray.c b/ray.c
index 35ec5b1..e91d7e1 100644
--- a/ray.c
+++ b/ray.c
@@ -235,19 +235,46 @@ exit:
return 0;
}
-color_t *ray_trace(space_t *s, unsigned int x, unsigned int y)
+color_t *ray_trace(space_t *s, unsigned int x, unsigned int y, unsigned samples)
{
// Init return color. Will be accumilated with all the detected light.
- color_t *c = color_set(NULL, s->ambient.r, s->ambient.g, s->ambient.b);
+ color_t *c = color_set(NULL, 0, 0, 0);
// Setup primary ray
ray_t r;
r.start = &s->view.position;
r.direction = vector_copy(NULL, NULL);
- viewpoint_ray(&s->view, r.direction, x, y);
- // Run the recursive ray trace
- ray_trace_recur(s, c, &r, 0, 1);
+ // Multiple samples for antialias
+ // TODO better distribution of antialias probes
+ for (int i = 0; i < samples; i++) {
+ color_t ctmp;
+ color_set(&ctmp, 0, 0, 0);
+ //memset(&ctmp, 0, sizeof(color_t));
+
+ // Multiple samples inside same pixel
+ COORD_T tmp = (COORD_T) i/ (COORD_T) samples;
+ viewpoint_ray(&s->view, r.direction, x + tmp, y + tmp);
+
+ // Run the recursive ray trace
+ ray_trace_recur(s, &ctmp, &r, 0, 1);
+
+ // Color_add will not go above 1. In this case we don't want that.
+ c->r += ctmp.r; c->g += ctmp.g; c->b += ctmp.b;
+
+ }
+ //printf("COlor before devide %f, %f, %f\n", c->r, c->g, c->b);
+
+ free(r.direction);
+
+ // Take the median
+ if (samples > 1) {
+ // Same as deviding by samples
+ color_scale(c, c, 1.0/ (COORD_T) samples);
+ }
+
+ // Add ambient
+ color_add(c, c, &s->ambient);
return c;
}
diff --git a/ray.h b/ray.h
index 208dcfc..74749ff 100644
--- a/ray.h
+++ b/ray.h
@@ -17,6 +17,6 @@ COORD_T ray_intersect_sphere(sphere_t *s, ray_t *ray, bool skip_dist);
COORD_T ray_intersect_plane(plane_t *p, ray_t *ray, bool skip_dist);
object_t *ray_cast(space_t *s, ray_t *r, COORD_T *dist_ret, bool chk, COORD_T chk_dist);
-color_t *ray_trace(space_t *s, unsigned int x, unsigned int y);
+color_t *ray_trace(space_t *s, unsigned int x, unsigned int y, unsigned samples);
#endif
diff --git a/test.png b/test.png
index 7d814b7..03b64fb 100644
--- a/test.png
+++ b/test.png
Binary files differ