Использование 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);

Но это все еще нет работа. Вот мой результат и ссылка на оригинальное изображение и объяснение.

http://what-when-how.com/opengl-programming-guide/drawing-filled-concave-polygons-using-the-stencil-buffer-opengl-programming/

РЕДАКТИРОВАТЬ 2:

На самом деле, контекст включен Quartz ComposerБезразлично»реализовать буфер трафарета, Кажется невозможным отрисовывать напрямую в OpenGL с помощью буфера трафарета.

Ответы на вопрос(1)

Ваш ответ на вопрос