opengl - OpenGL Zバイアス(ポリゴンオフセット)の制限

原文 opengl 3d polygon zbuffer

2つの同一平面上のポリゴンがあります。

やってみました。

glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0,1);


また、一方が他方の「上に」明確に存在することを期待していました。

これは、約70〜75ユニット離れている場合に当てはまります(1のニアクリッピングプレーンと10,000のファークリッピングプレーン)。次に、Zファイティングが発生する約50ユニットの領域、そして代替ポリゴンが上に表示されるようです。

ポリゴンオフセットは、通常のZ計算の前または後に追加されますか?それが後だったとしたら、私はそれがすべての距離で「ちょうどうまくいった」と思っていただろう。

間違った値を使用していますか?予想される結果を誤解していますか?それともこれでうまくいくでしょうか?そして私はおそらく他のどこかで間違ったことをしていますか?

シーン内に他のオブジェクトが存在するため、大きな値を試してみることを恐れました。その数が十分に大きければ、それらは遠くにあるオブジェクトの前でもジャンプする可能性があります。
答え
私はglPolygonOffsetを使用していませんが、official FAQでそれを読み上げました。これをまだ見ていない場合は、必ず読んでください。 man pageもあります。

その参考文献によると、オフセットは通常のZ計算の後で計算されますが、深度テストの前と深度バッファに書き込まれる前に適用されます。

2つの問題を考えることができます。まず、FAQでは、glPolygonOffset(1,1)ではなく(0,1)を使用することを推奨しています。最初の「係数」引数には、ポリゴンの勾配が乗算され、オフセットに追加されます。これは、「エッジオン」ポリゴンでは明らかに重要です。ポリゴンがカメラの方を向いている場合は問題ありませんが、角度がある場合は、ポリゴンを前方に押す必要がある量が角度とともに増加します。

次に、1つのポリゴンのみのオフセットを有効にしますか?両方で有効にした場合(または無効にするのを忘れた場合)、両方のポリゴンに適用され、正味の効果はゼロになります。

3番目に、深度バッファーが大きすぎると思いました(深度バッファーにカメラに近いオブジェクトを優先する双曲線スケールがある場合)。 glPolygonOffsetはZ値ではなく深度値を処理することになっているため、これについてはよくわかりません(したがって、深度バッファーのスケールはここでは考慮すべきではありません)。デプスバッファーを短く(おそらく1000)してみて、違いがあるかどうかを確認してください。
関連記事

c++ - Qt頂点配列がQImageで機能しない

c - OpenGL 3.2 / 3.3からバージョン情報を取得できません

linux - Linuxでmingwを使用してopenglをコンパイルする

opengl - 他のPCのOpenGLホワイトテクスチャ

c++ - Ubuntuを使用して異なるディスプレイでOpenGLコンテキストを共有する

c++ - cairo + openGL + Glut + VS 2010 + Windows 7

opengl - GtkGlExtのOCamlバインディングはありますか?そうでない場合、どうすればそれらを記述できますか?

c++ - C++で派生クラスの配列を基本クラスの配列に切り捨てることは可能ですか?

opengl - glVertex:この呼び出しの他のバージョンの使用方法

macos - OpenGl-どこから始めますか?