Preciso desenhar contornos em torno de objetos 2D no espaço 3D. Tentei desenhar linhas ao redor do objeto (+ pontos para preencher a lacuna), mas devido à largura da linha, parte dela (~ 50%) estava cobrindo o objeto. Tentei usar o buffer de estêncil para eliminar esse problema, mas fiquei sth assim (o contorno é verde):
http://goo.gl/OI5uc (desculpe, não posso postar imagens, devido à minha reputação)
Você pode ver (onde a seta aponta) que algumas partes da linha estão atrás do objeto e outras estão acima. Isso muda quando movo a câmera, mas sempre há uma parte que está cobrindo. Aqui está o código que eu uso para desenhar objetos:
glColorMask(1,1,1,1);
std::list<CObjectOnScene*>::iterator objIter=ptr->objects.begin(),objEnd=ptr->objects.end();
int countStencilBit=1;
while(objIter!=objEnd)
{
glColorMask(1,1,1,1);
glStencilFunc(GL_ALWAYS,countStencilBit,countStencilBit);
glStencilOp(GL_REPLACE,GL_KEEP,GL_REPLACE );
(*objIter)->DrawYourVertices();
glStencilFunc(GL_NOTEQUAL,countStencilBit,countStencilBit);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
(*objIter)->DrawYourBorder();
++objIter;
++countStencilBit;
}
Eu tentei diferentes configurações do buffer de estêncil, mas sempre estava ficando sth assim. Aqui está a pergunta: 1. Estou definindo o buffer de estêncil errado?
2. Existem outras maneiras simples de criar contorno em tais objetos?
Desde já, obrigado.
EDITAR:
1. Eu não tenho normais de objetos.
2. O objeto pode ser côncavo.
3. Não consigo usar shaders (veja abaixo o porquê).
Respostas:
Para obter mais colírio para os olhos, tente desenhar a passagem do contorno para um alvo de renderização separado e aplique um pequeno borrão, depois misture essa textura com a cena final usando os valores Z adequados.
fonte
Vou fazer assim:
Classificar objetos na ordem frente-trás (distância da câmera)
Desenhar borda do objeto (como linhas e pontos) com desativado
GL_DEPTH_TEST
Desenhar objeto com ativado
GL_DEPTH_TEST
Execute as duas últimas etapas para cada objeto
Vou tentar fazer isso assim, mas se alguém tiver idéias de uma solução melhor para esse problema (MENTE CONCAVE OBJECTS, POR FAVOR) - fique à vontade para compartilhar conosco.
PS. Não estou totalmente satisfeito com meus estados de OpenGL que alteram a solução com tanta frequência que podem ser prejudiciais. Mas se ninguém puder me ajudar com as configurações do buffer de estêncil, acho que esse é o único caminho para mim.
fonte