iPadアプリで線を引くためにOpenGLES1.1を使用しています。ユーザーが色を選択できないように、背景色に関係なく、描画された線が常に画面に表示されるようにしたいです。この効果を生み出すブレンド機能はありますか?したがって、描画される線の色は、その下に既に描画されている色に基づいて変化するため、常に表示されます。
2 に答える
悲しいことに、フレーム バッファへのフラグメントの最終的なブレンドは、まだ機能が固定されています。さらにglLogicOp
、ESには実装されていないため、XOR描画のような安価なことはできません。
正味の効果は次のとおりだと思います。
- 出力カラーを、既にフレーム バッファーにあるカラーのカスタム関数にしたい。
- ただし、シェーダーでフレーム バッファーを読み取ることはできません (パイプラインが中断され、同時実行の問題が発生する可能性があります)。
したがって、ピンポン パイプラインを実装する必要があります。
2 つのオフスクリーン バッファがあります。1 つは最後のフレームを出力したものを表し、もう 1 つはその前のフレームを出力したものを表します。
新しいフレームを生成するには、前のフレームを表すフレームを入力として使用してレンダリングします。これは入力であるため、好きな場所でサンプリングして、好きな計算を行うことができます。もう一方のバッファ (つまり、さらに古いもの) にレンダリングするのは、その内容を気にしなくなったからです。
次に、それらすべてを画面にコピーし、2 つを入れ替えます。つまり、描画したばかりのものは、前のフレームで描画したものとして参照するテクスチャ内に残っています。あなたが今参照したものは、あなたが都合よくすでに転がっているものなので、次の描画対象になります。
したがって、テクスチャへのレンダリングにすぐに興味を持つでしょう。また、既存の背景に適切な「異なる」色を選択するために使用する関数を決定する必要があります。多分それを反転するだけでうまくいくでしょうか?
私はこれがうまくいくと思います:
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
白い色で線を引くと、結果は次のようにレンダリングされます
[1,1,1,1] * ( 1 - [DstR, DstG, DstB, DstA]) + ([DstR, DstG, DstB, DstA] * 0)
これは、背景が白の場合は黒のピクセル、背景が黒の場合は白のピクセル、背景が青の場合は黄色のピクセルなどをレンダリングする必要があります。