Wie verwende ich Vertex Buffer Objects, um viele verschiedene Kreise zu rendern?

StackOverflow https://stackoverflow.com/questions/1484572

  •  18-09-2019
  •  | 
  •  

Frage

Ich versuche, ein Spiel zu schreiben, das sich mit vielen Kreisen befasst (naja, Triangle-Fans, aber Sie verstehen, worauf es ankommt).Jeder Kreis hat eine x-Position, eine y-Position und eine Masseneigenschaft.Die Masseneigenschaft jedes Kreises ist unterschiedlich.Außerdem möchte ich einige Gruppen von Kreisen anders einfärben, dabei aber eine transparente Kreismitte beibehalten und entlang des Umfangs der Kreise zu undurchsichtig werden.

Mir wurde gesagt, ich solle VBOs verwenden, und ich habe den ganzen Tag gegoogelt.Ich hätte gerne ein vollständiges Beispiel, wie ich diese Kreise zeichnen würde, und eine Erklärung, wie VBOs funktionieren, wobei diese Erklärung einfach gehalten werden sollte.

War es hilfreich?

Lösung

Ich selbst habe VBOs noch nicht implementiert, aber soweit ich weiß, funktionieren sie ähnlich wie Texturobjekte.Wenn ich mich selbst daran erinnere und anderen erkläre, was VBOs sind, tue ich das sogar gerne falsch Nennen Sie Texturobjekte „Texturpufferobjekte“, um die konzeptionelle Ähnlichkeit zu verstärken.

(Nicht vermischen mit Puffertexturen von der von NVIDIA angegebenen Erweiterung GL_EXT_texture_buffer_object.)

Denken wir also:Was sind Texturobjekte?Es handelt sich um Objekte, mit denen Sie generieren glGenTextures(). glGenBuffersARB() macht Ähnliches.Eine Analogie gilt mit glBindTexture() Und glBindBufferARB().

(Ab OpenGL 1.5 funktionieren glGenBuffers() Und glBindBuffer() haben Kern-OpenGL eingegeben, sodass Sie sie anstelle der Erweiterungsäquivalente verwenden können.)

Aber was genau sind diese „Texturobjekte“ und was bewirken sie?Nun, bedenken Sie, dass Sie es tatsächlich verwenden können glTexture2D() in jedem Frame, um eine Textur einzurichten.Texturobjekte dienen lediglich dazu, den Datenverkehr zwischen GPU und Hauptspeicher zu reduzieren;Anstatt das gesamte Pixel-Array zu senden, senden Sie nur den „OpenGL-Namen“. (d. h. ein ganzzahliger Bezeichner) des Texturobjekts, von dem Sie wissen, dass es statisch ist.

VBOs dienen einem ähnlichen Zweck.Anstatt das Vertex-Array immer wieder zu senden, laden Sie das Array einmal mit hoch glBufferData() und senden Sie dann nur den „OpenGL-Namen“ des Objekts.Sie eignen sich hervorragend für statische Objekte und nicht so gut für dynamische Objekte.Tatsächlich bieten Ihnen viele generische 3D-Engines wie Ogre3D die Möglichkeit, anzugeben, ob ein Netz dynamisch oder statisch ist, höchstwahrscheinlich, um Ihnen die Entscheidung zwischen VBOs und Vertex-Arrays zu ermöglichen.

Für Ihre Zwecke sind VBOs nicht die richtige Antwort.Sie möchten zahlreiche einfache Objekte, die sich ständig verändern und verändern.Mit einfach meine ich diejenigen mit weniger als 200 Eckpunkten.Sofern Sie nicht beabsichtigen, einen sehr intelligenten und komplexen Vertex-Shader zu schreiben, sind VBOs dies nicht für dich.Sie möchten Vertex-Arrays verwenden, die Sie einfach von der Haupt-CPU aus bearbeiten und bei jedem Frame aktualisieren können, ohne spezielle Aufrufe an die Grafikkarte zu tätigen, um das gesamte VBO erneut auf die Grafikkarte hochzuladen (was langsamer sein kann als nur das Senden von Vertex-Arrays).

Hier ist eine ziemlich gute Letscallit-Manpage von nVidia über die VBO-API.Lesen Sie es für weitere Informationen!

Andere Tipps

gut vbo Tutorial

Was Sie sieht aus wie Teilchen zu tun, möchten Sie vielleicht „particle-Rendering“ nur für den Fall Google.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top