Zeichnung mehrere Modelle mit mehreren openGL VBO ' s
eher als post viel code, ich werde Satz, diese Frage intuitiv. Ich hoffe, Sie verstehen, was ich bin.
Mache ich ein Spiel und im code habe ich eine model-Klasse, die Lasten, die ein Modell und legt die VBO.
In der be-Funktion, erzeugt es eine neue VBO-ID und lädt die vertex-Daten aus einer Datei in die Puffer durch Bindung etc. (Diese funktioniert einwandfrei)
Am Anfang das Programm, das ich machen ein Modell-Objekt und laden ein .obj-Datei.
In der render-Funktion, die ich rufen Sie einfach die DrawArrays() Funktion (mit den nötigen extra-Sachen) und als ich sagte, funktioniert alles einwandfrei wie das Modell erscheint auf dem Bildschirm ohne Probleme.
Das problem jedoch ist, wenn ich zwei model-Objekte an den Anfang des Programms und laden eines anderen .obj-Datei in jede.
Das Problem ist, dass wenn ich Spiele, nur das zweite Modell ist gezeichnet auf dem Bildschirm.
Das problem ist, weil ich nicht richtig verstehen, wie die VBO ' s funktionieren.
Dies ist, wie ich "glaube" VBO ' s funktionieren.
Generieren Sie beliebig viele VBO-ID ' s, wie Sie wollen.
Sie binden können jede ID, um es dem aktiven Puffer.
Sie können das laden vertex-Daten in die Puffer.
Sie nun effektiv haben viele verschiedene ID ' s jede Bezugnahme auf ein "set of vertex data".
Durch den Aufruf der DrawArray Funktion es zieht jeden Puffer, die Sie generiert haben (effektiv anzeigen alle Modelle auf dem Bildschirm)
Nun weiß ich, das ist falsch, weil in meinem begrenzten Verständnis kann ich nicht sehen, wie ich Sie verwandeln könnte-Modellen on/off. Aber egal wie viele tutorials ich sehen ich kann diese Frage nicht beantworten, weil Sie alle konzentrieren sich auf anzeigen, dass MAN sich ZUNÄCHST VBO, die übrigens ich tun kann.
So... wenn das Sinn machte, jemand könnte mich aufklären?
InformationsquelleAutor user3263338 | 2014-02-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du machst es meistens richtig, aber die Zeichnung " - Befehl hat nicht zeichnen Sie alle Puffer, die Sie generiert haben. Wenn Sie möchten, zeichnen Sie 2 Objekte mit Daten in verschiedenen Puffern, Sie haben zu Frage 2 zeichnen-Befehle.
Lassen Sie mich erklären, basierend auf wie ich es mache:
Erstellen Sie Puffer mit glGenBuffers. Bevor Sie mit einem Puffer, Sie zu "binden", das heißt, machen Sie aktiv mit glBindBuffer. Wenn ein Puffer aktiv ist, können Sie die Sachen tun, mit (füllen mit Daten zum Beispiel). Beachten Sie, dass es unterschiedliche Ziele binden, so können Sie, zum Beispiel, haben eine active-array-Puffer (für vertex-Daten) und ein aktives element-array-Puffer (für index-Daten).
Wenn Sie möchten, um zu zeichnen Zeug, müssen Sie angeben, was genau du zeichnen möchtest (ich nehme an du bist jetzt mit Ihrem eigenen shader) in der Regel geben Sie mindestens Ihre vertex-Daten und index-Daten. Um dies zu tun, müssen Sie zuerst binden Sie die Puffer mit Ihren vertex-Daten (als ein array-buffer), dann Aufruf von glVertexAttribPointer mit dir-Attribut id. Dies teilt OpenGL, dass die gebundenen Puffer ist nun die Quelle für das aktuelle Attribut. Anschließend binden Sie Ihre index-buffer als das element-array Puffer und rufen glDrawElements (nicht sicher, wie glDrawArrays hier arbeiten würde).
Sie können nicht mehrere VBOs auf einmal für das gleiche Attribut - der Ruf zum binden von einem anderen Puffer nur überschreibt den vorherigen Anruf und macht den zweiten Puffer aktiv, die, so vermute ich, ist der Grund, warum nur Ihre zweite Objekt wird gezeichnet.
Können Sie auch VAOs zur Vereinfachung der Zeichnung - im Grunde kannst du eine id zuweisen verbindliche Befehle, dann können Sie führen Sie Sie mit einer Linie (denke, dass display-Listen).
So, mein laden (von einem Objekt) sieht wie folgt aus:
Und meine Zeichnung (wieder, die von einem Objekt):
Für das zweite Objekt, müssen Sie wiederholen Sie alles.
Du hast natürlich Recht, ich bearbeitet meine Antwort. Ich habe versucht, die Antwort ziemlich einfach - ich glaube, dass es hilfreich ist, wenn Sie die Grundlagen unten zuerst, bevor Sie anfangen, sich auch mit normalen, texure Koordinaten, VAOs etc.
Yep, sehr richtig 🙂 Danke!
InformationsquelleAutor vesan
Gehen Sie folgendermaßen vor, um das rendering Ihrer Modelle, unter der Annahme model1 vertices gespeichert sind, in den vertexBuffer und model2 Eckpunkte in vertexBuffer2:
Stellen Sie sicher nicht ausführen glClear in der Mitte der zwei-Modell macht.
Alle die besten!!!
glVertexAttribPointer(...)
rief ich (in meinem Fall)glVertexPointer(3, GL_INT, vertexDataSize, 0)
.InformationsquelleAutor user3787572
was Sie tun möchten ist, legen Sie die vertexArrayAttribute zurück auf das erste Objekt-Daten vor jedem Aufruf drawArrays
den draw-arrays, die Funktion verwendet die Bindungen gespeichert in der VAO zu finden die Daten, die benötigt werden, um alles zu übertragen
so zu Rendern 2 Modelle, die Sie erstellen eine zweite VAO binden Sie es und rufen Sie glVertexAttribPointer, wie gebraucht. für die Zeichnung binden Sie die VAO und rufen drawArrays für jedes Modell
InformationsquelleAutor ratchet freak