2016-12-07 14 views
0

В настоящее время я работаю над 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

ответ

0

Так! Я только что нашел, что случилось с моим нормальным картографированием! После попытки использовать постоянную {0, 0, 1} нормальную, чтобы проверить, была ли моя матрица TBN правильной (и это было), я только выяснил, что нормальные нормальные карты нормалей карты должны быть «преобразованы»

Таким образом, правый код:

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)); 
//map_n * 2 - 1 
map_n = vec3_sub(vec3_scale(map_n, 2), new_vec3(1, 1, 1)); 
MAT3 tbn = new_mat3(t, b, worldnormal); 
worldnormal = vec3_normalize(mat3_mult_vec3(tbn, map_n)); 

Так близко, но пока! Вот как это выглядит сейчас, выглядя довольно неплохо ИМХО!

New (propper) normal mapping using TBN matrix !

With a better material for middle pillar ! (не другой "вид" воды)