В настоящее время я работаю над raytracer, и я просто «столкнулся» с проблемой. Я реализовал отображение текстур для самолетов, цилиндров и сфер, и он работает очень хорошо ... За исключением нормальной части карты. Вот что у меня есть, мировое положение и мировые нормали каждого пикселя: world-space normals. И некоторая нормальная карта касательного пространства (обычное нормальное отображение).Raytracing normal mapping
Я не могу понять, как преобразовать нормали касательного пространства в мировое пространство. Я попытался использовать матрицу «TBN», но нормали выключены: normal map projected normals.
И вот мой код, чтобы вычислить новый нормальный:
VEC3 t = vec3_cross(worldnormal, new_vec3(0.0, 1.0, 0.0));
VEC3 b;
if (!vec3_length(t))
t = vec3_cross(worldnormal, new_vec3(0.0, 0.0, 1.0));
t = vec3_normalize(t);
b = vec3_normalize((vec3_cross(worldnormal, t)));
VEC3 map_n = vec3_normalize(get_texture_color(normal_map, texcoords));
MAT3 tbn = new_mat3(t, b, worldnormal);
worldnormal = vec3_normalize(mat3_mult_vec3(tbn, map_n));
get_texture_color() возвращает нормальное отображение в цвет текстуры разделены 255.f