1

OpenGL 2.1 では、位置と法線ベクトルを頂点シェーダーに渡しています。次に、頂点シェーダーは avaryingを法線ベクトルに設定するため、理論的には、各三角形の法線を線形補間します。(これがフォン シェーディングの基礎であると私は理解しています。)

フラグメント シェーダーでは、ランベルトの法則で法線を使用して拡散反射を計算します。頂点間の補間がおかしく見えることを除いて、これは期待どおりに機能します。具体的には、頂点間のエッジに沿って顕著な「ホット スポット」があるスター バーストの影響が見られます。

これは、私自身のレンダリングによるものではありませんが、まったく同じ効果を示す例です (ページの途中にある金の球体を参照してください): http://pages.cpsc.ucalgary.ca/~slongay/pmwiki-2.2.1/pmwiki.php ?n=CPSC453W11.Lab12

ウィキペディアによると、これはガロー シェーディングの問題です。しかし、私が理解しているように、法線を補間し、フラグメントごとに照明計算を実行することで、Gouraud ではなく Phong モデルを使用しています。そうですか?

もっと細かいメッシュを使えば、これらのスターバーストはもっと目立たなくなると思います。しかし、三角形を追加することがこの問題を解決する唯一の方法でしょうか? スターバースト効果なしでスムーズな補間を得る方法があると思います。(私は確かに、3d Studio Max などの他の場所で、粗いメッシュで完全に滑らかなシェーディングを見てきました。しかし、法線を補間するだけでなく、より洗練された何かを行っているのかもしれません。)

4

2 に答える 2

6

まったく同じ効果ではありません。あなたが見ているのは、2 つのことのうちの 1 つです。

  1. 法線をフラグメント シェーダーで使用する前に正規化しなかった結果です。

  2. 三角形のエッジを横切る線形グラデーションの衝突によって作成される目の錯覚。本当。

    このページの下部にある「Gradient Matters」セクション(注: 完全な開示のために、これは私のチュートリアルです) では、この現象について詳しく説明しています。補間された法線を使用した単純なランバート拡散反射率は、三角形を横切る多かれ少なかれ線形の光を効果的に作成します。法線のセットが異なる三角形は、異なるグラデーションになります。これは C0 連続 (エッジに沿った色は同じ) ですが、C1 連続ではありません (2 つのグラデーションに沿った色が異なる割合で変化します)。

    人間の視覚は、このようなグラデーションの違いを認識して目立たせます。したがって、実際にはそうではない場合でも、それらをハードエッジと見なします。

    ここでの唯一の現実的な解決策は、メッシュをさらにテッセレーションするか、補間された法線の代わりにメッシュの細かいバージョンから作成された法線マップを使用することです。

于 2011-12-31T21:25:25.237 に答える
2

コードを表示していないため、わかりませんが、最も可能性の高い問題は、フラグメント シェーダーの正規化されていない法線です。頂点シェーダーで計算された法線は補間されるため、ベクトルは単位長ではないため、フラグメント ライティングを計算する前にフラグメント シェーダーで法線を再正規化する必要があります。

于 2011-12-31T21:21:43.547 に答える