Glsl Vulkan法线映射方向问题

Glsl Vulkan法线映射方向问题,glsl,lighting,vulkan,normals,Glsl,Lighting,Vulkan,Normals,我目前正试图在Vulkan渲染器中实现法线映射。 但是,由于某些原因,我的TBN矩阵正在错误地变换法线贴图。 我正在学习learnopengl[dot]com教程以实现法线贴图。 在OpenGL(我以前使用过)中,法线映射没有问题。 但是,在这里,您可以从两个视频中看到问题: 1: 2: 第一个显示渲染漫反射颜色时的效果(目前它是带有一个平行光的正向渲染器),第二个显示渲染器的正常输出。 白色球体和圆环体使用顶点法线。正如您所看到的,使用顶点法线时,照明是正确的(我还使用纹理球体和块对其进行了测

我目前正试图在Vulkan渲染器中实现法线映射。 但是,由于某些原因,我的TBN矩阵正在错误地变换法线贴图。 我正在学习learnopengl[dot]com教程以实现法线贴图。 在OpenGL(我以前使用过)中,法线映射没有问题。 但是,在这里,您可以从两个视频中看到问题:

1:

2:

第一个显示渲染漫反射颜色时的效果(目前它是带有一个平行光的正向渲染器),第二个显示渲染器的正常输出。 白色球体和圆环体使用顶点法线。正如您所看到的,使用顶点法线时,照明是正确的(我还使用纹理球体和块对其进行了测试)。 将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作为up,所以我将所有y坐标乘以-1
  • 我尝试了一些公式来计算着色器中的TBN矩阵。但是我没有正确地理解它,正常的也不能正常工作,所以我放弃了它
  • 通过glsl函数将我的法线贴图从srgb转换为线性颜色:

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

-siebencorgie

我发现了

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


谢谢你做的一切

gltf规格通过将tangent.w变为1或-1来指示顶点的惯用手。我看到有人这样做。youtube链接对我不起作用(“此视频不可用”),这是另一个很好的例子,说明了为什么所有相关内容都应该包含在问题本身中。还有谁在sRGB中创作法线贴图?!很抱歉听到这个消息,我将视频从私有更改为未列出,您应该能够查看它们:反照率问题:法线视图:我尝试在srgb和线性之间转换,因为我发现另一个问题是srgb法线贴图。我只是看了一下。这是我的第一个问题,所以我不能为这个问题添加任何GIF。事实上,在计算法线之前,我必须
LINEARtoSRGB(纹理(纹理[material.normalTex],inUV0.rgb)
vec3 srgb_to_linear(vec3 c) {
    return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c));
}