Ich stehe vor einem Problem, von dem ich glaube, dass es VAO-abhängig ist, aber ich bin mir nicht sicher.
Ich bin mir nicht sicher über die korrekte Verwendung eines VAO. Was ich während der GL-Initialisierung getan habe, war einfach
glGenVertexArrays(1,&vao)
gefolgt von einem
glBindVertexArray(vao)
und später habe ich in meiner Zeichnungspipeline nur glBindBuffer (), glVertexAttribPointer (), glEnableVertexAttribArray () usw. aufgerufen, ohne mich um das ursprünglich gebundene VAO zu kümmern
Ist das eine richtige Praxis?
Antworten:
VAOs verhalten sich in Bezug auf ihre Bindung ähnlich wie VBOs und Texturen. Wenn ein einzelner VAO über die gesamte Länge Ihres Programms gebunden ist, ergeben sich keine Leistungsvorteile, da Sie möglicherweise auch nur ohne VAOs rendern. Tatsächlich kann es langsamer sein, je nachdem, wie die Implementierung die Einstellungen der Scheitelpunktattribute beim Zeichnen abfängt.
Der Zweck eines VAO besteht darin, alle Methoden auszuführen, die zum einmaligen Zeichnen eines Objekts während der Initialisierung erforderlich sind, und den gesamten zusätzlichen Aufwand für Methodenaufrufe während der Hauptschleife zu reduzieren. Es geht darum, mehrere VAOs zu haben und beim Zeichnen zwischen ihnen zu wechseln.
In Bezug auf bewährte Methoden sollten Sie Ihren Code folgendermaßen organisieren:
Dies vermeidet das Durcheinander von Bindungs- / Entbindungspuffern und das Übergeben aller Einstellungen für jedes Scheitelpunktattribut und ersetzt es durch nur einen einzigen Methodenaufruf, der eine VAO bindet.
quelle
Nein, so verwenden Sie VAO nicht. Sie sollten VAO genauso verwenden wie VBO, Texturen oder Shader. Richten Sie es zuerst ein. Und beim Rendern binden Sie sie nur, ohne sie zu ändern.
Mit VAO machen Sie also Folgendes:
void Setup() { glGenVertexArrays(..); glBindVertexArray(..); // now setup all your VertexAttribPointers that will be bound to this VAO glBindBuffer(..); glVertexAttribPointer(..); glEnableVertexAttribArray(..); } void Render() { glBindVertexArray(vao); // that's it, now call one of glDraw... functions // no need to set up vertex attrib pointers and buffers! glDrawXYZ(..) }
Siehe auch diese Links:
quelle
glEnableVertexAttribArray(...)
sollte vorher angerufen werdenglVertexAttribPointer(...)
. Einige Fahrer (einschließlich meiner) mögen es nicht wirklich umgekehrt.Ja, das ist völlig legal und gültig. Ist es gut? Gut...
Es gab einige informelle Leistungstests für diese Art von Dingen. Und es scheint, zumindest auf NVIDIA-Hardware, auf der dies getestet wurde, dass die "richtige" Verwendung von VAOs (dh: was alle anderen befürworteten) in vielen Fällen tatsächlich langsamer ist. Dies gilt insbesondere dann, wenn durch das Ändern von VAOs nicht geändert wird, welche Puffer gebunden sind.
Meines Wissens nach wurden auf AMD-Hardware keine ähnlichen Leistungstests durchgeführt. Im Allgemeinen ist dies eine akzeptable Verwendung von VAOs, es sei denn, etwas ändert sich mit ihnen.
quelle
Roberts Antwort oben hat für mich funktioniert, als ich es versuchte. Was es hier wert ist, ist der Code in Go, mehrere Vertex-Attributobjekte zu verwenden:
// VAO 1
Dann können Sie sie in Ihrer Hauptschleife als solche verwenden:
Wenn Sie die vollständige Quelle anzeigen möchten, ist sie als Kern verfügbar und aus den Beispielen in go-gl abgeleitet:
https://gist.github.com/mdmarek/0f73890ae2547cdba3a7
Vielen Dank an alle für die ursprünglichen Antworten. Ich hatte dieselbe Frage wie ECrownofFire.
quelle