2010-05-31 2 views
5

Ich mache ein 2D-Spiel mit OpenGL. Ich möchte meine Texturzeichnung mit VBOs beschleunigen.OpenGL schnelle Texturzeichnung mit Vertex-Puffer-Objekten. Ist das der Weg, es zu tun?

Derzeit verwende ich den Sofort-Modus. Ich erzeuge meine eigenen Koordinaten, wenn ich eine Textur rotiere und skaliere. Ich habe auch die Funktionalität, die Ecken einer Textur zu runden, indem ich das Polygongrundelement verwende, um diese zu zeichnen.

Ich dachte, wäre es am schnellsten, einen VBO mit Vertices für die Seiten der Textur ohne Offset zu machen, so kann ich dann glTranslate, glScale und glRotate verwenden, um die Zeichenposition für meine Textur zu verschieben. Dann kann ich denselben VBO ohne Änderungen verwenden, um die Textur jedes Mal zu zeichnen. Ich konnte nur die VBO ändern, wenn ich die Koordinaten für die abgerundeten Ecken hinzufügen muss.

Ist das der beste Weg, dies zu tun? Auf welche Dinge sollte ich achten? Ist es in modernen Grafikkarten am schnellsten, GL_TRIANGLES statt GL_QUADS zu verwenden?

Vielen Dank für jede Antwort.

Antwort

4

Um eine bessere Leistung zu erzielen, sollten Sie nicht das sofortige Rendern im Modus verwenden, sondern Vertexpuffer (auf der CPU oder GPU) verwenden und mit glDrawArrays usw. wie Methoden zeichnen. Das Skalieren/Drehen der Texturkoordinaten durch Ändern des Texturmatrixmultiplikators ist kein Leistungsproblem. Sie müssen lediglich einige kleine Werte für das gesamte Polygonnetz festlegen. Der wichtigste Engpass besteht darin, die Daten pro Vertex (z. B. Farbe, Position und Texturkoordinaten) in die GPU zu übertragen, und genau hier können Vertex-Pufferobjekte auf der GPU sehr hilfreich sein.

Wenn das Netz, das Sie auf dem Bildschirm zeichnen möchten, statisch ist, dh Sie es einmal festlegen und später nicht ändern müssen, können Sie die Texturkoordinaten für das gesamte Netz, einschließlich aller, generieren Ecken) nur einmal. Sie können die Texturkoordinaten für das gesamte Mesh später mit dem Texturmatrix-Multiplikator ändern. Wenn Sie jedoch verschiedene Teile des Netzes mithilfe verschiedener Transformationen ändern möchten, müssen Sie das Netz in Teile unterteilen. Aus dem, was Sie beschrieben haben, verstehe ich, dass Sie ein Rechteck mit abgerundeten Ecken zeichnen möchten, das ein Bild enthält, das mit einem einzigen statischen Netz (einer Liste von Daten pro Vertex) erstellt werden kann.

Schließlich sind GL_QUADS auch in modernen OpenGL-Spezifikationen veraltet. Sie bieten sowieso nicht viel Funktionalität, deshalb sollten Sie QUADS auf Dreiecke oder Dreiecksleisten/Lüfter umstellen.

+0

Vielen Dank. Ich habe es geschafft, VBOS für einige Liniencode, aber nicht für die Texturzeichnung arbeiten zu lassen. Ich habe keine Ahnung, wie es geht. Alles, was ich versuchte, scheiterte. Ich denke, ich brauche eine andere Frage. –

+0

Sehen Sie Ihre Objekte dort, wo Sie sie haben möchten? Ist es nur die unkorrekte Texturierung Ihrer Modelle? Wenn Sie Ihre Objekte an der richtigen Position sehen, denken Sie daran, dass Texturkoordinatenwerte genau wie Eckpunktpositionswerte sind. Beginnen Sie mit etwas Einfachem (ändern Sie nicht die Texturkoordinaten mit glTranslate usw. im Texturmatrix-Modus) und versuchen Sie dann, es zu erweitern, um das zu erreichen, was Sie letztendlich sehen möchten. – AdilYalcin

+0

Bei der aktuellen Rendering ist es an der richtigen Stelle, es wird nur nicht richtig gerendert. Es schlägt für GL_QUADS und GL_TRIANGLES fehl. Ich werde eine neue Frage mit meinem VBO-Code stellen. Ist das Hinzufügen von Farbinformationen zum VBO wichtig? Wird "glColor" zu einem großen Problem? Vielen Dank für Ihre Antwort und Hilfe. –

1

Wenn Sie ein strukturiertes Polygon mit VBOs zeichnen möchten, müssen Sie Puffer nicht nur für die Scheitelpunkte, sondern auch für die Texturkoordinaten (eine UV-Koordinate pro Scheitelpunkt) und für die Scheitelpunktfarben erstellen, wenn Sie einen Scheitelpunkt erstellen möchten Beleuchtung (verwenden Sie stattdessen glColor). Verwenden Sie glClientActiveTexture (GL_TEXTUREn), bevor Sie die gewünschte Textur binden. Vergessen Sie nicht, glEnableClientState() für jeden verwendeten Puffertyp zu verwenden, bevor Sie den Render-Aufruf ausführen.

Verwandte Themen