Dessiner un contour autour d'un objet dans Opengl

8

J'ai besoin de dessiner des contours autour d'objets 2D dans un espace 3D. J'ai essayé de dessiner des lignes autour de l'objet (+ points pour combler l'écart), mais en raison de la largeur de la ligne, une partie (~ 50%) couvrait l'objet. J'ai essayé d'utiliser le tampon de pochoir, pour éliminer ce problème, mais je suis arrivé comme ça (le contour est vert):

http://goo.gl/OI5uc (désolé, je ne peux pas publier d'images, en raison de ma réputation)

Vous pouvez voir (là où la flèche pointe), que certaines parties de la ligne sont derrière l'objet et d'autres au-dessus. Cela change lorsque je déplace la caméra, mais il y a toujours une partie qui la recouvre. Voici le code que j'utilise pour dessiner un objet:

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

J'ai essayé différents paramètres de tampon de pochoir, mais je recevais toujours quelque chose comme ça. Voici la question: 1.Suis-je en train de définir un tampon de pochoir incorrect?

2. Existe-t-il d'autres moyens simples de créer des contours sur de tels objets?

Merci d'avance.

ÉDITER:

1. Je n'ai pas de normales d'objets.

2. L' objet peut être concave.

3. Je ne peux pas utiliser de shaders (voir ci-dessous pourquoi).

therealszaka
la source
Vous pouvez vérifier l'ombrage des toons ou des cellules, où un contour est dessiné autour d'un objet. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell
Le cas est, je ne peux pas utiliser de shaders dans ce projet ...
therealszaka
@Maciekp Pourquoi ne pouvez-vous pas utiliser des shaders? Est-ce des devoirs?
Jonathan Connell
Cette application devra fonctionner sur de nombreux ordinateurs, pas toujours le plus récent (c'est 1 point) .2. Ce n'est pas un jeu, c'est une application avec des graphiques en tant que partie + il devra fonctionner sur mac, win, linux.
therealszaka
1
Elle aurait peut-être dû être publiée sur SO si ce n'était pas pour GameDev et vous devriez donner le plus d'informations possible si vous voulez que votre question réponde.
Jonathan Connell

Réponses:

12
  • Dessinez votre scène entière, à l'exception des objets mis en surbrillance.
  • Dessinez les objets que vous souhaitez mettre en surbrillance, en couleur pure, triés de l'arrière vers l'avant et avec une petite échelle appliquée (1.05f - 1.1f).
  • Dessinez les objets finaux, encore une fois, de l'arrière vers l'avant.

Pour plus de confort, essayez de dessiner la passe de contour sur une cible de rendu distincte et appliquez un petit flou, puis mélangez cette texture avec votre scène finale en utilisant les valeurs Z appropriées.

r2d2rigo
la source
C'est un super truc Barba!
FxIII
C'est la vieille astuce qu'ils utilisaient pour les contours lorsque le pipeline gfx était toujours corrigé.
Jonathan Connell
2
Cela ne fonctionnera pas pour les objets concaves
therealszaka
@Maciekp Votre question portait sur les objets 2D (plans) dans l'espace 3D, où le concave entre-t-il? Échelle juste le long des deux axes! = Dans la direction du visage.
Jonathan Connell
Cela devrait fonctionner pour les objets concaves si vous inversez les normales (vous devez activer l'élimination des faces) tout en dessinant les contours.
r2d2rigo
0

Je vais faire ça comme ça:

  • Trier les objets dans l'ordre avant-arrière (distance de la caméra)

  • Dessinez la bordure de l'objet (sous forme de lignes et de points) avec désactivé GL_DEPTH_TEST

  • Dessiner un objet avec activé GL_DEPTH_TEST

  • Faites les deux dernières étapes pour chaque objet

Je vais essayer de faire ça comme ça, mais si quelqu'un a des idées de meilleure solution à ce problème (MIND CONCAVE OBJECTS, S'IL VOUS PLAÎT) - n'hésitez pas à partager avec nous.

PS. Je ne suis pas entièrement satisfait de mes états OpenGL qui changent de solution si souvent peuvent être nuisibles. Mais si personne ne peut m'aider avec les paramètres de tampon de pochoir, je suppose que c'est la seule façon pour moi.

therealszaka
la source