13. ポリゴン上の線描画と、ポリゴンオフセット

13.010 ポリゴンオフセットを使うための基本は何ですか?

共面のプリミティブをOpenGLに表現することが、2つの理由に難しい

深さ機能をGL_LEQUALまたはGL_EQUALに設定することにより問題は解決されません。 ビジュアルな結果は、縫い合わせ、出血、またはZ戦いのため参照されます。

ポリゴンオフセットはOpenGL1.0に拡張であり、現在OpenGL1.1に組み入れられます。 それは、深さを定義する申込書が、満たされたプリミティブ、およびOpenGL1.1にあてはまるかもしれずそれをオフセットしたと認めます 別々に可能か、またはプリミティブが、満たすことに表現されるか、線を描くか、またはポイントモードであるかどうかに依拠していることを使用不可にできる 。 従って、アプリケーションは、そして、オフセットおよび2番目のプリミティブをすることを適用して最初の1つのプリミティブによって共面のプリミティブをできます。

オフセットされたどの状況意志ポリゴン GL_POINTS、GL_LINES、GL_LINE_STRIP、またはGL_LINE_LOOPプリミティブの影響深さ価値 の下でも、ポリゴンオフセットが、ポイントとラインモードの満たされたプリミティブの深さ価値を変更できない間。 もし満たされたプリミティブの上のポイントまたはラインプリミティブをしようとしているならば、満たされたプリミティブを後ろに押すためにオフセットされたポリゴンを使ってください。 (それは、ポイントとラインプリミティブを前に引くために使用できません。)

ポリゴンオフセットが、ラスタ化の間に計算された正しいZ値を変更するので、結果として生じているZは見積もり 深さバッファに蓄えられることについての, 、含み このオフセット 、結果として生じているイメージに反対に影響するかもしれません。 多くの状況には、不適当な「出血に」効果は結果として生じているかもしれません。 実に、ポリゴンオフセットがいくつかのプリミティブを深さテストに完全に 時 それら 合格させるかもしれないこととしないことと正常、または逆もまた同様。 モデルが交差している時には、ポリゴンオフセットは交差ポイントの不正確な表現を起こすかもしれません。

13.020 glPolygonOffset() では二つのパラメータをコールします。それらの意味は何ですか?

ポリゴンオフセットは、アプリケーションが、2つのパラメータ、ファクターユニットによってオフセットされた深さを指定することを可能にします。 ファクターは、ポリゴン、およびユニットスケールのX、またはY 最小の溶解性の深さバッファ値 について最大のZ斜面を測量します。 結果は、深さオフセットを生み出すために合計されます。 このオフセットは、一般にスクリーンに指し示しているポジティブなZによってスクリーンスペースに応用されます。

ファクターパラメータは、正しい結果を、ほとんど研ぐonにビューアである満たされたプリミティブに保証するために必要です。 このケースでは、最大のZがXまたはYに傾斜しているのと同じくらい、2つの共面のプリミティブにより生成された同じピクセルのためのZ値の違いは大きいかもしれません。 このZ斜面はプリミティブほとんど研ぎで大きく のために 、プリミティブ顔でほとんど存在しない のために 。 ファクターパラメータは、あなたに、結果として生じている深さオフセットにこのタイプの可変の違いを追加させます。

典型的な用途が、ファクターを設定することであるかもしれないこと、およびポジティブなZ(スクリーンへの)にプリミティブをオフセットし、オフセットされて のために 、モードを満たすポリゴンを可能にする1.0へのユニット。 その時1回 モデルの立体幾何学 およびライン幾何学でもう一度2つのパスが作られます。 満たされたポリゴンほとんど研ぎに、ほとんど平面のポリゴンが引かれる間、ライン幾何学によって干渉を最小化するために、eyepointから向こうに大幅に押されます ライン幾何学の後ろの最低1つの深さバッファユニット 。

13.030 OpenGL 1.0 のポリゴンオフセット拡張と、OpenGL 1.1 以降のポリゴンオフセットインタフェースの違いは何ですか?

1.0ポリゴンオフセットされた拡張は、あなたに、ラインまたはポイントモードにおいて、オフセットを、満たされたプリミティブに適用させませんでした。 満たすモードの満たされたプリミティブだけがオフセットされえました。

1.0拡張において、バイアスパラメータが標準化(0.0に追加されました - 1.1ユニットパラメータ1.0)深さ値。 典型的なアプリケーションは、0.001のバイアスを指定することによって相殺された善を得ることができます。

GLUT例を見てください。それは1.1ポリゴンオフセットされるインタフェースを使って、1.0ポリゴンオフセットされる拡張と他を使って2つのシリンダ、一方をします

13.040 塗りつぶされたプリミティブの上に線プリミティブを描くとき、ポリゴンオフセットが働かないのはなぜですか?

その名前が暗示しているので、ポリゴンは多角形のプリミティブによって作品だけをオフセットしました。 それは、満たされたプリミティブにだけ影響します: GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_QUADS、GL_QUAD_STRIP、およびGL_POLYGON。 GL_FILL、GL_LINE、またはGL_POINTに設定されたglPolygonModeによってそれらをする時には、ポリゴンオフセットは働きます。

ポリゴンオフセットは非多角形のプリミティブに影響しません。 GL_POINTS、GL_LINES、GL_LINE_STRIP、およびGL_LINE_LOOPプリミティブは、glPolygonOffset()によってオフセットされえません。

13.050 ポリゴンオフセットを使いたくないとき、同一平面上のプリミティブを描くためにどのような方法がありますか?

glDepthRange()を修繕することによって相殺されたポリゴンの効果をシミュレーションできます。 例えばしてさしつかえありません コード 以下 :

glDepthRange (0.1と1.0);
/*引きを引き起こしている幾何学*/
glDepthRange (0.0と0.9);
/*引きを横たえている幾何学*/

このコードは、Zの固定されているオフセットを提供するけれども、ポリゴン斜面を説明しません。 0.0のファクターパラメータによってglPolygonOffsetを使うまでに乱暴に等しい。

型板バッファによって共面のプリミティブを多くの創造的な点でできます。 OpenGLプログラミングガイドアウトラインそれは方法をよく知っています。 ポリゴンおよびそのアウトラインを引くためのアルゴリズムは次の通りです:

  1. アウトラインを色、深さに引き入れて、バッファをステンシルで刷ってください
  2. 満たされたプリミティブを色バッファと深さバッファと型板バッファがクリアであることに引き入れてください
  3. 色と深さバッファからアウトラインをマスキングし、空所 型板バッファ に与えてください

いくつかのSGI OpenGLプラットフォームにおいて、アプリケーションがSGIX_reference_plane拡張を使うことができます。 この拡張によって、ユーザーは、共面のプリミティブのセットと一致しているオブジェクト座標の飛行機方程式を指定します。 飛行機を使用可能にするか、または使用不可にできます。 飛行機が使用可能な時には、すべての破片Z値は、指定された飛行機方程式から派生します。 従って、同一で を問わず どの それを与えられているプリミティブ ように、どのような与えられた破片XY位置、深さ価値のためにでも保証されています。