Ich fange gerade mit OpenGL an und versuche, damit ein 2D-Spiel zu erstellen. In diesem Spiel habe ich ein sechseckiges Gitter, das aus einer Vielzahl verschiedenfarbiger Sechsecke besteht. Als neuer OpenGL-Programmierer sehe ich zwei Möglichkeiten, dieses Raster zu zeichnen:
- Verwenden Sie einen Scheitelpunktpuffer mit den Daten für ein einzelnes Sechseck, verwenden Sie dann einen einheitlichen Versatzwert und iterieren Sie in der CPU, um dasselbe Programm so oft zu zeichnen, bis ich ein Raster habe.
- Erstellen eines singulären, sehr großen, vorberechneten Eckpunktpuffers, der alle Sechsecke in einem einzigen Aufruf zeichnet.
Was ist die effizienteste Methode? Gibt es einen besseren Weg, dies zu tun?
Antworten:
Es gibt in der Tat einige Möglichkeiten, ein solches Raster zu erstellen.
Der effizienteste Weg wäre das Instanzen. Auf diese Weise erstellen Sie Ihr Sechseck nur einmal in einem VBO und rendern dieses hundert-, tausend- oder millionenfach. Sie können es manuell mit Shadern mit Uniformen tun, wie Sie in Punkt 1 gesagt haben, aber es gibt auch eine integrierte OpenGL-Funktionalität dafür. Schauen Sie sich dazu glDrawElementsInstanced an .
Beachten Sie, dass die Instanziierung nur dann schneller ist als andere Methoden, wenn Sie mehr als eine bestimmte Anzahl von instanziierten Objekten zeichnen. Zum Beispiel kann das Zeichnen von 300 mit 1 großen VBO schneller sein, aber das Zeichnen von 2 Millionen kann schneller sein, wenn Sie das instanziierte Rendern verwenden.
Wenn Sie das instanziierte Rendern verwenden, können Sie Objektdaten mit Attributteilern senden . In Ihrem Fall möchten Sie die Position und die Farbe senden.
Ein gutes Tutorial zum instanziierten Rendern: Klicken Sie auf
Am besten probieren Sie beide Methoden aus und überprüfen Sie, wie viele Millisekunden zum Zeichnen eines Frames erforderlich sind. Auf diese Weise lernst du auch beides, was immer gut ist.
Beachten Sie auch, dass das instanziierte Rendern eine moderne OpenGL-Funktionalität ist und dass Sie Shader verwenden müssen, um es zu verwenden. Aber es ist immer am besten, es von Anfang an richtig zu lernen.
quelle
Methode 1 ist einfacher zu codieren und ist in Ordnung, solange nicht zu viele Sechsecke gleichzeitig angezeigt werden. Möglicherweise möchten Sie dabei bleiben, da Sie noch nicht mit OpenGL vertraut sind, um nicht zu viel Komplexität auf einmal auf Ihren Teller zu bringen.
Wenn eine große Anzahl von Sechsecken (z. B. mehrere Hundert oder mehr als Tausend) gleichzeitig angezeigt wird, ist eine Methode mit geringerem Overhead erforderlich, um den CPU-Overhead bei der Ausführung so vieler Einzeldarstellungen zu vermeiden. Methode 2 würde dafür funktionieren, oder noch besser, Instanzen verwenden. Ich würde erwarten, dass die Instanzen schneller sind als Methode 2 oder sicherlich nicht schlechter, da Sie nur einen Puffer mit instanzbezogenen Daten aktualisieren müssen, anstatt einen (viel größeren) Puffer mit Vertexdaten für alle Instanzen.
quelle