Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.05.2013, 17:37

OpenGL Performancefrage

Hi Leute,
ich wollte mal wissen ob es eine gute Idee ist, alle Modelle, die man braucht um eine bestimme Szene zu rendern, in der GPU zu speichern und dann als Instanz davon zu rendern?

Also erstmal GenBuffers und das übliche nur einmal machen und diesen Buffer mehrmals für verschiedene Instanzen dieses Buffers rendern.

Ich hoffe ihr versteht mich :D

MfG
RenX

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

2

19.05.2013, 18:40

Redest du jetzt von Software- oder Hardware Instancing?

Hardware-Instancing ist wohl in den meisten Fällen am effizientesten, schau dir dazu mal glDrawElementsInstanced an ;-)
Das kannst du allerdings nicht per Fixed-Function Pipeline nutzen, falls du damit überhaupt etwas machst. Shader sind dabei also Pflicht.

Software Instancing hat halt noch den Vorteil, dass man per Culling Objekte aussortieren kann, die komplett außerhalb des Bildschirms bzw. Sichtbereiches liegen.
Allerdings ist das bspw. ViewFrustum-Culling von 100 Objekten auf der CPU meist langsamer, als die GPU mit dem Rendern von millionen von Dreiecken.
Soll heißen, in manchen Fällen lieber die GPU einige Dreiecke mehr rendern lassen, auch wenn diese nicht im Sichtbereich liegen, als die CPU unnötig mit Culling belasten.

Mfg,
Lukas

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

19.05.2013, 19:00

Ich glaub wenn er Performance will, will er auch ein modernes OpenGL benutzen. Also ist die Fixed-Function Pipeline eh egal. ;)
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.05.2013, 22:30

Wenn tatsächlich alles was du brauchst einfach so in den Videospeicher passt, dann ist es natürlich keine schlechte Idee, es auch dort abzulegen...

5

20.05.2013, 05:39

Naja, zuallererst dient Instancing zum reduzieren des Speicherverbrauchs. Es ist schlicht nur logisch das man das die Daten des selben Objekts (zB ein Baum) nur einmal in den Speicher lädt und dann eben mehrfach an verschiedenen Positionen 'rendert'
Hier kann man bei jeden Objekt auch noch einfluss (neben der Position) auf Rotation, Grösse und Textur nehmen...

Mit dem vom LukasBanana's vorgeschlagen glDrawElementsInstanced hab ich selbst bisher noch nicht gearbeitet, daher hier korrigieren wenn ich daneben vollkommen daneben liege. Aber hier kann man wirklich eine Performance Steigerung erreichen, da die funktion alle angegebenen Instanzen gleichzeitig rendert, wärend bei den sonst üblichen verfahren eben jedes Objekt für sich aber eben an anderer Position gerendert wird.
Aber ich glaube (und hier könnte ich falsch liegen) hier hat man nicht so viel Spielraum wie sonst üblich das man auch Einfluss auf Rotation und Grösse nehmen kann...

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

20.05.2013, 11:13

Aber ich glaube (und hier könnte ich falsch liegen) hier hat man nicht so viel Spielraum wie sonst üblich das man auch Einfluss auf Rotation und Grösse nehmen kann...

Der einzige Nachteil ist, dass sich Culling nicht mehr umsetzen lässt, zumindest nicht auf die einzelnen Intances. Höchstens auf einen ganzen Block von Instances.

Rotation und Skalierung lässt sich wunderbar über 4x4 Matrizen umsetzen. Das effizientste dürfte hierbei sein, alle Matrizen in einer Float-Texture zuspeichern.
Die Texture-Zugriffe erfolgen dann im Vertex-Shader.
Hab mal einen Artikel gelesen, in dem das mit Texture und Uniform-Array ausprobiert wurde.
Texture war den Testergebnissen zufolge schneller ;-)

Zum Thema Hardware-Instancing habe ich in diesem Thread auch mal ein Video hochgeladen :-)

Gruß,
Lukas

Werbeanzeige