光线追踪法线贴图
Raytracing normal mapping
我目前正在研究光线追踪器,我只是 "bumped" 遇到了一个问题。
我为平面、圆柱体和球体实现了纹理贴图,效果很好……除了法线贴图部分。
这是我所拥有的,每个像素的世界位置和世界法线:world-space normals。
还有一些tangent-space法线贴图(通常的法线贴图)。
我似乎无法弄清楚如何将切线-space 法线转换为世界-space。我曾尝试使用 "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() returns法线贴图的纹理颜色除以255.f
所以!
我刚刚发现我的法线贴图出了什么问题!
在尝试使用常量 {0, 0, 1} 法线来查看我的 TBN 矩阵是否正确(并且确实如此)之后,我刚刚发现法线贴图的切线 space 法线必须是 "converted"
所以正确的代码是:
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 !(不是其他"sort of"水)
我目前正在研究光线追踪器,我只是 "bumped" 遇到了一个问题。 我为平面、圆柱体和球体实现了纹理贴图,效果很好……除了法线贴图部分。 这是我所拥有的,每个像素的世界位置和世界法线:world-space normals。 还有一些tangent-space法线贴图(通常的法线贴图)。
我似乎无法弄清楚如何将切线-space 法线转换为世界-space。我曾尝试使用 "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() returns法线贴图的纹理颜色除以255.f
所以! 我刚刚发现我的法线贴图出了什么问题! 在尝试使用常量 {0, 0, 1} 法线来查看我的 TBN 矩阵是否正确(并且确实如此)之后,我刚刚发现法线贴图的切线 space 法线必须是 "converted"
所以正确的代码是:
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 !(不是其他"sort of"水)