Uso de GL_STENCIL_TEST para renderizar polígonos côncavos

Estou trabalhando em uma biblioteca de geometria personalizada adaptada ao Quartz Composer e tentando desenhar alguns polígonos côncavos em um Plug In.

Eu implementei a biblioteca poly2tri, para que o usuário possa optar por triangular ou não, mas não é adequado para uma renderização de transformações de polígono por quadro.

Eu sou um noob no OpenGL e tenho lido e testado muito, sobre buffer de estêncil e operações ímpares / par, mas mesmo o código que parece funcionar para outras pessoas, não funciona para mim.

O contexto de renderização é um CGLContextObj e estou trabalhando em um Retina Display do MacBook Pro, com NVidia GEForce GT650. Eu li que todas as configurações não têm buffers de estêncil, mas parece que funciona às vezes, embora não como eu gostaria que fosse.

Eu queria saber se alguém com o mesmo tipo de configuração estava usando um código que funciona e poderia dar uma olhada no meu código. Em particular, estou curioso também sobre o número de passes solicitados, de acordo com o número de vértices ou "defeitos de convexidade", eu acho ...

Eu tirei minhas informações de:

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/

... mas ainda não está claro ...

Aqui está o meu código (um deles, na verdade, já que testei tantas configurações) e uma imagem do resultado. Na verdade, eu uso para colocar a renderização real em um método chamado para cada polígono, mas reescrevi para ser muito claro:

EDITAR

Na verdade eu entendi que eu tenho que desenhar cada triângulo, a fim de inverter o valor do bit no buffer de estêncil. Então eu reescrevi meu código para isso:

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);

Mas ainda não funciona. Aqui está o meu resultado e o link para a imagem original e a explicação.

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

EDIT 2:

De fato, o contexto habilitado pelo Quartz Composernão implementa um buffer de estêncil. Parece impossível renderizar diretamente no OpenGL com o buffer de estêncil.

questionAnswers(1)

yourAnswerToTheQuestion