正方形の「S」があるとしましょう。S が裂けて C が通過するように、円 'C' を通過させる必要があります。3D 効果を与える必要がありますが、2D でも問題ありません (少なくとも、有利なスタートを切ることができます)。組み込みの機能を使用してこれを行う方法、または個々のピクセルまたはオブジェクトの一部を変換する方法はありますか? オブジェクト内の穴をどのようにマッピングするのかわかりませんが、背景の色で穴の形のオブジェクトを作成して、穴のように見せることができますよね? しかし、本当の問題は、正方形の分割をどのように開くかです。(半分はどういうわけかバラバラになり、その後再び結合します)。
1 に答える
わかりました、「円を時間の経過とともに (フレームからフレームへ) 移動させ、円がある場所とかつてあった場所で四角形を消したい」ので、これは 2D だけなので、ステンシル バッファーを使用できます。
ステンシル バッファーは基本的に各ピクセルの整数値を格納し、この値を変更して新しく描画されたピクセルと比較し、ピクセルを描画から除外します。そのため、ステンシル バッファーに円を描画し (円のピクセルがある場合は 1 に設定)、次に円のピクセルが描画されていない場所 (ステンシル バッファーが 0 の場合) に正方形を描画します。「いつも」との唯一の違いステンシル アプローチは、フレーム間でステンシル バッファーをクリアしないことです。これにより、円が一度あったとしても、円の値が保持されます。したがって、時間の経過とともに円を画面上でスイープすると、円のピクセルがあった場所には正方形が描画されません (もちろん、円があったはずの場所にピクセルが描画されたのと同じ一時的な離散化エラーが発生しますが、そうではありませんでした)フレーム間の移動が速すぎます)。
そのため、最初に円をステンシル バッファーに描画します (円をステンシルのみに使用し、実際の円を画面に描画しない場合は、 で色の書き込みを無効にできますがglColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
、後で色の書き込みを再度有効にすることを忘れないでください)。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //but don't clear stencil
glEnable(GL_STENCIL_TEST); //use stenciling
glStencilFunc(GL_ALWAYS, 1, -1); //draw everywhere, use 1 as ref value
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); //set pixels to ref value (1)
//draw circle
glStencilFunc(GL_NOTEQUAL, 1, -1); //draw wherever not 1 (no circle pixels)
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //leave stencil values unchanged
//draw square
これは単なる基本的な例です。ステンシル バッファーは他の用途にも使用できます。現時点では、すでに描画されている別のオブジェクトの背後にあるかどうかに関係なく、円はステンシル値を変更しますが、値を変更することで微調整できますglStencilOp
(ステンシル テストが失敗したかどうかに応じてステンシル値を変更する方法を構成します)。成功して深さテストが失敗したか、両方が成功した)、glStencilFunc
どのテストをどの参照値 (新しく描画されたオブジェクトの値) に対して実行するかを制御します。しかし、この例とリンクされたドキュメントは、あなたが問題を始めるのに役立つはずです.
ただし、ステンシル バッファーは実際には「オンザフライ」のイメージ空間ステンシル操作用であることを覚えておいてください。これがさらに複雑になり、オブジェクトに対して実際の幾何学的操作を実行する必要がある場合、またはこれを 3D で実行する必要がある場合 (キーワード: Constructive Solid Geometry (CSG) )、OpenGL はその仕事に適したツールではありません。この場合、実際のジオメトリ ライブラリが最適です。OpenGL が行うのは、単純なもの (点、線、三角形など) を画面に描画することだけです。これは、シーン管理でも、ジオメトリでも、画像処理ライブラリでもありません (ただし、後者で「誤用」される可能性はそれほど難しくありません)。