Zeichnen Sie in Opengl eine Kontur um das Objekt

8

Ich muss Konturen um 2D-Objekte im 3D-Raum zeichnen. Ich habe versucht, Linien um das Objekt zu zeichnen (+ Punkte, um die Lücke zu füllen), aber aufgrund der Linienbreite bedeckte ein Teil davon (~ 50%) das Objekt. Ich habe versucht, Schablonenpuffer zu verwenden, um dieses Problem zu beseitigen, aber ich habe etw wie folgt erhalten (Kontur ist grün):

http://goo.gl/OI5uc (Entschuldigung, ich kann aufgrund meines Rufs keine Bilder posten)

Sie können sehen (wo der Pfeil zeigt), dass sich einige Teile der Linie hinter dem Objekt befinden und einige darüber. Dies ändert sich, wenn ich die Kamera bewege, aber es gibt immer einen Teil, der sie abdeckt. Hier ist Code, den ich zum Zeichnen von Objekten verwende:

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

Ich habe verschiedene Einstellungen des Schablonenpuffers ausprobiert, aber immer habe ich so etwas bekommen. Hier ist die Frage: 1. Bin ich falsch eingestellt Schablonenpuffer?

2. Gibt es andere einfache Möglichkeiten, um Konturen auf solchen Objekten zu erstellen?

Danke im Voraus.

BEARBEITEN:

1. Ich habe keine Normalen von Objekten.

2. Objekt kann konkav sein.

3. Ich kann keine Shader verwenden (siehe unten, warum).

therealszaka
quelle
Sie können 'Toon' oder Zellschattierung auschecken, wenn eine Kontur um ein Objekt gezeichnet ist. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell
Der Fall ist, ich kann keine Shader in diesem Projekt verwenden ...
Therealszaka
@ Maciekp Warum kannst du keine Shader verwenden? Ist das Hausaufgaben?
Jonathan Connell
Diese App muss auf vielen Computern funktionieren, nicht immer auf dem neuesten (das ist 1 Punkt) .2. Es ist kein Spiel, dies ist eine App mit Grafiken als Teil davon + es muss auf Mac, Win, Linux funktionieren.
Therealszaka
1
Es sollte vielleicht auf SO gepostet worden sein, wenn es nicht für GameDev ist, und Sie sollten die bestmöglichen Informationen geben, wenn Sie möchten, dass Ihre Frage beantwortet wird.
Jonathan Connell

Antworten:

12
  • Zeichnen Sie Ihre gesamte Szene mit Ausnahme der hervorgehobenen Objekte.
  • Zeichnen Sie die Objekte, die Sie hervorheben möchten, in reiner Farbe, sortiert von hinten nach vorne und mit einem kleinen Maßstab (1.05f - 1.1f).
  • Zeichnen Sie die endgültigen Objekte erneut von hinten nach vorne.

Versuchen Sie für zusätzliche Aufmerksamkeit, den Konturdurchlauf auf ein separates Renderziel zu zeichnen und eine kleine Unschärfe anzuwenden. Mischen Sie diese Textur dann mit Ihrer endgültigen Szene unter Verwendung der entsprechenden Z-Werte.

r2d2rigo
quelle
Dies ist ein großartiger Barba-Trick!
FxIII
Dies ist der alte Trick, den sie für Konturen verwendet haben, als die gfx-Pipeline noch repariert war.
Jonathan Connell
2
Das wird nicht für konkave Objekte
funktionieren
@Maciekp Ihre Frage betraf 2D-Objekte (Ebenen) im 3D-Raum. Wo kommt Konkav ins Spiel? Skalieren Sie einfach entlang der beiden Achsen! = In Gesichtsrichtung.
Jonathan Connell
Es sollte für konkave Objekte funktionieren, wenn Sie beim Zeichnen der Konturen die Normalen invertieren (Sie müssen das Face-Culling aktiviert haben).
r2d2rigo
0

Ich mache das so:

  • Sortieren Sie Objekte in der Reihenfolge von vorne nach hinten (Abstand zur Kamera)

  • Zeichnen Sie den Objektrand (als Linien und Punkte) mit deaktiviert GL_DEPTH_TEST

  • Objekt mit aktiviertem zeichnen GL_DEPTH_TEST

  • Führen Sie die letzten beiden Schritte für jedes Objekt aus

Ich werde versuchen, dies so zu tun, aber wenn jemand Ideen für eine bessere Lösung dieses Problems hat (MIND CONCAVE OBJECTS, BITTE), können Sie dies gerne mit uns teilen.

PS. Ich bin nicht ganz zufrieden mit meinen lösungsverändernden OpenGL-Zuständen, die so oft schädlich sein können. Aber wenn mir niemand bei den Einstellungen des Schablonenpuffers helfen kann, ist das wohl der einzige Weg für mich.

therealszaka
quelle