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
Title: Design and Build Great Web APIs - typo “https://company-atk.herokuapp.com/2258ie4t68jv” (page 19, third bullet in URL list)
Typo:...
New
Title: Web Development with Clojure, Third Edition, pg 116
Hi - I just started chapter 5 and I am stuck on page 116 while trying to star...
New
On the page xv there is an instruction to run bin/setup from the main folder. I downloaded the source code today (12/03/21) and can’t see...
New
When trying to generate the protobuf .go file, I receive this error:
Unknown flag: --go_opt
libprotoc 3.12.3
MacOS 11.3.1
Googling ...
New
When running tox for the first time, I got the following error:
ERROR: InterpreterNotFound: python3.10
I realised that I was running ...
New
Is the book’s epub format available to read on Google Play Books?
New
Hey there,
I’m enjoying this book and have learned a few things alredayd. However, in Chapter 4 I believe we are meant to see the “>...
New
Modern front-end development for Rails, second edition - Struggling to get the first chapter to work
After running /bin/setup, the first error was: The foreman' command exists in these Ruby versions: That was easy to fix: gem install fore...
New
When running the program in chapter 8, “Implementing Combat”, the printout Health before attack was never printed so I assumed something ...
New
Hello @herbert ! Trying to get the very first “Hello, Bracket Terminal!" example to run (p. 53). I develop on an Amazon EC2 instance runn...
New
Other popular topics
If it’s a mechanical keyboard, which switches do you have?
Would you recommend it? Why?
What will your next keyboard be?
Pics always w...
New
Please tell us what is your preferred monitor setup for programming(not gaming) and why you have chosen it.
Does your monitor have eye p...
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
New
Learn different ways of writing concurrent code in Elixir and increase your application's performance, without sacrificing scalability or...
New
The V Programming Language
Simple language for building maintainable programs
V is already mentioned couple of times in the forum, but I...
New
I am trying to crate a game for the Nintendo switch, I wanted to use Java as I am comfortable with that programming language. Can you use...
New
Author Spotlight:
VM Brasseur
@vmbrasseur
We have a treat for you today! We turn the spotlight onto Open Source as we sit down with V...
New
This is cool!
DEEPSEEK-V3 ON M4 MAC: BLAZING FAST INFERENCE ON APPLE SILICON
We just witnessed something incredible: the largest open-s...
New
Node.js v22.14.0 has been released.
Link: Release 2025-02-11, Version 22.14.0 'Jod' (LTS), @aduh95 · nodejs/node · GitHub
New
Categories:
Sub Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /python
- /js
- /rails
- /security
- /go
- /swift
- /vim
- /java
- /clojure
- /emacs
- /haskell
- /typescript
- /svelte
- /onivim
- /kotlin
- /c-plus-plus
- /crystal
- /tailwind
- /react
- /gleam
- /ocaml
- /elm
- /vscode
- /flutter
- /html
- /ash
- /deepseek
- /zig
- /opensuse
- /centos
- /php
- /scala
- /react-native
- /lisp
- /sublime-text
- /textmate
- /nixos
- /debian
- /agda
- /deno
- /django
- /kubuntu
- /nodejs
- /arch-linux
- /spring
- /ubuntu
- /revery
- /manjaro
- /lua
- /julia
- /diversity
- /quarkus
- /laravel










