2

TriangleList を使用してプリミティブを出力しています。ほとんどの場合、長方形、三角形、円を描く必要があります。時々、非常に細い三角形 (幅 = 2px など) を描画する必要があります。線(ほぼ線)のように見えるはずだと思っていましたが、別々の点のように見えます:)

次の図は、私が話していることを示しています。

ここに画像の説明を入力

左側の最初の図は、長方形を描く方法を示しています (右上隅から反時計回り)。そして、私が「dx」と呼んでいる長方形の「幅」を見ることができます。

この動作を回避するにはどうすればよいですか? ポイントとしてではなく、直線(ほぼ直線)のように見えます:)

4

4 に答える 4

6

@BrettHale が言及しているように、これはエイリアシングの問題です。例えば、

ここに画像の説明を入力

スーパー/マルチサンプリングを使用しない場合、三角形は右下のピクセルの中心のみをカバーし、それのみが色を受け取ります。実際のピクセルには面積があり、完全な状況では、覆われた面積に等しい色の部分を受け取ります。「アンチエイリアシング」技術は、ピクセル全体で色を統合しないことによって生じるエイリアシング効果を軽減します。

ここに画像の説明を入力

信じられないほど遅くすることなく正しく見えるようにすることは困難です。OpenGL はGL_POLYGON_SMOOTH、三角形を控えめにラスタライズし、ブレンディングを使用して各ピクセルに正しい割合の色を描画する を提供します。これは、重なり合う三角形があり、順序に依存しない透明度が必要な透明度の並べ替えの問題が発生するまではうまく機能します。シンプルで強引な解決策は、はるかに大きなテクスチャにレンダリングしてからダウンサンプリングすることです。これは本質的にスーパーサンプリングが行うことですが、サンプルがより良い結果をもたらす「異方性」(不規則) になる可能性があることを除きます。マルチサンプリング技術は適応的で、少し効率的です。たとえば、三角形のエッジでのみピクセルをスーパーサンプリングします。これを OpenGL で設定するのはかなり簡単です。

ただし、三角形の領域がゼロに近づくと領域もゼロになり、アンチエイリアシングを使用しても完全に消えます (ただし、ピクセル化されるのではなくフェードアウトします)。物理的には正確ではありませんが、代わりに最小 1 ピクセル幅の三角形の後にいる可能性があるため、非常に細い三角形であっても必要な線が得られます。これは、独自の保守的なラスター化を行うことが興味深い場合があります。

ここに画像の説明を入力

于 2015-05-26T07:47:18.563 に答える
2

これは、一般に細い三角形の問題です。たとえば、スキニー T ジャンクションがある場合のアダプティブ サブディビジョンでは、常に発生します。1 つの解決策は、アンチエイリアシング効果を使用してエッジを描画することです (GL_LINE_STRIP を使用できます)。

Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glEnable(Gl.GL_LINE_SMOOTH);
Gl.glEnable(Gl.GL_BLEND);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_DONT_CARE);

線を描く前に、三角形が非常に小さいときに線を取得します...

于 2015-05-24T23:43:30.863 に答える
1

これは、ジオメトリが単一のピクセルよりも小さくなる場合、サブピクセル機能と呼ばれます。非常に細い三角形をアニメーション化すると、ピクセルが飛び出したり飛び出したりするのがわかります。

マルチサンプリングをオンにしてみてください。ほとんどの GL ウィンドウ ライブラリは、マルチサンプル バック バッファーをサポートしています。グラフィックドライバーの設定で強制的にオンにすることもできます。

于 2015-05-26T06:33:54.837 に答える