現在、通常のマッピングをVulkanレンダラに実装しようとしています。 しかし、私のTBNマトリックスは何らかの理由で法線マップを間違って変換しています。 法線マップを実装するためのlearnopengl [dot] comチュートリアルに従っています。 OpenGL(これまで私が使用していた)では、通常のマッピングに問題はありませんでした。 ただし、ここでは2曲のビデオで問題を見ることができます:Vulkanノーマルマッピング方向の問題
1:https://www.youtube.com/watch?v=RWLkka939w0&feature=youtu.be
2:https://www.youtube.com/watch?v=fkPp7wYwNGI&feature=youtu.be
現時点では(そのA前方のレンダラを私の拡散色をレンダリングするとき最初のものは効果を示しています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を使用しているモデルを読み込むため、すべての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
gltfの仕様は、tangent.wを1または-1のいずれかにして頂点の譲渡を示します。私は誰かがこのようにそれを実装するのを見た。 – Siebencorgie
YouTubeのリンクは私のためには機能しません(「このビデオは利用できません」) – Columbo
そして、関連するすべてのものがなぜ質問そのものに*含まれているのかの別の素晴らしい例です。また、誰がsRGBの法線マップを作成していますか? –