Der schnellste Weg, um kleine Partikel in opengl zu zeichnen?

8

Kurze Frage: Welches ist die schnellste Methode, um eine große Anzahl von 4x4 / 8x8-Partikeln in opengl zu rendern? Momentan gebe ich 2 Dreiecke für jedes aus, aber ich denke, dass es langsam ist, also würde ich wirklich gerne wissen, ob ich es richtig mache .....

user1010005
quelle
1
Nur zur Erinnerung, da dies eine Leistungsfrage ist, sollten Sie die Leistung auf Ihrer Zielplattform messen , (a) um sicherzugehen, dass sie wirklich teuer genug ist, um sich Sorgen zu machen, und (b) um die Beschleunigung aller vorgeschlagenen Lösungen zu testen.
Nathan Reed

Antworten:

6

Mit OpenGL können Sie Punkte ziehen.

Sie möchten glDrawArrays () oder glDrawElements () mit GL_POINTS aufrufen (anstelle von GL_TRIANGLE_STRIP oder was auch immer Sie verwenden.)

Dadurch werden Punkte auf dem Bildschirm basierend auf der aktuellen Punktgröße gezeichnet , die Sie über glPointSize () festlegen können . Sie können diese Punkte auch als Alias ​​verwenden, aber meiner Erfahrung nach unterstützen nicht alle Treiber / Hardware Alias-Punkte.

Sie können diese Punkte nicht texturieren. Sie sind nur eine einzige Farbe.

notlesh
quelle
Vielen Dank für den Hinweis. Wissen Sie zufällig, ob ich die GL_POINT-Methode mit Shadern ausführen kann, damit ich ihnen auch eine Textur zuordnen kann?
user1010005
1
Sie können mit Shadern verwenden, aber es gibt nur einen Scheitelpunkt für einen Punkt (in der Mitte), sodass Sie möglicherweise Schwierigkeiten haben, Tex-Koordinaten zu finden. stackoverflow.com/questions/5839095/… sieht aus wie es ein bisschen darüber spricht ...
notlesh
Sie können ein Punkt-Sprite auch mit GL_POINTS festlegen.
Mick
1
@ user1010005 Um eine Textur mit GL_POINTS zu texturieren, können Sie in GL_POINT_SPRITE_ARB schauen. Ich bin mir auch ziemlich sicher, dass die Punkte immer die gleiche Anzahl von Pixeln auf dem Bildschirm einnehmen, egal wie nah oder weit Sie von ihnen entfernt sind.
Kevintodisco
@ktodisco können Sie die Punktgröße als Attribut übergeben. Auf diese Weise habe ich einen anständigen Sterneffekt erzielt. Um
notlesh
3

In OpenGL 3.2 und höher stehen Geometrie-Shader zur Verfügung. Um einen kurzen Überblick zu geben, würden Sie OpenGL nur anweisen, die Punkte zu zeichnen, die die Positionen Ihrer Partikel darstellen. Diese Punkte werden normalerweise durch den Vertex-Shader geleitet. Wenn sie dann zum Geometrie-Shader gelangen, wird das Rechteck (out) erstellt von zwei Tris) durch Aussenden von Eckpunkten zur nächsten Stufe der Pipeline. Zusammen mit den Eckpunkten können Sie programmgesteuert Normalen und Texturkoordinaten generieren.

Da dies alles in Hardware erledigt wird, bin ich mir ziemlich sicher, dass es derzeit der schnellste Weg ist, Punkt-Sprite-Partikel zu rendern.

Kevintodisco
quelle
1
Dies ist wahrscheinlich eine bessere Lösung als GL_POINTS, funktioniert jedoch nicht für ältere OpenGL-Implementierungen (und OpenGL ES).
Notlesh
Hört sich toll an, aber ich plane, mein Spiel auf die Android-Plattform zu portieren :(
user1010005
2
@ user1010005 Nur ein Tipp, sollten Sie das erwähnen, wenn Sie die Frage stellen, damit wir wissen, mit welchen Einschränkungen wir arbeiten müssen :)
kevintodisco
Ich bin ein Anfänger mit opengl sorry D:
user1010005
Ich würde lieben , die Geometrie - Shader zur Verfügung gestellt in OpenGL ES zu sehen. ) =
notlesh