Использование GL_STENCIL_TEST для рендеринга вогнутых полигонов
я работаю над пользовательской библиотекой геометрии, адаптированной для Quartz Composer, и пытаюсь нарисовать несколько вогнутых многоугольников в плагине.
Я реализовал библиотеку poly2tri, чтобы пользователь мог выбрать триангуляцию или нет, ноне подходит для рендеринга многокадровых преобразований полигонов.
я нуб в OpenGL и яЯ много читал и тестировал, о буфере трафарета и нечетных / четных операциях, но даже код, который, кажется, работает для других людей, не делаетя не работаю
Контекст рендеринга является CGLContextObj, и я 'я работаю на MacBook Pro Retina Display с NVidia GEForce GT650. Я читал, что все конфигурации неу меня нет трафаретных буферов, но похоже, что иногда это работает, хотя и не так, как хотелось бы.
Мне было интересно, если кто-то с такой же конфигурацией использует код, который работает и может взглянуть на мой код. В частности, яМне также интересно узнать количество запрошенных проходов в зависимости от количества вершин илидефекты выпуклости " Похоже...
Я взял мою информацию от:
http://fly.cc.fer.hr/~unreal/theredbook/chapter13.htmlhttp://commaexcess.com/articles/7/concave-polygon-triangulation-shortcuthttp://graphicsbb.itgo.com/solutions/extrude.htmlhttp://analysesmusings.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 с помощью буфера трафарета.