2.5Dワールドで深度テストとテクスチャの透明度を一緒に使用するにはどうすればよいですか?


11

注:私はすでに答えを見つけました(この質問の後に投稿します)-私はそれを正しく行っているのか、それとももっと良い方法があるのか​​と思っていました。

OpenGL ES(JOGL)を使用して「2.5D」アイソメトリックゲームを作成しています。「2.5D」とは、世界が3Dであることを意味しますが、2Dアイソメトリックタイルを使用してレンダリングされます。

私が解決しなければならなかった元々の問題は、テクスチャを順番に(後ろから前に)レンダリングする必要があり、タイルが適切に重なり合って適切な効果が得られるようにすることでした。少し読んだ後、私はこれが「古い帽子」の2Dアプローチであることにすぐに気付きました。3Dワールドはプレーヤーによって変更できるため(これは3D空間のどこにでも表示される可能性があるため)、これを効率的に行うことは困難になりました。深度バッファーを利用するのは理にかなっているようです。これは、私がものを正しい順序でレンダリングすることについて心配する必要がなかったことを意味しました。

しかし、私は問題に直面しました。GL_DEPTH_TESTGL_BLEND一緒に使用すると、オブジェクトがzオーダーで「ソート」される前にオブジェクトが背景とブレンドされる効果が作成されます(つまり、透明度が必要な場所で奇妙なオーバーラップが発生します)。

透明度の重なり問題

問題を説明する疑似コードをいくつか示します(ちなみに、私はAndroidでlibgdxを使用しています)。

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_BLEND);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    // ...
    // bind texture and create vertices
    // ...
}

だから問題は:透明性の重なり問題をどうやって解決するのですか?


2
私が私の2Dエンジンについてまったく同じ方法で行ったことを伝えるコメントだけです。最初に自分自身を賢くZソートタイルにしようとしました。次に、シーンがフラットでなければならない理由がないことに気づき、タイルをZ座標とアルファテストのアクティブ化。あなたが正しいかどうかは
わかり

回答:


7

OK、それでこれが私の解決策です(もっとうまくできるかどうかコメントしてください)...

実際にアルファテストを使用する必要があることがわかりました(ただし、これは偶然発見したため、なぜ機能するかは完全にはわかりません)。

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

使用に注意してくださいGL_ALPHA_TEST、とglAlphaFunc


それも私の問題を解決しました。共有してくれてありがとう。あなたは素晴らしい
Mathlover

2

アルファテストは、レンダラーがzバッファーを含む任意のバッファーにピクセルを描画するのを停止するために使用されます。アルファブレンディングは単なる視覚的なものです。値は引き続きzbufferに書き込まれるため、このような問題が発生する可能性があります。非表示のピクセルは、その後レンダリングされるピクセルの前にあるため、新しいピクセルを描画するときにztestに失敗します。これはあなたが与えた画像で見ることができるもので、ztestは失敗します。

z書き込みをオフにしても同じ結果が得られますが、すべてをintから順に表示する必要があります。これは、アイソメトリックゲームで簡単に実行できるはずです。


1
Y平面が固定されていて、デザイナーが世界を完全に制御している場合にのみ、2D isoゲームで後ろから前へものを描くのは簡単だと思います。ただし、3D空間のどこにでも存在できるもので、ユーザーが変更できるようにすると、さらに複雑になります。深度バッファを使用すると、私の生活がずっと簡単になると思います。
Nick Bolton、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.