頂点法線に少し問題があります。
結果は少し奇妙に思えます。まず画像を見てください:
3D ソフトウェアのオリジナル モデル。
OBJ ファイルから直接インポートされたメッシュを使用したフラグメント単位のライティング (ファイルの法線を使用)。
フラグメントごとの照明、独自のルーチンで法線を計算します。
気づきましたか?OBJ ファイルの法線を使用すると、すべて問題ありません。しかし、独自のルーチンを使用して頂点に基づいて法線を計算すると、何かがおかしいように見えます。
Z が負になると、法線が奇妙に見えます (右手の向きを使用)。オブジェクトの他の部分ではすべて問題ありませんが、メッシュを横切る 1 本の架空の線だけが奇妙に見えます。この問題は他のメッシュでも持続し、常に同じ場所 (Z = 0) にあります。
法線を計算する私のルーチンは、頂点 ABC を持つ三角形を想定して、誰もが知っているものです。
vec3 normal = normalize(cross(C - A, B - A));
そして、通常の結果を、既に計算された通常のバッファに追加します。
各三角形の面積を計算し、それを法線で乗算するか、バッファの法線と新しい法線の間の内積をチェックすることについて何人かの人が言っているのを見てきましたが、私はすでにそれらのアプローチを試しました。少し変更しますが、それでも同じ問題があります。
前にこれを見たことがありますか?それを解決する方法を知っていますか?
ここにいくつかのコードがあります:
// Looping at each triangle
vec3 distBA = vec3Subtract(vB, vA);
vec3 distCA = vec3Subtract(vC, vA);
vec3 normal = vec3Cross(distBA, distCA);
// Each normalBuffer represents one vertex.
normalBuffer[i1] = vec3Add(normal, normalBuffer[i1]);
normalBuffer[i2] = vec3Add(normal, normalBuffer[i2]);
normalBuffer[i3] = vec3Add(normal, normalBuffer[i3]);
// After pass through all faces/triangles.
// Looping at each Vertex structure.
normal = vec3Normalize(normalBuffer[i]);