C 光线跟踪器灯光漫反射问题
我写了光扩散代码,但它不起作用,我不知道为什么 这是我为扩散编写的代码C 光线跟踪器灯光漫反射问题,c,opengl,raytracing,C,Opengl,Raytracing,我写了光扩散代码,但它不起作用,我不知道为什么 这是我为扩散编写的代码 t_vec pi = vec_add(ray.org,vec_times_double(ray.dir, t)); t_vec hp = vec_diff(light.pos, pi); t_vec normal = get_sphers_normal(sp, pi); double dot = vec_dot(normalize
t_vec pi = vec_add(ray.org,vec_times_double(ray.dir, t));
t_vec hp = vec_diff(light.pos, pi);
t_vec normal = get_sphers_normal(sp, pi);
double dot = vec_dot(normalize_vect(normal),normalize_vect(hp));
printf("hitpoint : %lf\n", dot);
put_pixel(mlx.img, x, y, rgb_to_int(sp.color)*double_abs(dot), resolution.width);
在这一行中:
put_pixel(mlx.img, x, y, rgb_to_int(sp.color)*double_abs(dot), resolution.width);
^-----------------------------------
你好像在用一个整数乘以一个双精度。我假设put\u pixel
需要一个32位整数编码RGB颜色,在这种情况下,您的双精度将转换回int,但以一种没有意义的方式,给出这些色带。例如,如果sp.color={255,0,0.}
是一个红色表面,rgb___int
将其转换为0xff0000
,将其乘以0.00390625
(光线暗淡的表面)并转换回int
得到0x00ff00
,它是亮绿色而不是暗红色
您应该在参数torgb_to_int
上使用向量乘以标量函数:
rgb_to_int(vec_times_double(sp.color, double_abs(dot)))
这里我假设
sp.color
是t\u vec
类型。如果没有,则相应地调整代码。您好,尽管我认为我发现了您的问题(请参见下面的答案),但我强烈建议至少包含相关函数的声明。更妙的是,发一个帖子。