6

OpenGL で描画する必要がある凹面ポリゴンがあります。
多角形は、外側のリングを形成するポイントのリストと、内側のリング (除外ゾーン) を定義するポイントのリストのリストとして定義されます。

除外ゾーンは既に処理できるので、内部リングなしで多角形を描画する方法の解決策も良いでしょう。

Boost.Geometryを使用したソリューションは、アプリケーションで既に頻繁に使用しているため、適切です。

iPhone、つまり OpenGL ES (固定パイプラインを備えた古いバージョン) で動作させるには、これが必要です。

どうやってやるの?

4

3 に答える 3

6

OpenGLのテッセレーション機能を試してください。これを使用して、複雑なポリゴンを三角形のセットに変換し、直接レンダリングすることができます。

編集(コメントへの応答):OpenGLESはテッセレーション機能をサポートしていません。この場合、ポリゴンが静的データである場合は、デスクトップまたはノートブックコンピューターでOpenGLを使用してオフラインでテッセレーションを生成できます。

形状が動的である場合は、OpenGLESを使用できません。ただし、同じ機能を実行するライブラリ( CGALなど)は多数あります。

于 2011-10-08T00:40:34.730 に答える
2

これは少し複雑でリソースを消費する方法ですが、次の手順で任意の凹面多角形を描画できます (この方法は平面多角形で確実に機能しますが、平面または 2D 直交モードで描画しようとすることも前提としています)。 :

  • ステンシル テストを有効にする、使用するglStencilFunc(GL_ALWAYS,1,0xFFFF)
  • 不要な描画を防ぐためにカラー マスクを無効にします。glColorMask(0,0,0,0)
  • double の配列または他の形式で頂点を持っていると思います (このメソッドは同じポリゴンを複数回描画するため、強くお勧めしますが、glList または glBegin-glEnd を使用することもできます)。
  • 設定glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)
  • ポリゴンを GL_TRIANGLE_FAN として描画します

ステンシル レイヤーでは、多角形の三角形が描画されたビットが >0 に設定されています。秘訣は、すべての有効なポリゴン エリアが mod2=1 の値で満たされることです。これは、三角ファンの描画がポリゴン サーフェスに沿ってスイープするためであり、選択された三角形がポリゴンの外側にエリアを持っている場合、2 回描画されます (1 回で 1 回)。これは何度も発生する可能性がありますが、すべての場合において、ポリゴンの外側のピクセルは偶数回、内側のピクセルは奇数回描画されます。ピクセルの順序によって外側の領域が再び描画されない場合、いくつかの例外が発生する可能性があります。これらのケースをフィルタリングするには、逆方向の頂点配列を描画する必要があります (順序が切り替えられると、これらのケースはすべて適切に機能します): - set glStencilFunc(GL.GL_EQUAL,1, 1)これらのエラーが逆方向に発生するのを防ぐため(最初に描画されたポリゴン内の領域のみを描画できるため、他の方向に発生したエラーは表示されません。論理的には、これにより 2 つの半解の交差が生成されます) - ポリゴンを描画します逆の順序で、glStencilFunc を保持してスイープされたピクセル値を増やします これで、ピクセルが本当にポリゴンの内側にある pixel_value%2=1 の正しいステンシル レイヤーができました。最後のステップは、ポリゴン自体を描画することです: - 設定glColorMask(1,1,1,1)可視ポリゴンを描画する - glStencilFunc(GL_EQUAL,1,1) を保持して正しいピクセルを描画する - 同じモード (頂点配列など) でポリゴンを描画するか、照明/テクスチャリングなしで描画する場合は、単一の全画面長方形を使用できますも描画されます (すべての頂点を描画するよりも高速で、有効なポリゴン ピクセルのみが設定されます)

すべてがうまくいけば、ポリゴンが正しく描画されます。この関数の後で、ステンシルの使用をリセットするか (ステンシル テスト)、別の目的にも使用する場合はステンシル バッファーをクリアしてください。

于 2014-04-14T10:20:39.507 に答える
0

凹面ポリゴンを処理できるテッセレーション機能を備えたgluesをチェックしてください。

于 2012-11-07T18:01:28.597 に答える