記事OpenGL のクリッピングで説明されている問題に関して、新たな疑問が生じます。
ノードベースの 2D シーン グラフのクリッピングを実装しています。クリッピング ボックスの軸が揃っているときは常に、 OpenGL クリッピングで提案されているように glScissor を使用してい ます。軸が揃ったボックスのノード クリッピングを正常に実装しました。
各ノードは、クリッピングを使用する祖先のクリッピング四角形と交差する必要があることがわかります。(これは、先祖のクリッピング ボックスと重なる兄弟の場合に必要です)。
軸が揃っていない長方形を交差させるメカニズムは、ステンシル バッファーを使用して実装する必要があります。OpenGL クリッピングで提案されたソリューションの実装を開始しましたが、先祖のものと重なっているクリップ四角形を持つ子供に問題があります。
現在、ステンシル クリッピングは 1 つのクリッピング ボックスで完全に機能します。しかし、祖先と交差する子または孫の場合、アルゴリズムは失敗します。これは、子の完全な四角形ではなく、マスクとして (軸に沿ったバージョンのように) 2 つの関連する四角形の交差がここで必要になるためです。
私は次のアルゴリズムを考えました:
The topmost node writes start with a counter value of 1 and draws it's clippingrectangle with 1s to the stencil buffers and renders it's children stencil-testing against 1. クリッピングがオンになっている各兄弟は、境界の四角形に1 を追加して描画します。ステンシル バッファーを使用してから、2 に対してテストを行います。兄弟のクリッピング四角形が祖先の四角形とオーバーラップすると、それらがオーバーラップする領域が 2 で埋められ、2 に対するテスト時に完全なクリッピングが得られます。このアルゴリズムは、最大 255 のネストされたクリッピング ノードに拡張できます。
ここに私の質問があります:
レンダリングが実行されるたびに、1 が書き込まれる代わりに、現在のステンシル バッファー値に 1 が追加されるように、ステンシル バッファーへのレンダリングを実行するにはどうすればよいですか。
これは、ステンシル バッファーへのレンダリングの準備に使用するコードです。
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, ref, mask);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
ref をバッファーに書き込むのではなく、ステンシル バッファーの現在の値を ref の値だけ増やすセットアップを探しています。
誰かが私を助けることができますか?