光线追踪法线贴图

标签

我目前正在使用raytracer,只是在一个问题上“碰到”了。我为飞机,圆柱体和球体实施了纹理贴图,并且效果很好……除了法线贴图部分。这就是我所拥有的,每个像素的世界内位置和世界内法线:世界空间法线以及一些切线空间法线贴图(通常的法线贴图)。

我似乎无法弄清楚如何将切线空间法线转换为世界空间。我尝试使用“ 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));

如此之近,却如此之远!现在的样子,恕我直言!

使用TBN矩阵的新(正确)法线映射!

用更好的材料做中间支柱!(不是其他“种类的”水)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

光线追踪反射失真

来自分类Dev

光线追踪-折射错误

来自分类Dev

光线追踪中的折射?

来自分类Dev

光线追踪-反射

来自分类Dev

光线追踪的种类-差异

来自分类Dev

光线追踪输出双倍?

来自分类Dev

程序领域的法线贴图

来自分类Dev

OpenGL法线贴图

来自分类Dev

错误的法线贴图

来自分类Dev

光线追踪器光线反射错误

来自分类Dev

圆柱线与光线追踪相交

来自分类Dev

使用LibGDX的法线贴图GLSL

来自分类Dev

奇怪的阴影立方体光线追踪

来自分类Dev

光线追踪器未产生预期的输出

来自分类Dev

在光线追踪中对球体进行荒谬的思考

来自分类Dev

Unity错误中的光线追踪C#

来自分类Dev

光线追踪器未产生预期的输出

来自分类Dev

为什么法线贴图无法正确显示?

来自分类Dev

编写光线追踪器,无法使图像正确居中?

来自分类Dev

光线追踪算法-一些问题

来自分类Dev

光线追踪不正确的软阴影采样

来自分类Dev

光线追踪三角形

来自分类Dev

阴影贴图:整个网格都在阴影中,根据深度贴图应该没有光线的地方

来自分类Dev

three.js法线贴图以不同的方式呈现Windows / Mac

来自分类Dev

计算表面法线贴图时发生奇怪的事情

来自分类Dev

法线贴图会覆盖DirectX 11中的平滑边缘

来自分类Dev

法线贴图和照明出现错误,无法正确显示

来自分类Dev

法线贴图可以使用单独的uv设置吗?

来自分类Dev

在 Unity 中在运行时设置法线贴图