5

グーロー シェーディングの部分で、「ポリゴンが隣接している T ジャンクションは視覚的な異常を引き起こす場合があります。一般的に、T ジャンクションは避けるべきです」と書かれていることに気付きました。

T ジャンクションは、下の図の約 3 つのサーフェスでエッジを共有しているように見えます。ポイント A は、異なるサーフェスに属しているため、異なる法線ベクトルを持つ可能性があります。

ここに画像の説明を入力

しかし、Tジャンクションが発生したときの影響と、OpenGLを使用してそれを実装する方法は何ですか? 各長方形の頂点ごとに異なる法線を設定し、シーンにライトを配置してみましたが、接合点 A に異常は見られませんでした。

これが私のコードです:

glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glNormal3f(0, 0,1);
glVertex3f(-5.0f, 5.0f, 0.0f);
glNormal3f(0, 1,1);
glVertex3f(5.0f, 5.0f, 0.0f);
glNormal3f(1, 1,1);
glVertex3f(5.0f, 0.0f, 0.0f);
glNormal3f(0, -1,1);
glVertex3f(-5.0f, 0.0f, 0.0f);
glEnd();

glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glNormal3f(1, 0,1);
glVertex3f(-5.0f, 0.0f, 0.0f);
glNormal3f(1, 2,1);
glVertex3f(0.0f, 0.0f, 0.0f);
glNormal3f(0, 0,1);
glVertex3f(0.0f, -5.0f, 0.0f);
glNormal3f(0, 1, 2);
glVertex3f(-5.0f, -5.0f, 0.0f);
glEnd();

glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glNormal3f(1, 1, 3);
glVertex3f(0.0f, 0.0f, 0.0f);
glNormal3f(0, -2, 5);
glVertex3f(5.0f, 0.0f, 0.0f);
glNormal3f(-1, 1, 1);
glVertex3f(5.0f, -5.0f, 0.0f);
glNormal3f(1, -2, 0);
glVertex3f(0.0f, -5.0f, 0.0f);
glEnd();

ポイント ライトはカメラと同様に (0, 0, 10) にあります。以下の結果には、視覚的な異常はないと思います。たぶん法線は特別なものであるべきですか?

私が何か間違ったことはありますか?これを実現するためのヒントを誰か教えてもらえますか?

ここに画像の説明を入力

4

2 に答える 2

3

T-Junction はグーロー シェーディングと一般的なジオメトリには適していません。

まず、ゴラウド シェーディングは、固定パイプラインの時代に使用されたライト補間の方法であり、ライトが頂点を横切って補間され、頂点のメッシュ テッセレーション (数と接続性) がシェーディングに直接影響することを思い出してください。T ジャンクションがあると、最終的な補間された色の外観が突然不連続になります (グーロー シェーディングには、アンダー サンプリングなどの他の問題があることに注意してください)。

グーロー シェーディングは、フォン シェーディングとは異なり、頂点法線を直接使用します。注として、フォン シェーディングとフォン ライティングを混同しないでください。これらは異なります。

提示しているケースは T ジャンクションですが、メッシュが十分にテッセレーションされておらず、ライトを使用していないように見えるため、シェーディングの問題に気付かないことに注意してください。T ジャンクションのある球体でテストしてみてください。

ジオメトリに関して、t ジャンクションは縮退したケースと見なされます。そのエッジ/ポリゴンではジオメトリック メッシュの一貫性が失われるため、端で接続された 2 つのエッジがなくなり、ポリゴン ループ プロパティ (有向エッジ) が失われます。これは通常、解決するのが難しい問題です。解決策は、ポリゴンを三角測量して、T ジャンクション エッジが適切に接続されるようにすることです。

http://en.wikipedia.org/wiki/Gouraud_shading

于 2014-02-06T17:56:51.190 に答える
1

この状況に対処すればするほど、その核心にある問題がより明確になります。1 つの確かな例と、それを見て時間を費やすと、おそらく「あはは!」となるでしょう。クリックします。

理論的には、この問題は通常、t-vert のすぐ隣の領域のピクセルが、別々の、場合によっては異なる入力 (t-vert の法線と隣接する頂点の法線) に基づいてシェーディングされる状況として説明されます。t 頂点の法線を、隣接する頂点の法線とは非常に異なる値に設定することで (たとえば、それらの平均値とは非常に異なる)、問題を誇張して説明することができます。

ただし、実際には、コーナー ケースを除いて、通常は頂点間の法線の滑らかなグラデーションを扱っているため、問題はより微妙です。このため、私はこの問題を別の方法で見ています: データ伝播の問題の例として。この状況は、均一な方法でサーフェス全体にサンプル データを伝播しないサンプル全体の補間を引き起こします。あなたの例では、t-vert ライト サンプル入力は上向きに伝播されず、左/右/下にのみ伝播されます。これが、t 頂点が問題となる 1 つの理由です。t 頂点は、このような問題につながるメッシュ ネットワークの不連続性を表しています。

表面の各法線ポイントでの光の値を描き、与えられた光の位置に対して面全体でどのような色が得られるかを考えることで、頭の中で視覚化できます。あなたの例を使用しますが、法線のグラデーションがより滑らかであるため、上面の場合、色の長い線形補間が 1 つ表示されます。ただし、下の 2 つの面については、t 頂点法線によって駆動される色の 2 つの線形補間が表示されます。ライトの角度に応じて、t 頂点の法線は隣接する法線とは異なる量の光を拾う可能性があります。これにより、上下のカラー補間がバラバラになり、シェーディング シームが表示されます。

あなたの例で説明するために、私は1つの色のみを使用し、法線を調整して相対角度のより均一な分布を形成し(以下で投入するセットのようなもの)、次に異なるライトの位置を使用して表示します(特にt 頂点に近いもの)。

top left normal: [-1, 1, 1]
top right normal: [1, 1, 1]
middle left normal: [-1, 0, 1]
t-vert normal: [0, 0, 1]
middle right normal: [1, 0, 1]
bottom left normal: [-1, -1, 1]
bottom middle normal: [0, -1, 1]
bottom right normal: [1, -1, 1]

これは、サンプリングされたデータの不均一な伝播によって引き起こされる問題であり、伝播は補間が行うことであるため、同様の異常が他の補間手法 (フォン シェーディングなど) でも発生します。

于 2014-04-11T16:30:57.073 に答える