私は 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を試しましたが、うまくいきませんでした: