4

私はopenGLで遊んでいて、青いマークの三角形を取り除こうとしています。私はそれにこのコードを使用します:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);

はい、私は使用します

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

私のメインループで。問題は射影行列である可能性があると読みました。私はこれらの値を使用します:

ProjectionMatrix = glm::perspective(45.5f, 4.0f / 3.0f, 0.1f, 100.0f);

近くと遠くの値を変更しようとしましたが、それでも同じです。glDepthFunc のパラメーターを変更しようとしていましたが、それも役に立ちませんでした。それで、何かアイデアはありますか?? どうもありがとう

私の結果

4

1 に答える 1

7

塗りつぶされたポリゴンを使用していないため、これは完全に有効な動作です。顔のカリングは、 を使用したときに期待どおりに動作しますglPolygonMode (...)が、深度テストはそうではありません。

深度テストと書き込みは、ラスタライズ中のフラグメントにのみ適用され、クリッピング/プリミティブ アセンブリ中のプリミティブには適用されません。簡単に言えば、これは、塗りつぶされていない場所はプリミティブ (三角形など) の深さの影響を受けないことを意味します。したがって、この例で深度テストが適用される唯一の場所は、2 つの線が重なる画面上のごくわずかなポイントです。

通常は表示されない三角形の線をワイヤフレーム オーバーレイで描画しないようにするには、2 回描画する必要があります。

パス 1

  1. ポリゴン モードをFILLに設定
  2. カラー書き込みを無効にします。glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
  3. プリミティブを描画する

パス 2

  1. ポリゴンモードをLINEに設定
  2. カラー書き込みを有効にする:glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
  3. プリミティブを描画する

最初のパスは塗りつぶされた (ソリッド) プリミティブを使用して深度バッファーを塗りつぶしますが、カラー バッファーには書き込みません (したがって、すべてが透明のままです)。2 番目のパスは各プリミティブのエッジに線を描画し、別の三角形の内部 (塗りつぶされていない領域) がそれを覆っている場合、これらの線は深度テストに失敗します。

注:GL_LEQAUL上記の動作が正しく機能するためには、同等性 (例: ) を含む深度テストを使用する必要があります。使用しないでくださいGL_LESS

于 2013-11-13T00:56:47.323 に答える