我目前正在尝试将常规映射实现到我的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
答案 0 :(得分:1)
我发现了。
这确实是一个错误的解释图像。我为法线贴图加载的图像在Vulkan中被定义为Srgb(出于某种原因)。这导致了这个bug。 我想我没有因为夜晚太长而找不到错误。
感谢您的一切!