5

私は iOS OpenGL ES 2.0 3D ゲームを持っており、フェンスのこの特定の例では、透明なテクスチャがうまく機能するように取り組んでいます。

最終結果から始めます。緑の背景/透明色のビットがフェンスの端の周りを通ってきています - すべての端ではなく、一部は問題ないことに注意してください:

背景出血の証拠

右上のにじみがないのは操作の順番です。次のショットからわかるように、描画の順序には、フェンスの前に描画される建物が含まれています。しかし、そのほとんどはフェンスの後にあります。

奥行きのある進行を描く

したがって、1 つの解決策は、透明なテクスチャ オブジェクトを常に最後に描画することです。私のパイプラインが常にこれを許可するとは限らないため、他のソリューションを検討したいと思います。ドローをソートせずにこの問題を解決するための他の提案を探しています。

これはおそらく深度またはブレンド関数ですが、私はたくさんのものを試しましたが、何も機能していないようです (異なるブレンド関数、異なる破棄アルファ レベル、異なる背景色、異なるテクスチャ設定)。

ここに私の実装のいくつかの詳細があります。

私のフラグメント シェーダーでは、透明度のあるフラグメントを捨てています。この方法では、深さまでレンダリングされません。

lowp vec4 texVal = texture2D(sTexture, texCoord);
if(texVal.w < 0.5)
    discard;

私はミップマッピングで1つの巨大なPVRテクスチャアトラスを使用しています - テクスチャ自体はアルファのために0または1を持つべきですが、ブレンドの何かがこれを引き起こしている可能性があります:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

レンダリング時に次のブレンドを使用しています。

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

この出血を修正するための提案は素晴らしいでしょう!

編集 - コメント、LINEAR/NEAREST で提案されているように、テクスチャに対して別の最小フィルターを試しましたが、同じ結果になりました。私もNEAREST/NEARESTを試しましたが、うまくいきませんでした:

ここに画像の説明を入力

4

2 に答える 2

1

アルファ フィルターの制限を増やしてみてください。

lowp vec4 texVal = texture2D(sTexture, texCoord); if(texVal.w < 0.9) discard;

于 2013-03-19T06:33:34.013 に答える