ここには2つの問題があると思います。
ここでは、すべてのオーバーレイラインが2回ブレンドされていることに注意してください。1回はFBOテクスチャにブレンドされたとき、もう1回はFBOテクスチャがシーン全体にブレンドされたときです。
したがって、最初の可能性は、FBOオーバーレイで1つの線を別の線の上に描画するときに、ブレンドが有効になっていないことです。ブレンドオフしてRGBAサーフェスに描画すると、現在のアルファがFBOオーバーレイのアルファチャネルに直接書き込まれます。その後、シーン全体でFBOテクスチャ全体をブレンドすると、そのアルファによってラインが半透明になります。したがって、「世界」に対してブレンドしているが、オーバーレイ要素間ではブレンドしていない場合は、ブレンドが行われていない可能性があります。
別の関連する問題:FBOの「標準」ブレンドモード(src alpha、1-src alpha)であるラインを別のラインにブレンドすると、「ブレンドされた」部分のアルファチャネルに2つのオーバーレイ要素。これはおそらくあなたが望むものではありません。
たとえば、オーバーレイで2本の50%アルファ線を重ねて描画する場合、FBOをブリットしたときに同等の効果を得るには、FBOのアルファを75%にする必要があります。(つまり、1-(1-.5)*(1-0.5)は、シーン上に2本の50%アルファ線を描画した場合に発生します。ただし、2本の50%線を描画すると、 FBOで50%のアルファを取得します(50%と... 50%のブレンド。
これにより、最後の問題が発生します。世界中で線をブレンドする前に線を事前に混合することで、描画順序を変更します。あなたが持っていたかもしれないのに対して:
ブレンド(ブレンド(ブレンド(背景色、モデル)、最初の行)、2番目の行);
今、あなたは持っているでしょう
blend(blend(1行目、2行目)、blend(背景色、モデル))。
つまり、オーバーレイラインをFBOにプレミキシングすると、ブレンディングの順序が変更され、最終的な外観が望ましくない方法で変更されます。
まず、これを回避する簡単な方法:FBOを使用しないでください。これは「アプリを再設計する」という答えだと思いますが、FBOを使用するのは最も安価な方法ではなく、最新のGLカードは線を引くのに非常に優れています。したがって、1つのオプションは次のようになります。ラインをFBOにブレンドする代わりに、ラインジオメトリを頂点バッファオブジェクト(VBO)に書き込みます。毎回VBOを少し拡張するだけです。たとえば、一度に40,000本未満の線を描画する場合、これはほぼ確実に以前と同じ速度になります。
(このルートを使用する場合のヒント:glMapBufferではなくglBufferSubDataを使用して行を書き込みます-マッピングはコストがかかる可能性があり、多くのドライバーのサブ範囲では機能しません...ドライバーにいくつかの新しい頂点をコピーさせる方がよい。)
それがオプションではない場合(たとえば、形状タイプを組み合わせて描画したり、GL状態を組み合わせて使用したりして、頂点を蓄積するよりも、行ったことを「記憶」する方がはるかに複雑な場合)、 VBOへの描画方法を変更します。
基本的に、あなたがする必要があるのは、別々のブレンドを有効にすることです。オーバーレイを黒+0%アルファ(0,0,0,0)に初期化し、RGBを「標準ブレンド」してブレンドしますが、アルファチャネルを加法ブレンドします。これはまだアルファチャネルには完全には正しくありませんが、一般的にははるかに近いです-これがないと、過剰に描画された領域は透明になりすぎます。
次に、FBOを描画するときに、「事前に乗算された」アルファ、つまり(one、one-minus-src-alph)を使用します。
その最後のステップが必要な理由は次のとおりです。FBOに描画するとき、すべての描画呼び出しにそのアルファチャネルをすでに乗算しています(ブレンディングがオンの場合)。黒の上に描画しているため、緑(0,1,0,0.5)の線は濃い緑(0,0.5,0,0.5)になります。アルファがオンで、通常どおりに再度ブレンドすると、アルファが再適用され、0,0.25,0,0.5になります。)FBOカラーをそのまま使用するだけで、2回目のアルファ乗算を回避できます。
これは、アルファがすでにRGBカラーに乗算されているため、「事前乗算」アルファと呼ばれることもあります。この場合、正しい結果が得られるようにしたいのですが、それ以外の場合、プログラマーは速度を上げるためにそれを使用します。(事前に乗算することにより、ブレンド操作が実行されたときにピクセルごとのマルチを削除します。)
お役に立てば幸いです。レイヤーが順番に混合されていないときにブレンドを正しく行うことは非常に難しいことであり、古いハードウェアでは個別のブレンドを使用できないため、毎回線を引くだけで最も悲惨な道はないかもしれません。