OpenGL で描画の一部を消去できるかどうかを知りたいですか? マウスで 2 本の線を描いたところ、それらの線がいくつかの点で重なっているとしましょう。
1行だけ消すことはできますか?多かれ少なかれ単純なアプローチはありますか?
OpenGL は描画したものを保存しません。OpenGL で線を描画すると、OpenGL はその線を取得し、さまざまな数学演算を実行して、線の形状を作成するフレーム バッファーにピクセルを書き込みます。OpenGL は線を描いたことを覚えていません。OpenGL ができることは、ピクセルをフレームバッファに書き込むことだけです。
一般的な考え方は、OpenGL のユーザーが何を描いたかを覚えているかどうかにかかっているということです。したがって、2 本の線を引く場合は、その 2 本の線に指定した座標を覚えておく必要があります。したがって、行を「消去」したい場合は、画面をクリアして、その行以外をすべて再描画します。
これは、聞こえるほどばかげたことではありません。多くの OpenGL アプリケーションは、常に画面を再描画しています。フレームを表示し、新しいフレームを描画し、そのフレームを表示するなどです。これにより、アニメーションの可能性が提供されます。フレームごとに描画されるものと描画される場所を変更します。これにより、動きの錯覚が生まれます。
でglLogicOpを使用しGL_XOR
てから、線を再描画して消去することができます。これは一般的な解決策ではありませんが、従来使用されていたマーキー選択やマウス ツール オーバーレイに適しています。シングルバッファリングを使用するか、バックバッファとフロントバッファを交換するのではなくコピーする必要があることに注意してください。
私があなたを正しく理解した場合、2つのアプローチがあります。
必要な要素のみを再描画します。各要素には、描画するかどうかを示すブール値が必要です。
ウィンドウの一部だけを消去する必要がある場合は、glScissor を使用します。
情報:
今、何か新しいもののために。glScissor(x,y,w,h) という素晴らしい GL コマンド。このコマンドが行うことは、いわゆるウィンドウを作成することです。GL_SCISSOR_TEST が有効な場合、変更できる画面の部分は、シザー ウィンドウ内の部分だけです。
バッファをクリアして、必要な行を再描画する必要があります。そのためには、おそらく行データを何らかの構造に格納する必要があります。
ステンシル バッファー テクニックを試すことができます。シャドウ ボリュームに関する J. Carmack テクニック (逆ステンシルなど) を参照してください。