2017-01-26 5 views
1

Ich versuche riesige Punktwolken (~ 150M) zu rendern, aber OpenGL rendert nur Teil (~ 52M) davon. Beim Rendern kleinerer Datensätze (< 40M) funktioniert alles einwandfrei. Ich benutze Single VBO. Wenn mehrere VBOs verwendet werden, werden Punkte gerendert, aber das Rendern ist schrecklich langsam, was erwartet wird. Mein Element hat eine Größe von 44 Bytes und GPU hat 3 GB Speicher zur Verfügung. Das sollte für fast 70M Punkte reichen, aber ich kann mit mehreren VBOs so viel wie 100M Punkte rendern. Gibt es eine OpenGL-spezifische Einschränkung pro VBO, die mir nicht bekannt ist?.glDrawArrays rendert keine ganze Punktwolke

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, cloud.size() * sizeof(Point), cloud.data(), GL_STATIC_DRAW); 
// lot of other code 
glDrawArrays(GL_POINTS, 0, cloud.size()); 
+0

Sie rufen glBufferData nicht jeden Frame auf, oder? –

+0

Verifizieren Sie, dass 'glBufferData()' den Fehlerstatus nicht auf 'GL_OUT_OF_MEMORY' setzt? – genpfault

+0

Ich bin nicht. Dies ist nur Pseudo-Code. In der Tat benutze ich das schmutzige Flag, um den Puffer nur zu aktualisieren, wenn sich Daten ändern. – mitjap

Antwort

6

Es wie ein Teil Ihres Systems sieht verwendet 32-Bit-Integer ohne Vorzeichen, die Größe der Puffer zu speichern, so 148M*44bytes Überlauf vorbei und über 54.9M oder 50.4M abhängig von umgerechnet wird, ob Ihre Megabyte sind binär oder dezimal . Ich würde mit dem Überprüfen Ihrer OpenGL-Bindungsbibliothek beginnen, um zu sehen, dass die deklarierten Prototypen 64-Bit-Typen korrekt verwenden. Wenn dies der Fall ist, muss der Fehler in den OpenGL-Treibern enthalten sein.

Um mehr als 4 GB Daten in den Puffer übertragen Sie können versuchen, eine der anderen verfügbaren Funktionen: glBufferSubData und glBufferStorage oder Speicher-Karte den Puffer mit glMapBufferRange, was die Begrenzung von 4 GB umgehen könnten.

Eine andere Sache zu berücksichtigen ist, einen VAO zu verwenden, aber die Daten zwischen mehreren Puffern aufzuteilen. Vermutlich besteht Ihre Point aus verschiedenen Attributen, wie Position, Farbe, etc ... Sie können jedes von ihnen in einen separaten Puffer setzen und immer noch einen VAO und einen Zeichenaufruf verwenden. Sie können auch die Typen der von Ihnen verwendeten Attribute optimieren (z. B. keine Fließkommazahlen verwenden, bei denen Kurzschlüsse oder Bytes verwendet werden) und das Layout der Struktur (prüfen Sie, ob zwischen den Feldern keine unnötige Auffüllung vorhanden ist).

+0

Um 'glBufferSubData' zu verwenden, denke ich, dass Sie' glBufferData' zuerst mit der gewünschten Größe aufrufen müssen (was 'GLsizing ') und Verwendung, und verwenden Sie dann' glBufferSubData' zum Aktualisieren von Teilen davon. Verstehe ich das richtig? Wie für 'glBufferStorage'. Ich denke, das würde meine Probleme lösen, aber ich habe kein OpenGL 4.4 verfügbar. Ich denke, ich muss ein VBO pro 2^32bytes Daten verwenden. Vielen Dank! – mitjap

+1

Nun, 'glBufferSubData' erwartet tatsächlich, dass der Speicher für den Puffer bereits reserviert ist, wofür' glBufferStorage' gedacht ist. Wie Sie anhand des Typs sehen können, den sie verwenden, sind sie tatsächlich neuere Funktionen. Sie können immer noch prüfen, ob Sie die Erweiterung 'GL_ARB_buffer_storage' unterstützt haben, die' glBufferStorage' eingeführt hat. – ybungalobill

+0

Diese Antwort ist nicht korrekt. 'glBufferData' verwendet den Typ' GLsizeiptr' für den Parameter 'size', der explizit als 'ptrbits' wide spezifiziert ist, wobei' ptrbits' die Anzahl der Bits ist, die für Adressen im Client-Adressraum verwendet werden. – derhass

0

Ich glaube nicht, Speicher ist ein Problem in der Tat, ich würde sagen, Ihr Programm macht zu viele Zeichenaufrufe. Sie sollten es mit glDrawArraysInstanced() versuchen. Dafür müssen Sie für jede Instanz im Vertex-Shader eine neue Position angeben ... vielleicht löst das Ihr Problem: D. Es tut mir leid, wenn ich Ihnen keine Details zur Verfügung stellen kann, meine Fähigkeiten in OpenGL sind ein bisschen langweilig geworden, aber ich habe vor, so bald wie möglich wiederzugewinnen: Ich hoffe, es hilft.

Verwandte Themen