Gestrichelte Rückkanten des Objekts

8

In meiner Android-App muss ich ein 3D-Objekt anzeigen (das ist kein Problem), aber die Vorderkanten sollten solide sein und die Hinterkanten sollten punktiert sein. Ich brauche etwas wie auf dem Bild. Wie kann ich es mit OpenGL ES 1 oder 2 erreichen?

Ich habe die Idee von Tim ausprobiert (mit Tiefenpuffer). Es funktioniert, aber es gibt einige Artefakte wie auf den Bildern, gepunktete (lila) Linien überlappen feste (rote) Linien:

Es passiert, weil gepunktete Linien (violette Farbe (GL_GREATER)) NACH roten Linien (GL_LEQUAL) gezeichnet werden. Gibt es da Ideen, wie man es verhindern kann?

Vielen Dank, dass Sie uns geholfen haben. Jetzt sieht es gut aus !!

    
agent-10 18.10.2012, 17:47
quelle

1 Antwort

2

Hier ist ein grober Überblick darüber, was ich tun würde. Sie benötigen ein Gitter für das Objekt selbst und ein weiteres Gitter von GL_LINES für die Kantenlinien, die Sie zeichnen möchten.

  1. Zeichnen Sie das feste Netz in den Tiefenpuffer.
  2. Zeichnen Sie Ihr 'Kantengitter' mit einem Standard-Shader, so dass Sie durchgezogene Linien erhalten, aber setzen Sie den Tiefen-Test auf GL_LEQUAL (nur Objekte näher als den Tiefenwert zeichnen.
  3. Zeichnen Sie Ihr Kantengitter ein zweites Mal mit einem Tiefentest von GL_GREATER. In diesem Durchlauf verwenden Sie einen Punktiershader, um den Effekt der gepunkteten Linie zu erhalten (weiter unten erklärt).

Dies kann Probleme haben, abhängig davon, was andere Objekte in der Szene sind, da Sie möglicherweise gestrichelte Linien erhalten, wenn der Würfel durch etwas anderes verdeckt ist, aber das ist vielleicht kein Problem für Sie oder Sie können die Mesh, wenn es verdeckt ist.

Für den Punktiershader können Sie festlegen, dass eine Textzeile eines Eckpunkts der Linie null ist und ein anderer Endpunkt der Linie eins ist. Dann können Sie in Ihrem Shader eine Schrittfunktion verwenden, ähnlich wie von tencent vorgeschlagen, um Fragmente abzuweisen, um ein Punktierungsmuster zu erzeugen.

Sie können auch das Durcheinander mit dem Tiefenpuffer überspringen, wenn Sie selbst berechnen wollen, welche Linien sich hinter dem Objekt befinden, obwohl es viel Arbeit mit etwas mehr als einem Würfel geben könnte.

Wenn Sie OpenGLES 1 anstelle von OpenGLES 2 verwenden möchten, ersetzen Sie den Stipple-Shader durch eine 1D-Textur eines Punktierungsmusters und texturieren Sie die hinteren Linien damit. Aber ich bin nicht 100% sicher, dass Sie eine Zeile in OpenGL texturieren können, also wird das vielleicht nicht funktionieren.

    
Tim 20.10.2012, 18:32
quelle

Tags und Links