Dibujar contorno alrededor del objeto en Opengl

8

Necesito dibujar el contorno alrededor de objetos 2D en el espacio 3D. Intenté dibujar líneas alrededor del objeto (+ puntos para llenar el espacio), pero debido al ancho de la línea, una parte (~ 50%) cubría el objeto. Intenté usar el búfer de plantilla para eliminar este problema, pero obtuve algo como esto (el contorno es verde):

http://goo.gl/OI5uc (lo siento, no puedo publicar imágenes, debido a mi reputación)

Puede ver (donde los puntos de flecha), que algunas partes de la línea están detrás del objeto, y algunas están arriba. Esto cambia cuando muevo la cámara, pero siempre hay una parte que la cubre. Aquí hay un código que uso para dibujar 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;
    }

He intentado diferentes configuraciones de búfer de plantilla, pero siempre estaba obteniendo algo así. Aquí está la pregunta: 1. ¿Estoy configurando mal el búfer de la plantilla?

2. ¿Hay otras formas simples de crear contornos en tales objetos?

Gracias por adelantado.

EDITAR:

1. No tengo normales de objetos.

2. El objeto puede ser cóncavo.

3. No puedo usar sombreadores (ver abajo por qué).

therealszaka
fuente
Puede consultar 'toon' o sombreado de celda, donde hay un contorno dibujado alrededor de un objeto. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell
El caso es que no puedo utilizar shaders en este proyecto ...
therealszaka
@Maciekp ¿Por qué no puedes usar sombreadores? ¿Es esta tarea?
Jonathan Connell
Esta aplicación tendrá que funcionar en muchas computadoras, no siempre la más nueva (eso es 1 punto) .2. No es un juego, esta es una aplicación con gráficos como parte de ella + tendrá que funcionar en Mac, Win, Linux.
therealszaka
1
Tal vez debería haber sido publicado en SO si no fuera por GameDev y debería dar la mayor información posible si desea que su pregunta sea respondida.
Jonathan Connell

Respuestas:

12
  • Dibuja toda tu escena, excepto los objetos resaltados.
  • Dibuje los objetos que desea resaltar, en color puro, ordenados de atrás hacia adelante y con una pequeña escala aplicada (1.05f - 1.1f).
  • Dibuja los objetos finales, de nuevo, de atrás hacia adelante.

Para un toque visual extra, intente dibujar el pase de contorno a un objetivo de renderizado separado y aplique un pequeño desenfoque, luego mezcle esta textura con su escena final utilizando los valores Z apropiados.

r2d2rigo
fuente
¡Este es un gran truco de Barba!
FxIII
Este es el viejo truco que usaban para contornos cuando la tubería gfx todavía estaba arreglada.
Jonathan Connell
2
Eso no funcionará para objetos cóncavos
therealszaka
@Maciekp Su pregunta era sobre objetos 2D (planos) en el espacio 3D, ¿dónde entra el cóncavo? Simplemente escala a lo largo de los dos ejes! = A la dirección de la cara.
Jonathan Connell
Se debe trabajar para objetos cóncavos Si invierte las normales (debe tener habilitado el rostro, selección) mientras que el dibujo de los contornos.
r2d2rigo
0

Haré esto así:

  • Ordenar objetos en orden de adelante hacia atrás (distancia desde la cámara)

  • Dibuje el borde del objeto (como líneas y puntos) con deshabilitado GL_DEPTH_TEST

  • Dibujar objeto con habilitado GL_DEPTH_TEST

  • Haz los dos últimos pasos para cada objeto

Intentaré hacer esto de esa manera, pero si alguien tiene ideas de una mejor solución a este problema (OBJETOS DE CÓNCAVO MENTE, POR FAVOR), siéntase libre de compartirlo con nosotros.

PD. No estoy completamente satisfecho con mis estados de OpenGL que cambian la solución, por lo que a menudo pueden ser dañinos. Pero si nadie puede ayudarme con la configuración del búfer de plantilla, supongo que esa es la única manera para mí.

therealszaka
fuente