7

GL wikiでは、深度関数に GL_LEQUAL を使用することを推奨しています。また、深度関数のデフォルトは GL_LESS です。これらの関数のいずれかを使用すると、奇妙な結果が得られます。この図では、赤い正方形が青い正方形の前にある必要があります (両方の正方形は同じサイズです)。 GL_LESSで

ただし、 を使用glClearDepth(0.0)してから を使用すると、glDepthFunc(GL_GREATER)変更されていないプログラムを実行すると、次のようになります。 GL_GREATER で

もう少し考えてみると、GL_LESS が結果を与えるのは理にかなっています: 入力深度値が格納されている値よりも小さい場合、フラグメントが書き込まれます。

カメラを に配置して(1, 0, 0)方向を見た場合、 のオブジェクトが のオブジェクトの前にある(0, 0, 0)と予想されます。GL_LESS を使用すると、オブジェクトはそのフラグメントが書き込まれるものではないでしょうか?(0.5, 0, 0)(0, 0, 0)(0, 0, 0)

編集:ニコル、射影行列について言及してくれてありがとう。設定が間違っていたようです。私はしばらくの間、arcsynthesis.org のチュートリアルに従い、コードを自分のプロジェクトに適合させていましたが、射影行列から逸脱し、glFrustum のマニュアル ページに記載されている数学を使用して、その関数の独自のバージョンを実装し、NeHe の gluPerspective を使用しましたgluPerspective を置き換える置換。行列の計算が正しいため、置換が機能しなかった理由がわかりません (さまざまなオンライン計算機と比較して確認しました)。マトリックスを使用すると、GL_LESS で正しい結果が得られます。

4

2 に答える 2

20

GL 深度関数に GL_LEQUAL が推奨される理由

シェーダー。マルチパス アルファブレンド ライトニング (おそらくバンプマッピングを使用)。これを行うには、同じオブジェクトを同じ位置/深度に数回ペイントする必要がありますが、異なるシェーダー/ブレンディング パラメータと深度テストを有効にする必要があります (深度書き込みは 1 回目以降は無効にすることができます)。GL_LESS は 2 番目のパスとそれ以降のすべてのパスをカットします。GL_LEQUAL はそうではなく、照明は適切に機能します。

GL_LEQUAL 自体は Z ファイティングを引き起こしません。Z ファイティングは、ほぼ同じ位置を共有する 2つのほぼ平行なポリゴンがある場合に発生します。深度バッファの精度を上げることで、影響を減らすことができます。過去には、w-buffer (少なくとも DirectX では) を使用することで削減することもできましたが、この機能はもはや一般的ではありません。

この図では、赤い正方形が青い正方形の前にある必要があります (両方の正方形は同じサイズです)。

ソースコードがないと正解できません。

于 2012-01-30T00:01:27.130 に答える
2

カメラを (1, 0, 0) に配置し、(0, 0, 0) の方を向いた場合、(0.5, 0, 0) にあるオブジェクトが (0, 0, 0) にあるオブジェクトの前にあると予想します。 . GL_LESS では、(0, 0, 0) のオブジェクトはフラグメントが書き込まれるオブジェクトではないでしょうか?

このリンクによると: http://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.opengl/doc/openglrf/glDepthFunc.htm%23b5afa88027vbia

glDepthFunc サブルーチンは、各着信ピクセルの z 値を深度バッファーに存在する z 値と比較するために使用される関数を指定します。" また、次のようにも述べられています。

ここで: z 値は、カメラからオブジェクトまでの距離です。これにより、より近いオブジェクトが画面に描画されます。これはここでも説明されています: http://www.glprogramming.com/red/chapter10.html

最後のリンクから引用します:

深度バッファ

深度バッファには、各ピクセルの深度値が格納されます。第 5 章の「隠された表面除去サバイバル キット」で説明したように、深度は通常、目までの距離で測定されるため、深度バッファの値が大きいピクセルは値が小さいピクセルで上書きされます。ただし、これは単なる便利な規則であり、「深度テスト」で説明されているように、深度バッファーの動作を変更できます。深度バッファーは、z バッファーと呼ばれることもあります (z は、x 値と y 値が画面上の水平方向と垂直方向の変位を測定し、z 値が画面に垂直な距離を測定するという事実に由来します)。

于 2014-10-15T22:37:49.037 に答える