13

関数の最初のパラメーターの意味を理解するのに苦労していglPolygonOffsetます。

void glPolygonOffset(GLfloat  factor, GLfloat units);

公式文書には、その要因が記載されています

各ポリゴンの可変深度オフセットを作成するために使用される倍率を指定します。

そしてそれ

各フラグメントの深度値は、適切な頂点の深度値から補間された後にオフセットされます。オフセットの値は係数×DZ+r×単位です。ここで、DZはポリゴンの画面領域に対する深さの変化の測定値であり、rは特定の値に対して解決可能なオフセットを生成することが保証されている最小値です。実装。

r私は何であるかを理解してunitいます。私が理解していないDZのは、「ポリゴンの画面領域に対する深度値の変化の測定」が何を意味するのか、そしてなぜ係数を0以外に設定する必要があるのか​​ということです。

ワイヤーフレームをオフセットしたい場合、必要なのは深度値に/から数単位を追加/実体化することだけですよね?factorパラメーター(およびドキュメントに記載されているDZ)の意味、目的、および使用例は何ですか?

4

1 に答える 1

18

ここでいくつかの無知を認めなければなりませんが、それを説明するこの記事を見つけました。彼らが言うには:

ハイライトされたソリッド オブジェクトをビジュアル アーティファクトなしで適切にレンダリングするには、ソリッド オブジェクトに正のオフセットを追加する (手前に押し出す) か、ワイヤフレームに負のオフセットを追加する (手前に引き寄せる) ことができます。大きな問題は、「どのくらいのオフセットで十分か?」ということです。残念ながら、必要なオフセットは、各ポリゴンの深さの勾配やワイヤーフレームの線の幅など、さまざまな要因によって異なります。

次に、深度勾配を次のように説明します。

深度勾配は、ポリゴンをトラバースするときの z (深度) 値の変化を x または y 座標の変化で割ったものです。深度値はウィンドウ座標であり、[0, 1] の範囲に固定されます。ポリゴンの最大深度勾配 (オフセット方程式の m) を推定するには、次の式を使用します: m = max {|delV / delS|,|delV / delT|}。(ここで、del は偏導関数です)

したがって、彼らは次のように結論付けています。

ニア クリッピング プレーンとファー クリッピング プレーンに平行なポリゴンの場合、深度勾配はゼロです。[...] クリッピング プレーンに対して大きな角度にあるポリゴンの場合、深度傾斜がゼロよりも大幅に大きくなる可能性があり、より大きなオフセットが必要になる場合があります。0.75 や 1.0 などの小さなゼロ以外の係数の値は、明確な深度値を生成し、不快な視覚的アーティファクトを除去するのにおそらく十分です。

于 2012-11-17T15:21:56.503 に答える