【发布时间】:2016-12-07 10:55:02
【问题描述】:
我目前正在研究光线追踪器,但我只是“碰到”了一个问题。 我为平面、圆柱体和球体实现了纹理映射,它工作得很好……除了法线贴图部分。 这是我所拥有的,每个像素的世界位置和世界法线: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
【问题讨论】:
标签: matrix 3d texture-mapping raytracing normals