Zeichnen gepunkteter Linien mit OpenGL-ES

8

Ich habe eine Anwendung, die 3-d Kartenansicht markierte Linien zeichnet, die verschiedene Funktionen zeigen. Ich portiere die Map auf eine OpenGL-ES-Architektur, habe aber ein paar Probleme damit herauszufinden, wie man gestrichelte Linien anzeigt.

Beim Googeln habe ich viele Hinweise auf die Idee gefunden, dass das Zeichnen von gestrichelten Linien und Polygonen aus OpenGL-ES entfernt wurde, da sie leicht mit Hilfe von Texturdreiecken emuliert werden können. Das ist großartig, aber ich kann niemanden finden, der diese Emulation tatsächlich ausführt und / oder eine Beschreibung der Schritte hat.

Ein Beispiel für ein Problem, das mir dabei begegnet ist, dieses Konzept zu entwickeln, ist die Perspektive, die meine Linien zum Horizont hin unsichtbar zusammendrückt. Mit LINE_STRIP geschieht dies nicht, und die Linien bleiben in der Karte eine konstante Breite.

Jeder Rat, wie Linien mit gestrichelter Linie in einer perspektivischen Ansicht erreicht werden können, wäre sehr zu begrüßen.

    
Piklor 20.12.2009, 23:11
quelle

2 Antworten

5

Ich glaube, Sie können eine Textur auf eine Linie und nicht nur auf ein Dreieck anwenden. Sie müssen für jedes Ende der Linie Texturkoordinaten festlegen. Die Textur wird linear entlang der Linie interpoliert.

Die Effektivität dieser Lösung sollte invariant sein, ob Sie Linien oder Linienstreifen verwenden - Linienstreifen sind nur eine Möglichkeit, Linien mit weniger Vertices zu erstellen.

Es gibt noch ein anderes Problem: Die Tendenz des Texturmusters, kompakt zu werden, wenn sich eine Linie von der Kamera entfernt. Dies geschieht, weil die Texturkoordinateninterpolation auch für Linien perspektivisch korrekt ist (siehe Abschnitt 3.5 der GL-Spezifikation).

Es gibt zwei Möglichkeiten, dies zu umgehen:

  1. Wenn Sie eine "q" -Koordinate für Ihre Textur berechnen können, die die Perspektive rückgängig macht, können Sie die Rasterraumtextur wiederherstellen. Diese Technik ist wahrscheinlich zu leistungsintensiv.

  2. Sie können die Textur im Augenraum projizieren (z. B. glTexGen).

Die Generierung von Texturkoordinaten ist in GLES 1.1 natürlich nicht möglich, aber wenn Sie Scheitelpunkte nach Array verwenden, können Sie sie fälschen:

  • Festlegen des Texturkoordinatenarrays als Vertexkoordinatenarray und
  • Verwenden der Texturmatrix zum "Transformieren" der Scheitelpunkte.

Der Nachteil dieser Technik ist, dass sich das Texturmuster im festen Bildschirmbereich befindet - das heißt, die Textur wird nicht über die Linien verlaufen.

    
Ben Supnik 28.01.2010, 22:48
quelle
3

Wenn Sie nur gestrichelte Linien zeichnen möchten, wechseln Sie einfach von GL_LINE_STRIP zu GL_LINES. Auf diese Weise verbindet das offene GL die Scheitelpunkte 1 und 2, 3 und 4, 5 und 6, aber nicht 3 und 4 oder 4 und 5, die dort Räume belassen. Es wird im Wesentlichen eine halbe / halbe gepunktete Linie sein - das grobe Äquivalent von glLineStipple (1, 0101);

IE: im Vertex-Array

  

[0,0,1,1,2,2,3,3,4,4,5,5,6,6]

OpenGL verbindet (0,0) mit (1,1), verbindet aber nicht (1,1) mit (2,2) [während es mit GL_LINE_STRIP] wäre. Es verbindet dann (3,3) mit (4,4), aber NICHT (4,4) mit (5,5). Die endgültige Verbindung wird (5,5) zu (6,6) sein.

So sieht es aus, als ich es gemacht habe:

Gepunktete Linien auf Android

Die Linie ist nicht 50/50 gepunktet / leer, weil sie in meinem Fall die Position einer Spieleinheit für jeden Spielrahmen darstellt - und Spielrahmen sind nicht notwendigerweise alle gleich lang, also das inkonsistente Verhältnis von Linie zu Raum.

Der Code sieht folgendermaßen aus:

  

public void draw (GL10 gl)     {         gl.glDisable (GL10.GL_TEXTURE_2D);

%Vor%      

}

Eine alternative Idee, um einen absichtlich gemusterten Stippel zu erstellen, wäre, bestimmte Vertices zu überspringen, indem stattdessen mit einem Indexarray (glDrawElements) gezeichnet wird. Allerdings habe ich dafür kein Beispiel. : /

    
Daniel 19.02.2014 21:37
quelle

Tags und Links