【问题标题】:Raytracing normal mapping光线追踪法线贴图
【发布时间】: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


    【解决方案1】:

    所以! 我刚刚发现我的法线贴图有什么问题! 在尝试使用常量 {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 !(不是其他“某种”水)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2019-11-29
      • 2011-12-08
      • 2014-06-18
      相关资源
      最近更新 更多