Quartz Composer に適合したカスタム ジオメトリ ライブラリに取り組んでおり、プラグインでいくつかの凹面ポリゴンを描画しようとしています。
poly2tri ライブラリを実装したので、ユーザーは三角形化するかどうかを選択できますが、フレームごとのポリゴン変換レンダリングには適していません。
私は OpenGL の初心者で、ステンシル バッファと奇数/偶数操作について多くのことを読んでテストしてきましたが、他の人にとってはうまくいくように見えるコードでさえ、私にとってはうまくいきません。
レンダー コンテキストは CGLContextObj で、NVidia GEForce GT650 を搭載した MacBook Pro Retina ディスプレイで作業しています。すべての構成にステンシル バッファーがないことを読みましたが、私が望んでいるとは限りませんが、時々機能するように見えます。
同じ種類の構成を持つ誰かが機能するコードを使用していて、私のコードを見ることができるかどうか疑問に思っていました。特に、頂点の数または「凸欠陥」に応じて、要求されたパスの数についても興味があります...
から情報を取得しました:
- http://fly.cc.fer.hr/~unreal/theredbook/chapter13.html
- http://commaexcess.com/articles/7/concave-polygon-triangulation-shortcut
- http://graphicsbb.itgo.com/solutions/trusion.html
- http://analysesmusings.wordpress.com/2012/07/13/drawing-filled-concave-polygons-using-the-stencil-buffer/
...しかし、まだ明確ではありません...
これが私のコード(実際には、非常に多くの構成をテストしたため、そのうちの1つです)と結果の写真です。実際には、各ポリゴンに対して呼び出されるメソッドに実際のレンダリングを配置していましたが、より明確になるように書き直しました。
編集
実際、ステンシル バッファのビット値を反転するために、各三角形を描画する必要があることを理解しました。だから私はこれに私のコードを書き直しました:
CGLContextObj cgl_ctx = [context CGLContextObj];
CGLLockContext(cgl_ctx);
GLenum error;
if(cgl_ctx == NULL)
return NO;
glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glClear(GL_STENCIL_BUFFER_BIT);
glClearStencil(0);
glEnable(GL_STENCIL_TEST);
glStencilOp(GL_INVERT, GL_INVERT, GL_INVERT);
glStencilFunc(GL_ALWAYS, 1, 1);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
// glColor4d(1., 1., 1., 1.); ----> does it make sense ?
glBegin(GL_TRIANGLE_FAN); {
for (int i = 1; i < [vertices count] - 1; i++) {
// Allways drawing the first vertex
glVertex2d([[[vertices objectAtIndex:0] objectAtIndex:0] doubleValue], [[[vertices objectAtIndex:0] objectAtIndex:1] doubleValue]);
// Then two others to make a triangle
glVertex2d([[[vertices objectAtIndex:i] objectAtIndex:0] doubleValue], [[[vertices objectAtIndex:i] objectAtIndex:1] doubleValue]);
glVertex2d([[[vertices objectAtIndex:i+1] objectAtIndex:0] doubleValue], [[[vertices objectAtIndex:i+1] objectAtIndex:1] doubleValue]);
}
}
glEnd();
glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
glStencilFunc(GL_EQUAL, 1, 1);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glColor4d(1., 0., 0., 0.5);
glBegin(GL_TRIANGLE_FAN); {
for (id vertex in vertices) {
glVertex2d([[vertex objectAtIndex:0] doubleValue], [[vertex objectAtIndex:1] doubleValue]);
}
glVertex2d([[[vertices objectAtIndex:0] objectAtIndex:0] doubleValue], [[[vertices objectAtIndex:0] objectAtIndex:1] doubleValue]);
}
glEnd();
glDisable (GL_STENCIL_TEST);
glDisable(GL_BLEND);
glPopClientAttrib();
glPopAttrib();
if((error = glGetError()))
NSLog(@"OpenGL error %04X", error);
CGLUnlockContext(cgl_ctx);
return (error ? NO : YES);
しかし、それでもうまくいきません。これが私の結果と、元の画像と説明へのリンクです。
編集2:
実際、Quartz Composer によって有効化されたコンテキストは、ステンシル バッファーを実装していません。ステンシル バッファを使用して OpenGL で直接レンダリングすることは不可能のようです。