我正在开发一个适用于 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/extrude.html
- http://analysissmusings.wordpress.com/2012/07/13/drawing-filled-concave-polygons-using-the-stencil-buffer/
...但仍然不清楚...
这是我的代码(实际上是其中一个,因为我测试了很多配置)和结果图片。实际上,我曾经将实际渲染放在为每个多边形调用的方法中,但我将其重写为非常清晰:
编辑
事实上,我知道我必须绘制每个三角形,以便反转模板缓冲区中的位值。所以我将我的代码重写为:
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 中渲染似乎是不可能的。