0

OpenGL ES には XOR 描画モードがありますか? そのモードで立方体を描画し、次に立方体と交差する球を描画すると、出力は立方体の一部と球の一部になりますが、交差は空になります。

4

1 に答える 1

3

投影後の両方のオブジェクトの画像空間の交差が必要であり、立方体と球体の実際の幾何学的交差が必要な場合 (これは OpenGL の目的ではないため)、これにはステンシル バッファーを使用できます。

最初に、ステンシル バッファーがあることを確認します (コンテキスト作成フレームワークによって異なります。Cocos3D がどのように行うかはわかりませんが、OpenGL ES 1 自体がステンシル テストをサポートしています)。次に、もちろん、立方体と球体の処理を行う前にステンシルを有効にし、フレームの開始時にステンシル バッファーをクリアします (おそらく他のバッファーと一緒に):

glClear(... | GL_STENCIL_BUFFER_BIT);
...
glEnable(GL_STENCIL_TEST);

0最初に、立方体をステンシル バッファーにのみレンダリングし、描画されたピクセルごとに ( から始まる) ステンシル値をインクリメントします。

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); //don't really draw anything
glStencilFunc(GL_ALWAYS, 0, -1);    //always pass the test (default anyway)
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);  //increment for each drawn pixel
//draw object

次に、球体についても同じことを行います。その後、ステンシル バッファには1、立方体ピクセルまたは球体ピクセルが存在するすべての2場所と、立方体および球体ピクセルが存在するすべての場所があります。

次に、通常どおり両方を描画しますが、ステンシル バッファーがない2場所 (または必要に1応じてある場所) のみを描画するため、交差点には何も描画しません。

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);  //draw something
glStencilFunc(GL_NOTEQUAL, 2, -1);      //draw everywhere except at intersection
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);    //leave the stencil buffer as is
//draw cube
//draw sphere

最後に、ステンシル テストを再度無効にします ( glDisable(GL_STENCIL_TEST))。

これは基本的な例にすぎませんが、非常に強力なステンシル バッファーを使用するための出発点となるはずです。

現時点では、すべてが深度テストの結果に依存しています。つまり、オブジェクトを描画する順序に依存しています。深度とは無関係にしたい場合 (したがって、2D 画面投影のみを考慮)、次のことができます。深度テストを行わずにオブジェクトを描画するか、 の 2 番目のパラメーターglStencilOp(ステンシル テストはパスしたが深度テストが失敗した場合に実行される操作) も に設定しGL_INCRます。

現時点では、背面カリングが有効になっている場合にのみ機能します。そうしないと、オブジェクトごとにステンシル値が 2 回インクリメントされ (少なくとも深さを無視すると)、非凸オブジェクトの場合はさらに悪化するためです。他のステンシル操作を使用してタスクを実行することもできますが、残念ながら OpenGL ES 1 はステンシル値のバイナリ操作とラッピング操作をサポートしていないようです (したがって、デクリメント0は再び0です)。

編集:わかりました、3D オブジェクト間の幾何学的な交差 (またはむしろ違いのように見えます) が本当に必要です。それでは、あなたの問題は OpenGL 自体では解決できません。OpenGL は他に何もせず、単純なプリミティブ (点、線、および三角形) を画面に描画します。シーン管理システムでもジオメトリ ライブラリでもありません。あなたが達成しようとしていることはそれほど単純な作業ではありません (ただし、立方体や球体などの単純なオブジェクトを使用すると確かに役立ちます)。おそらく、メッシュ (またはConstructive Solid Geomtry (CSG) )のブール演算用のジオメトリ ライブラリを探す必要があります。通常どおり OpenGL で描画できる三角形メッシュとしての適切な幾何学的差異。

前述の「3D ステンシル バッファー」の概念に似た別のオプションは、通常のグリッドを使用して空間を離散化し、オブジェクトを小さなボクセル (3D ピクセル、小さなボックスと考えてください) に分割することです。これらの離散有限ボクセル セットでは、ブール演算は非常に簡単です。しかし、もちろん、このアプローチには、離散化エラーとパフォーマンス オーバーヘッドが発生するという代償が伴います (ボクセルを操作するということは、大きなデータ セットを操作することを意味します。CSG も簡単ではありませんが、おそらく O(n^3) よりも複雑です)。また、ボクセル セットからレンダリング可能なオブジェクトを再作成する必要があります。サーフェス抽出方法を使用してメッシュを再度取得するか、小さなポイントまたはボックスを描画するだけです。

最終的には、適切な CSG ライブラリを使用するのがおそらく最善の策です。いずれにしても、OpenGL はそれとは何の関係もありません。

于 2013-02-27T15:01:59.780 に答える