Desenhar contorno ao redor do objeto no Opengl

8

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ê).

therealszaka
fonte
Você pode verificar 'toon' ou sombreamento de célula, onde há um contorno desenhado ao redor de um objeto. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell
O caso é que não posso usar sombreadores neste projeto ...
therealszaka
@Maciekp Por que você não pode usar shaders? Isso é lição de casa?
Jonathan Connell
Este aplicativo terá que funcionar em muitos computadores, nem sempre o mais novo (isso é 1 ponto). Não é um jogo, este é um aplicativo com gráficos como parte dele + terá que trabalhar no mac, win, linux.
therealszaka
11
Talvez devesse ter sido publicado no SO, se não for para o GameDev e você deve fornecer o máximo de informações possível se quiser que sua pergunta seja respondida.
Jonathan Connell

Respostas:

12
  • Desenhe sua cena inteira, exceto os objetos destacados.
  • Desenhe os objetos que deseja realçar, em cores puras, ordenadas de trás para frente e com uma pequena escala aplicada (1.05f - 1.1f).
  • Desenhe os objetos finais, novamente, de trás para frente.

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.

r2d2rigo
fonte
Este é um ótimo truque de Barba!
FxIII 27/06
Esse é o velho truque que eles usaram para descrever quando o pipeline gfx ainda estava corrigido.
Jonathan Connell
2
Isso não vai funcionar para objetos côncavos
therealszaka
@Maciekp Sua pergunta era sobre objetos 2D (aviões) no espaço 3D, de onde é côncavo? Apenas faça a escala ao longo dos dois eixos! = Na direção da face.
Jonathan Connell
Ele deve trabalhar para objetos côncavos Caso inverta as normais (você deve ter rosto abate habilitado) enquanto desenha os contornos.
R2d2rigo
0

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.

therealszaka
fonte