1

長方形のみを含むかなり単純な 2D シーンを描いています。各頂点の X、Y、Z、R、G、B、A、U、および V データを入れる 1 つの FloatBuffer があります。glDrawArraysと を使用して描画しGL_TRIANGLE_STRIP、縮退した頂点で四角形を分離します。

複数のテクスチャを使いやすくするために、テクスチャの描画呼び出しごとに別々の float 配列を保持しています。テクスチャがバインドされ、float 配列が FloatBuffer に入れられ、描画します。次に、次のテクスチャがバインドされ、このレンダリング用にすべてのテクスチャを描画するまでこれが続きます。

Z 座標を使用しGL_DEPTH_TEST、描画順序とは別に深さを設定できるように、正射投影を使用します。

アルファブレンディングを使用するには、インターネット上のすべてのアドバイスが次のように言っているようです。

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

これは、各テクスチャの「描画」ごとに正常に機能します。これは、描画する前に描画呼び出しをバッファ内で後ろから前にソートしているためです。深度テストとテクスチャ 1 がテクスチャ 2 の前に描画されるため、部分的に透明なテクスチャ 1 の下にテクスチャ 2 を正しく描画する方法がありません。深度テストで texture1 が texture2 の前にあることが示されているため、texture1 は texture2 のオーバーラップ部分を切り落とします。

これを回避する唯一の方法は、1) プログラム全体で 1 つのテクスチャのみを使用すること、および 2) 透明なテクスチャを使用しないことです。これらはどちらも受け入れられるオプションではありません。

基本的に、後ろから前に並べ替える必要なく、アルファブレンディングを行う方法が必要です。これは可能ですか?

4

1 に答える 1

1

Depth Peelingを実行する必要があるようです。やり方をまとめたPDFです。

于 2013-07-11T04:24:08.610 に答える