3

これは、私の以前の問題と投稿の続きです。そこで受け取った回答のおかげで、OpenGL の学習を進めるだけでなく、目標に少し近づくことができたと感じていますが、ステンシル バッファーの操作の基本を理解した直後に、問題が発生しました。 .

ステンシル バッファにスプライトを描画すると、無意識に望んでいたように完全に透明ではないピクセルだけではなく、正方形の領域全体が描画されるようです。なぜそうなるのかはなんとなくわかりますが、解決策がどこにあるのかわかりません。ステンシル自体をかなり試し、スプライトバッチが低アルファ フラグメントを破棄するために使用するシェーダーを変更しましたが、全体像を把握できていないようです。

問題の視覚的な例として、前の質問で使用した例を続けます。現在、2つの円を互いに重ねて描画しようとしています(したがって、それらは完全にブレンドされ、重なり合うことはありません)、私はこれを取得しています:

ステンシルテスト

したがって、基本的に、複雑な形状で LibGDX の Sprite および SpriteBatch 機能を使用してステンシル バッファーを利用する方法はありますか (円は例としてのみ使用されています)、または代替ルートを探す必要がありますか?

編集 ::

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
    Gdx.gl.glDepthMask(true);

    batch.begin();
    sprite.draw(batch);
    sprite2.draw(batch);
    batch.end();

    Gdx.gl.glDisable(GL20.GL_DEPTH_TEST);
4

2 に答える 2

1

ステンシルの書き込み/テストはフラグメント レベルで行われます。円を描くと、実際には、各フラグメントがテクスチャ化されているかどうかに関係なく、フラグメントのクワッドを描いています。問題は、GPU がフラグメントのステンシル テストを行うときに、フラグメントにどの色を書き込むかを GPU が気にしないことです。したがって、フラグメントを破棄して、クワッドのステンシル値を書きたくない部分のステンシル書き込みを停止する必要があります。

TL;DR 「if(gl_FragColor.a < 0.01) 破棄;」を使用します。フラグメント シェーダーで、フラグメント (およびステンシル値) の円が生成されていることを確認します。

于 2015-01-07T07:06:51.667 に答える
0

これは役に立ちます。ブレンディングと深度テストで同じ問題を解決します。まず、明確な深度とカラー ビットが必要です。

Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

次に、いくつかの gl 機能を有効にする必要があります。

Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glDepthMask(true);

その後、オブジェクトを描画できます。私のプロジェクト smtng では、次のようになります。

shapeRenderer.setColor(c.getR(), c.getG(), c.getB(), FIELD_ALPHA);
shapeRenderer.filledCircle(p.getPos().x + s.getOffset().x, ApplicationEnv.SCREEN_HEIGHT - p.getPos().y + s.getOffset().x, b.getRadius());

重要!描画後、spriteBatch (またはその他のもの) に対して end() を呼び出し、depth_test 機能を無効にします。

Gdx.gl.glDisable(GL10.GL_DEPTH_TEST);

結果: ビフォー アフター

于 2013-04-28T20:54:05.107 に答える