2016-12-07 149 views
0

我目前正在研究光線追蹤器,我只是在一個問題上「碰撞」。 我實現了飛機,圓柱體和球體的紋理映射,它的工作非常好...除了正常的地圖部分。 下面是我擁有的每個像素的內部位置和內部法線:world-space normals。 和一些切線空間法線貼圖(通常的法線貼圖)。光線追蹤法線貼圖

我似乎無法弄清楚如何將切線空間法線轉換爲世界空間。我曾嘗試使用「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 !(而不是其他 「之類的」 水)