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).
Antworten:
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.
quelle
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.
quelle