Geometrieinstanzen in OpenGL ES 2.0


12

Ich plane eine Geometrieinstanzierung in OpenGL ES 2.0. Grundsätzlich plane ich, dieselbe Geometrie (einen Stuhl) in meiner Szene 1000-mal zu rendern.

Was ist der beste Weg, um dies in OpenGL ES 2.0 zu tun?

Ich denke darüber nach, die Modellansicht mat4 als Attribut zu übergeben. Da es sich bei Attributen um Scheitelpunktdaten handelt, muss ich dieselbe mat4 dreimal für jeden Scheitelpunkt desselben Dreiecks übergeben (da die Modellansicht über die Scheitelpunkte des Dreiecks hinweg konstant bleibt).

Das würde eine Menge zusätzlicher Daten bedeuten, die an die GPU gesendet werden (2 zusätzliche Eckpunkte * 16 Floats * (Anzahl der Dreiecke) Menge zusätzlicher Daten).

Oder sollte ich die mat4 nur einmal pro Dreieck senden? Aber wie ist das mit Attributen möglich, da Attribute als "Per Vertex" -Daten definiert sind?

Was ist die beste und effizienteste Möglichkeit, eine Instanz in OpenGL ES 2.0 zu erstellen?


3
Ich vermisse wirklich glVertexAttribDivisor:(
Will

Antworten:


9

ES2 verfügt weder über glVertexAttribDivisor noch über Gleitkomma-Texturen, sodass Ihre Optionen begrenzt sind.

Stellen Sie Ihr Stuhlmodell auf jeden Fall in einen VBO, wenn Sie dies nicht bereits tun. Von da an sind Sie mehr oder weniger auf einzelne Draw Calls beschränkt - einen pro Chair -, also ist es eine Frage, die Transformationsmatrix für jeden Chair so effizient wie möglich zur GPU zu bringen.

Sie könnten dies mit regulären glUniform-Aufrufen tun, oder Sie könnten einige zusätzliche Vertex-Attribut-Slots missbrauchen und einige glVertexAttrib-Aufrufe (Anmerkung: nicht glVertexAttribPointer) vornehmen, bevor Sie jeden Stuhl zeichnen, wobei die Matrix mit 4 solchen Slots angegeben wird jeder nachfolgende Scheitelpunkt im Stuhl. Das kann auf manchen Hardware-Systemen schnell genug sein, auf anderen langsamer, sodass Sie experimentieren müssen.

Wenn sich Ihre Stühle nicht drehen, können Sie einfach die Position an Ihren Shader senden und dort im Handumdrehen eine neue Transformationsmatrix erstellen. Das hört sich schrecklich an, ist aber tatsächlich unglaublich schnell (es setzt nur 3 Schwimmer) und könnte die Arbeit erledigen.

Im Großen und Ganzen gehe ich davon aus, dass Sie auf eine typische mobile Plattform abzielen und dass Sie durch das Zeichnen von Anrufen getötet werden, was auch immer Sie tun.


6

Ihre beste Wette ist es, einen instanziellen Ansatz zu verwenden, der den gehäuteten Modellen ziemlich ähnlich ist. Erstellen Sie einen VBO, der viele Exemplare Ihres Stuhls enthält, die alle identisch sind. Jetzt muss jeder Scheitelpunkt ein Byte-Attribut haben, das den Index für die Transformationsmatrix enthält, auf die er angewendet wird. Senden Sie eine Reihe von Matrizen an Ihren Shader und verwenden Sie sie als Welttransformation für jeden Ihrer Stühle. Auf diese Weise können Sie bei jedem Aufruf so viele Stühle zeichnen, wie der Array-Parameter maximal groß ist, ohne dass Daten im VBO neu geschrieben werden müssen.


3

Wolfire Games hat einen ausgezeichneten Blogeintrag über die schnelle Objektinstanzierung . Sie rendern das Modell einige Male, senden jedoch für jedes Objekt eine andere Matrix an einen einheitlichen Steckplatz.

Dies ist eine ziemlich effiziente Methode, um eine ganze Reihe von Objekten zu instanziieren, da Sie die Daten nur einmal senden müssen (der größte Engpass beim Rendern eines Objektstapels ist immer die Bandbreite) und dann das Modell in einen Shader umwandeln müssen.


+1 Wie auch immer, ich bin mir immer noch nicht sicher, ob der Hinweis auf Nvidia-Text auch für mobile PVR-Chips gilt. Vor allem über ihre Erwähnung zum Fahrerteil . http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Dies ist ein Google Talk für WebGL, das OpenGL ES für JavaScript ist. Dies bedeutet, dass auch keine Geometrieinstanzen vorhanden sind. Es kann Ihnen eine Idee geben, obwohl es schwer zu sagen ist, weil ich nicht weiß, ob Ihr Engpass auf der GPU oder der CPU ist.

Obwohl Sie sich mit einheitlichen Variablen auskennen sollten, ist es absolut nicht erforderlich, eine mat4 in einem Attribut zu senden. Alle Eckpunkte Ihres Stuhls werden durch dieselbe Matrix transformiert. Sie müssen sie nur einmal pro Modell und nicht pro Dreieck senden. Mit einheitlichen Variablen können Sie dies tun. Dies ist eine spezielle Art von Variablen, die Sie im Shader-Programm selbst festlegen können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.