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
page 37
ANTLRInputStream input = new ANTLRInputStream(is);
as of ANTLR 4 .8 should be:
CharStream stream = CharStreams.fromStream(i...
New
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
Hi everyone!
There is an error on the page 71 in the book “Programming machine learning from coding to depp learning” P. Perrotta. You c...
New
Hi @Margaret ,
On page VII the book tells us the example and snippets will be all using Elixir version 1.11
But on page 3 almost the en...
New
Page 28: It implements io.ReaderAt on the store type.
Sorry if it’s a dumb question but was the io.ReaderAt supposed to be io.ReadAt?
...
New
I ran this command after installing the sample application:
$ cards add do something --owner Brian
And got a file not found error:
Fil...
New
@noelrappin
Running the webpack dev server, I receive the following warning:
ERROR in tsconfig.json
TS18003: No inputs were found in c...
New
On page 78 the following code appears:
<%= link_to ‘Destroy’, product,
class: ‘hover:underline’,
method: :delete,
data: { confirm...
New
I’m a newbie to Rails 7 and have hit an issue with the bin/Dev script mentioned on pages 112-113.
Iteration A1 - Seeing the list of prod...
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
New
I’m thinking of buying a monitor that I can rotate to use as a vertical monitor?
Also, I want to know if someone is using it for program...
New
I ended up cancelling my Moonlander order as I think it’s just going to be a bit too bulky for me.
I think the Planck and the Preonic (o...
New
The V Programming Language
Simple language for building maintainable programs
V is already mentioned couple of times in the forum, but I...
New
Hello everyone! This thread is to tell you about what authors from The Pragmatic Bookshelf are writing on Medium.
New
Use WebRTC to build web applications that stream media and data in real time directly from one user to another, all in the browser.
...
New
Hi folks,
I don’t know if I saw this here but, here’s a new programming language, called Roc
Reminds me a bit of Elm and thus Haskell. ...
New
Author Spotlight
Mike Riley
@mriley
This month, we turn the spotlight on Mike Riley, author of Portable Python Projects. Mike’s book ...
New
New
Will Swifties’ war on AI fakes spark a deepfake porn reckoning?
New
Categories:
Sub Categories:
Popular Portals
- /elixir
- /rust
- /ruby
- /wasm
- /erlang
- /phoenix
- /keyboards
- /python
- /js
- /rails
- /security
- /go
- /swift
- /vim
- /clojure
- /emacs
- /haskell
- /java
- /svelte
- /onivim
- /typescript
- /kotlin
- /c-plus-plus
- /crystal
- /tailwind
- /react
- /gleam
- /ocaml
- /elm
- /flutter
- /vscode
- /ash
- /html
- /opensuse
- /centos
- /zig
- /deepseek
- /php
- /scala
- /textmate
- /lisp
- /react-native
- /sublime-text
- /debian
- /nixos
- /agda
- /kubuntu
- /arch-linux
- /django
- /deno
- /revery
- /nodejs
- /ubuntu
- /spring
- /manjaro
- /diversity
- /lua
- /julia
- /markdown
- /c









