Vulkan法线贴图方向问题

时间:2017-09-15 12:23:46

标签: glsl lighting vulkan normals

我目前正在尝试将常规映射实现到我的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);

我已经尝试过的事情:

  • 我使用Gltf加载我的模型,使用+ y作为向上,所以我将所有y坐标乘以-1。
  • 我尝试了一些公式来计算着色器中的TBN矩阵。但是我没有正确理解,正常情况也不正常,所以我放弃了它。
  • 通过glsl函数将我的法线贴图从srgb转换为线性颜色:

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

1 个答案:

答案 0 :(得分:1)

我发现了。

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

感谢您的一切!