具有光线跟踪光扩散的问题

问题描述 投票:-1回答:1

我编写了光扩散代码,但不起作用,我不知道为什么

这是我编写的用于扩散的代码

            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);

this is the result I got

c opengl raytracing
1个回答
0
投票

在此行:

 put_pixel(mlx.img, x, y, rgb_to_int(sp.color)*double_abs(dot), resolution.width);
                          ^-----------------------------------

您似乎是将整数乘以双精度。我假设put_pixel需要一个32位整数,用于编码RGB颜色,在这种情况下,您的double会转换回int,但以无意义的方式给出了这些色带。例如,如果sp.color = { 255., 0., 0. }是红色表面,则rgb_to_int将其转换为0xff0000,然后将其乘以0.00390625(昏暗的表面),然后转换回int,则得到0x00ff00,它是亮绿色而不是深红色。

您应该在rgb_to_int的参数上使用vector times scalar函数。

rgb_to_int(vec_times_double(sp.color, double_abs(dot)))

我在这里假设sp.color的类型为t_vec。如果不是,则相应地调整代码。

© www.soinside.com 2019 - 2024. All rights reserved.