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
Title: Hands-On Rust (Chapter 11: prefab)
Just played a couple of amulet-less games. With a bit of debugging, I believe that your can_p...
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
Title: Web Development with Clojure, Third Edition, vB17.0 (p9)
The create table guestbook syntax suggested doesn’t seem to be accepted ...
New
When I run the coverage example to report on missing lines, I get:
pytest --cov=cards --report=term-missing ch7
ERROR: usage: pytest [op...
New
Is the book’s epub format available to read on Google Play Books?
New
Title: Agile Web Development with Rails 7: (page 70)
I am running windows 11 pro with rails 7.0.3 and ruby 3.1.2p20 (2022-04-12 revision...
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
Docker-Machine became part of the Docker Toolbox, which was deprecated in 2020, long after Docker Desktop supported Docker Engine nativel...
New
From page 13:
On Python 3.7, you can install the libraries with pip by running these commands inside a Python venv using Visual Studio ...
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
Machine learning can be intimidating, with its reliance on math and algorithms that most programmers don't encounter in their regular wor...
New
I am thinking in building or buy a desktop computer for programing, both professionally and on my free time, and my choice of OS is Linux...
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
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
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
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
Leverage Elixir and the Nx ecosystem to build intelligent applications that solve real-world problems in computer vision, natural languag...
New
Categories:
Sub Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /python
- /js
- /rails
- /security
- /go
- /swift
- /vim
- /java
- /clojure
- /typescript
- /emacs
- /haskell
- /svelte
- /onivim
- /kotlin
- /react
- /c-plus-plus
- /crystal
- /tailwind
- /gleam
- /ocaml
- /elm
- /vscode
- /flutter
- /html
- /deepseek
- /ash
- /zig
- /opensuse
- /php
- /centos
- /react-native
- /scala
- /lisp
- /textmate
- /sublime-text
- /nixos
- /debian
- /deno
- /agda
- /django
- /nodejs
- /kubuntu
- /arch-linux
- /ubuntu
- /spring
- /revery
- /manjaro
- /quarkus
- /julia
- /diversity
- /lua
- /laravel










