kporceil

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

kporceil

I solved it ! I just realized that I compute under_point before normal vector inversion.

Where Next?

Popular Pragmatic Bookshelf topics Top

yulkin
your book suggests to use Image.toByteData() to convert image to bytes, however I get the following error: "the getter ‘toByteData’ isn’t...
New
mikecargal
Title: Hands-on Rust: question about get_component (page 295) (feel free to respond. “You dug you’re own hole… good luck”) I have somet...
New
nicoatridge
Hi, I have just acquired Michael Fazio’s “Kotlin and Android Development” to learn about game programming for Android. I have a game in p...
New
jskubick
I found an issue in Chapter 7 regarding android:backgroundTint vs app:backgroundTint. How to replicate: load chapter-7 from zipfile i...
New
brunogirin
When trying to run tox in parallel as explained on page 151, I got the following error: tox: error: argument -p/–parallel: expected one...
New
akraut
The markup used to display the uploaded image results in a Phoenix.LiveView.HTMLTokenizer.ParseError error. lib/pento_web/live/product_l...
New
jwandekoken
Book: Programming Phoenix LiveView, page 142 (157/378), file lib/pento_web/live/product_live/form_component.ex, in the function below: d...
New
andreheijstek
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
bjnord
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
mcpierce
@mfazio23 I’ve applied the changes from Chapter 5 of the book and everything builds correctly and runs. But, when I try to start a game,...
New

Other popular topics Top

New
dasdom
No chair. I have a standing desk. This post was split into a dedicated thread from our thread about chairs :slight_smile:
New
PragmaticBookshelf
Design and develop sophisticated 2D games that are as much fun to make as they are to play. From particle effects and pathfinding to soci...
New
dimitarvp
Small essay with thoughts on macOS vs. Linux: I know @Exadra37 is just waiting around the corner to scream at me “I TOLD YOU SO!!!” but I...
New
PragmaticBookshelf
Author Spotlight Mike Riley @mriley This month, we turn the spotlight on Mike Riley, author of Portable Python Projects. Mike’s book ...
New
First poster: bot
zig/http.zig at 7cf2cbb33ef34c1d211135f56d30fe23b6cacd42 · ziglang/zig. General-purpose programming language and toolchain for maintaini...
New
First poster: AstonJ
Jan | Rethink the Computer. Jan turns your computer into an AI machine by running LLMs locally on your computer. It’s a privacy-focus, l...
New
PragmaticBookshelf
Overarching tutorial for Python beginner and intermediate developers that teaches web development with the Flask framework. Miguel Gr...
New
NewsBot
Node.js v22.14.0 has been released. Link: Release 2025-02-11, Version 22.14.0 'Jod' (LTS), @aduh95 · nodejs/node · GitHub
New
pragdave
Build robust LLM-powered apps, chatbots, and agents while mastering AI engineering principles that will help you outlast the tools and th...
New

Sub Categories: