これは少し複雑でリソースを消費する方法ですが、次の手順で任意の凹面多角形を描画できます (この方法は平面多角形で確実に機能しますが、平面または 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) を保持して正しいピクセルを描画する - 同じモード (頂点配列など) でポリゴンを描画するか、照明/テクスチャリングなしで描画する場合は、単一の全画面長方形を使用できますも描画されます (すべての頂点を描画するよりも高速で、有効なポリゴン ピクセルのみが設定されます)
すべてがうまくいけば、ポリゴンが正しく描画されます。この関数の後で、ステンシルの使用をリセットするか (ステンシル テスト)、別の目的にも使用する場合はステンシル バッファーをクリアしてください。