3

現在使用しているデカールを描画するためにglPolygonOffset(-1,-1)、デカールのポリゴンがカメラに近づいているかのように、デカールの zbuffer 値をごまかして、デカールを描画しているときに、醜い Z ファイティング アーティファクトを取り除くことができます。glPolygonOffsetまた、さまざまな引数を使用してデカールを相互に並べ替えることができると考えましたが、これはカメラの角度に基づいて調整されるようで、カメラを動かすとデカール全体の順序が入れ替わってしまいます。

私が試した別のアプローチは、このドキュメントの「デカールの作成」にあります。

  1. 書き込み用の深度バッファを無効にし、A をレンダリングします。
  2. 書き込み用に深度バッファを有効にし、B をレンダリングします。
  3. 書き込み用のカラー バッファを無効にし、A を再度レンダリングします。
  4. 書き込み用のカラー バッファを有効にします。

これが私の試みですが、深度バッファが書き込み用に有効になっているときにデカールが描画されるため、これを拡張して互いに相対的な順序でデカールを描画する方法がよくわかりません.ファインティング?

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  
glEnable(GL_BLEND);

//Render a red solid quad on the color mask
glDepthMask(false);
glColor3f (1.0f, 0.0f, 0.0f);
glBegin (GL_QUADS);
    glVertex2f(-1,-1);
    glVertex2f(-1,1);
    glVertex2f(1,1);
    glVertex2f(1,-1);
glEnd ();

//Render the coincident decal, a transparent square works fine for now
glDepthMask(true);
glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
glTranslatef(0, 1, 0.0f);
glScalef(0.5f, 0.5f, 0.5f);
glBegin (GL_QUADS);
    glVertex2f(-1,-1);
    glVertex2f(-1,1);
    glVertex2f(1,1);
    glVertex2f(1,-1);
glEnd ();

//Render the red quad again but only on the depth buffer
glColorMask(false, false, false, false);
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
glBegin (GL_QUADS);
    glVertex2f(-1,-1);
    glVertex2f(-1,1);
    glVertex2f(1,1);
    glVertex2f(1,-1);
glEnd ();
glColorMask(true, true, true, true);

これはほとんどのゲームで行われているように見えるので、私が見逃しているより良い解決策があると確信しています. しかし、私は多くの検索を行ってきましたが、openGL でこのようなデカールを注文するためのチュートリアルを見つけることができませんでした。多分私は間違った検索用語を使用していますか?このプロセスに別の名前はありますか?

4

1 に答える 1

2

あなたが提案したように使用glPolygonOffsetして前後にレンダリングすると、GPUの「初期のZ」最適化を最大限に活用する必要があるため、他のオプションよりもパフォーマンスが向上する可能性があります。

glPolygonOffsetたとえば、最初のデカールには (-4, -4)、2 番目のデカールには (-8, -8) など、より大きな数値を渡すことをお勧めします。正確な科学ではありません ;)

もちろん、この方法で描画できるデカールの数には制限があります。これglPolygonOffsetは、デカールが大きくなりすぎて、想定されていないものの前に表示されてしまうためです。

Re カメラ角度の問題:factorへの引数glPolygonOffsetは、非常に角度の付いたポリゴンに余分なファッジを追加することになっています。

あなたが試すことができる別の方法は次のとおりです。

  • すべての通常のジオメトリを通常どおりにレンダリングする
  • 深度書き込みを無効にします (ただし、深度テストは有効のままにします)
  • glPolygonOffset(-1, -1)
  • すべてのデカールを後ろから前に描く

そして、おそらくより効率的な別の方法:

  • フレームの開始時にステンシル バッファーを 0 にクリアします (同時に、他のバッファーをクリアします)。
  • すべての通常のジオメトリを通常どおりにレンダリングする
  • 深度書き込みを無効にします (ただし、深度テストは有効のままにします)
  • glPolygonOffset(-1, -1)
  • glStencilFunc(GL_NOTEQUAL, 1, 1)glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)
  • 前面から背面まで、すべてのデカールを描画します
于 2012-06-11T05:42:45.537 に答える