Vulkan 法线贴图方向问题

Vulkan normal mapping direction problems

我目前正在尝试将法线贴图实现到我的 Vulkan 渲染器中。 但是,出于某种原因,我的 TBN 矩阵错误地转换了法线贴图。 我正在按照 learnopengl[dot]com 教程执行法线贴图。 在 OpenGL(我以前使用过)中,法线贴图没有问题。 但是,您可以在两个视频中看到问题:

1: https://www.youtube.com/watch?v=RWLkka939w0&feature=youtu.be

2: https://www.youtube.com/watch?v=fkPp7wYwNGI&feature=youtu.be

第一个显示渲染我的漫反射颜色时的效果(目前它是一个带有一个方向光的前向渲染器)第二个显示渲染器的正常输出。 白色球体和环面使用顶点法线。正如您在使用顶点法线时看到的那样,光照是正确的(我还使用带纹理的球体和块对其进行了测试)。 将 TBN 矩阵应用于法线贴图时,光线会熄灭,并且会在旋转立方体时接缝改变方向。 这是计算 TBN 矩阵的 glsl 代码:

顶点着色器:

void main() {

  vec4 pos = u_main.model * vec4(position, 1.0);

  mat3 normal_matrix = transpose(inverse(mat3(u_main.model)));

  vec3 T = normalize(normal_matrix * tangent.xyz);
  vec3 N = normalize(normal_matrix * normal);

  vec3 B = normalize(cross(N, T) * tangent.w);

  v_TBN = mat3(T, B, N);

  FragmentPosition = vec3(pos);
  v_position = pos.xyz / pos.w;
  v_TexCoord = tex_coord;
  v_normal = normalize(normal_matrix * normal);

  //The proj has been manipulated like here: https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/
  gl_Position = u_main.proj * u_main.view * u_main.model * vec4(position, 1.0);
}

片段着色器:

vec3 N = texture(t_Normal, v_TexCoord).rgb;

N = v_TBN * (N * 2 - 1);

我已经尝试过的事情:

vec3 srgb_to_linear(vec3 c) {
    return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c));
}

我希望有人知道这可能是什么。我现在挣扎了大约 2 周 ^^。 如果您需要更多信息,请告诉我。 提前致谢!

-siebencorgie

嗯,我发现了。

这确实是一个错误解释的图像。我为法线贴图加载的图像在 Vulkan 中被定义为 Srgb(出于某种原因)。这导致了错误。 我想我没有发现错误是因为熬夜太久了。

非常感谢!