kporceil
The Ray Tracer Challenge: refraction issue: passed all the tests but at the render it doesnt work like expected
Hello,
first of all, thanks for the book, it helped me a lot.
I just encountered an issue with the refraction, i have implemented the tests and made them all pass, but when i want to render with refraction, the render is not really what i think it should be.
Here some picture :
the yellow sphere have a transparancy of 1 and a refractive_index of 1
here is my main code :
int main(void)
{
t_world world = world_create();
world.lights_count = 1;
world.objs_count = 6;
world.objs = malloc(sizeof(t_shape) * world.objs_count);
world.lights = malloc(sizeof(t_plight) * world.lights_count);
world.objs[0] = sphere(0);
world.objs[0].material.pat = pattern(GRADIENT, color(0.1, 0.5, 1), color(0.1, 1, 0.5));
pattern_set_transform(&world.objs[0].material.pat, matrix_mult(matrix_translation(-1, 0, 0), matrix_scaling(2, 2, 2)));
world.objs[0].material.color = color(0.1, 1, 0.5);
world.objs[0].material.diffuse = 0.7;
world.objs[0].material.specular = 0.3;
shape_set_matrix(world.objs, matrix_translation(-0.5, 1, 0.5));
world.objs[1] = sphere(1);
world.objs[1].material.color = color(0.5, 1, 0.1);
world.objs[1].material.diffuse = 0.7;
world.objs[1].material.specular = 0.3;
shape_set_matrix(world.objs + 1, matrix_mult(matrix_translation(1.2, 0.7, -0.5), matrix_scaling(0.7, 0.7, 0.7)));
world.objs[2] = sphere(2);
world.objs[2].material.transparency = 1;
world.objs[2].material.refractive_index = 1;
world.objs[2].material.color = color(1, 0.8, 0.1);
world.objs[2].material.diffuse = 0.7;
world.objs[2].material.specular = 0.3;
shape_set_matrix(world.objs + 2, matrix_mult(matrix_translation(-1.5, 0.33, -0.75), matrix_scaling(0.33, 0.33, 0.33)));
world.objs[3] = plane(3);
world.objs[3].material.pat = pattern(CHECKER, color(0, 0, 0), color(1, 1, 1));
world.objs[3].material.color = color(0, 0, 0);
world.objs[4] = plane(4);
world.objs[4].material.color = color(0.7, 0.4, 0.3);
world.objs[4].material.ambient = 0.6;
shape_set_matrix(world.objs + 4, matrix_mult(matrix_translation(0, 0, 12), matrix_mult(matrix_y_rotation(-(M_PI/12)), matrix_z_rotation(M_PI/2))));
world.objs[5] = plane(5);
world.objs[5].material.color = color(0.2, 0.6, 0.4);
world.objs[5].material.ambient = 0.6;
shape_set_matrix(world.objs + 5, matrix_mult(matrix_translation(-3, 0, 0), matrix_mult(matrix_y_rotation(M_PI/12), matrix_z_rotation(M_PI/2))));
world.lights[0] = point_light(point(-2, 10, -5), color(1, 1, 1));
t_camera cam = camera(1920, 1080, M_PI / 2);
camera_set_transform(&cam, view_transform(point(0, 1, -7), point(0, 1, 0), vector(0, 1, 0)));
t_canva image = render(cam, world);
if (!image.canva)
return (1);
(void)image;
char *ppm = canva_to_ppm(image);
write_file("render/test.ppm", ppm);
free(ppm);
free(image.canva);
free(world.objs);
free(world.lights);
}
Here my refracted_color function :
t_color refracted_color(t_world world, t_precomp comps, size_t remaining)
{
double n_ratio;
double cos_i;
double cos_t;
double sin2_t;
t_color c;
if (comps.obj->material.transparency == 0 || remaining == 0)
return (color(0, 0, 0));
n_ratio = comps.n1 / comps.n2;
cos_i = dot(comps.eyev, comps.normalv);
sin2_t = n_ratio * n_ratio * (1 - cos_i * cos_i);
if (sin2_t > 1)
return (color(0, 0, 0));
cos_t = sqrt(1.0 - sin2_t);
color_at(world, ray(comps.under_point, tuple_substract(tuple_scalar_mult
(comps.normalv, n_ratio * cos_i - cos_t), tuple_scalar_mult
(comps.eyev, n_ratio))), &c, remaining - 1);
return (color_scalar_mult(c, comps.obj->material.transparency));
}
I don’t really know how to get the refraction worked, if something can help please !
First Post!
kporceil
I solved it ! I just realized that I compute under_point before normal vector inversion.
Popular Pragmatic Bookshelf topics
Following the steps described in Chapter 6 of the book, I’m stuck with running the migration as described on page 84:
bundle exec sequel...
New
Title: Hands-On Rust (Chap 8 (Adding a Heads Up Display)
It looks like
.with_simple_console_no_bg(SCREEN_WIDTH*2, SCREEN_HEIGHT*2...
New
This isn’t directly about the book contents so maybe not the right forum…but in some of the code apps (e.g. turbo/06) it sends a TURBO_ST...
New
Hello! Thanks for the great book.
I was attempting the Trie (chap 17) exercises and for number 4 the solution provided for the autocorre...
New
@noelrappin
Running the webpack dev server, I receive the following warning:
ERROR in tsconfig.json
TS18003: No inputs were found in c...
New
I think I might have found a problem involving SwitchCompat, thumbTint, and trackTint.
As entered, the SwitchCompat changes color to hol...
New
Is the book’s epub format available to read on Google Play Books?
New
On page 78 the following code appears:
<%= link_to ‘Destroy’, product,
class: ‘hover:underline’,
method: :delete,
data: { confirm...
New
Docker-Machine became part of the Docker Toolbox, which was deprecated in 2020, long after Docker Desktop supported Docker Engine nativel...
New
I’ve got to the end of Ch. 11, and the app runs, with all tabs displaying what they should – at first. After switching around between St...
New
Other popular topics
Learn from the award-winning programming series that inspired the Elixir language, and go on a step-by-step journey through the most impo...
New
Curious to know which languages and frameworks you’re all thinking about learning next :upside_down_face:
Perhaps if there’s enough peop...
New
poll
poll
Be sure to check out @Dusty’s article posted here: An Introduction to Alternative Keyboard Layouts It’s one of the best write-...
New
From finance to artificial intelligence, genetic algorithms are a powerful tool with a wide array of applications. But you don't need an ...
New
This looks like a stunning keycap set :orange_heart:
A LEGENDARY KEYBOARD LIVES ON
When you bought an Apple Macintosh computer in the e...
New
Tailwind CSS is an exciting new CSS framework that allows you to design your site by composing simple utility classes to create complex e...
New
Hello everyone! This thread is to tell you about what authors from The Pragmatic Bookshelf are writing on Medium.
New
A few weeks ago I started using Warp a terminal written in rust. Though in it’s current state of development there are a few caveats (tab...
New
Rails 7 completely redefines what it means to produce fantastic user experiences and provides a way to achieve all the benefits of single...
New
If you want a quick and easy way to block any website on your Mac using Little Snitch simply…
File > New Rule:
And select Deny, O...
New
Categories:
Sub Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /python
- /js
- /rails
- /security
- /go
- /swift
- /vim
- /clojure
- /java
- /emacs
- /haskell
- /svelte
- /typescript
- /onivim
- /kotlin
- /c-plus-plus
- /crystal
- /tailwind
- /react
- /gleam
- /ocaml
- /elm
- /flutter
- /ash
- /vscode
- /html
- /opensuse
- /zig
- /deepseek
- /centos
- /php
- /scala
- /react-native
- /lisp
- /sublime-text
- /textmate
- /nixos
- /debian
- /agda
- /deno
- /django
- /kubuntu
- /arch-linux
- /nodejs
- /spring
- /revery
- /ubuntu
- /manjaro
- /julia
- /lua
- /diversity
- /markdown
- /slackware










