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

jon
Some minor things in the paper edition that says “3 2020” on the title page verso, not mentioned in the book’s errata online: p. 186 But...
New
raul
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
AleksandrKudashkin
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
New
leonW
I ran this command after installing the sample application: $ cards add do something --owner Brian And got a file not found error: Fil...
New
brunogirin
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
brunogirin
When running tox for the first time, I got the following error: ERROR: InterpreterNotFound: python3.10 I realised that I was running ...
New
Keton
When running the program in chapter 8, “Implementing Combat”, the printout Health before attack was never printed so I assumed something ...
New
gorkaio
root_layout: {PentoWeb.LayoutView, :root}, This results in the following following error: no “root” html template defined for PentoWeb...
New
dachristenson
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 Top

ohm
Which, if any, games do you play? On what platform? I just bought (and completed) Minecraft Dungeons for my Nintendo Switch. Other than ...
New
AstonJ
Curious to know which languages and frameworks you’re all thinking about learning next :upside_down_face: Perhaps if there’s enough peop...
New
PragmaticBookshelf
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
New
Exadra37
Oh just spent so much time on this to discover now that RancherOS is in end of life but Rancher is refusing to mark the Github repo as su...
New
Maartz
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
AstonJ
If you get Can't find emacs in your PATH when trying to install Doom Emacs on your Mac you… just… need to install Emacs first! :lol: bre...
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
New
AstonJ
This is cool! DEEPSEEK-V3 ON M4 MAC: BLAZING FAST INFERENCE ON APPLE SILICON We just witnessed something incredible: the largest open-s...
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

Sub Categories: