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é).
Respuestas:
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.
fuente
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í.
fuente