Matrix 光线跟踪法线映射

Matrix 光线跟踪法线映射,matrix,3d,texture-mapping,raytracing,normals,Matrix,3d,Texture Mapping,Raytracing,Normals,我目前正在开发一个光线跟踪器,我只是“撞”了一个问题。 我为平面、圆柱体和球体实现了纹理贴图,效果非常好。。。除了法线贴图部分。 以下是我所拥有的,每个像素的世界内位置和世界内法线:。 和一些切线空间法线贴图(通常的法线贴图) 我似乎不知道如何将切线空间法线转换为世界空间。我尝试使用“TBN”矩阵,但法线已关闭: 下面是我计算新法线的代码: VEC3 t = vec3_cross(worldnormal, new_vec3(0.0, 1.0, 0.0)); VEC3 b; if (

我目前正在开发一个光线跟踪器,我只是“撞”了一个问题。 我为平面、圆柱体和球体实现了纹理贴图,效果非常好。。。除了法线贴图部分。 以下是我所拥有的,每个像素的世界内位置和世界内法线:。 和一些切线空间法线贴图(通常的法线贴图)

我似乎不知道如何将切线空间法线转换为世界空间。我尝试使用“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));
MAT3    tbn = new_mat3(t, b, worldnormal);
worldnormal = vec3_normalize(mat3_mult_vec3(tbn, map_n));
get_texture_color()返回法线贴图的纹理颜色除以255.f的值! 我刚刚发现我的法线贴图有什么问题! 在尝试使用常量{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));
如此接近,却又如此遥远! 这是它现在的样子,看起来很不错

(不是其他“种类”的水)