Irgendwie steh' ich gerade auf dem Schlauch. Multitexturing an sich iss ja prinzipiell kein probkem, aber wie kann ich das ganze in Verbindung mit VertexArrays/VBOs realisieren?
Ok, dass ich pro textur ein VBO verwenden muss (also alle Primitive nach Texturen Gruppieren und dann entsprechend die VBOs/VertexArrays erstellen) ist mir ja soweit klar. Aber wie gesagt: wie kann ich im VBO bzw. VertexArray die Texturcoordinaten für die 1., 2., 3., .... TextureUnit übergeben?
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Hmmm, das heisst dann, dass ich bei 2 Texturen 3 Verschiedene VertexArrays/VBOs benötige, richtig? Gibt's auch 'ne Möglichkeit, Alles in einen Buffer zu Packen (mit nur Eine textur-Einheit geht das ganze ja)?
Wobei es vor allem bei dynamischen Vertex-Daten in Bezug auf VBO performanter sein dürfte, die Vertex-Daten in einem Separaten buffer zu haben.
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
SchodMC hat geschrieben:
Hmmm, das heisst dann, dass ich bei 2 Texturen 3 Verschiedene VertexArrays/VBOs benötige, richtig? Gibt's auch 'ne Möglichkeit, Alles in einen Buffer zu Packen (mit nur Eine textur-Einheit geht das ganze ja)?
Öhm...eigentlich nicht.Mittels glVertexPointer übergibst du doch nur nen Zeiger auf dein VA bzw. bindest mittels glBindBufferARB das aktuelle VBO an die TMU.Da brauchst du doch immer nur ein VBO bzw. ein VA.
?!? Wieso? Ich hab' 1 Buffer für die Vertices, 1 Buffer für die texture-Coordinaten für TU 1, und 1 Buffer für die Textur-Coordinaten für TU 2. Macht also insgesamt 3. Oder hab' ich da 'nen Denkfehler? Können die Textur-Coordinaten nicht auch in 'nem VBO abgelegt werden?
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Da hab ich dich nicht korrekt verstanden,was wohl an deiner leicht falschen Ausdrucksweise lag.Du hast gesagt man bräuchte drei VAs für zwei TMUs.Das stimmt ja nicht,denn man braucht 1 VA + 2 Texcoordarrays.Da gibts glaub ich auch keine andere Möglichkeit,da die interleaved Formate für VAs (z.B, GL_T2F_V3F) nur auf eine TMU ausgelegt sind.Du wirst also nicht um 1VA+2TCAs rumkommen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Ich hab' 1 Buffer für die Vertices, 1 Buffer für die texture-Coordinaten für TU 1, und 1 Buffer für die Textur-Coordinaten für TU 2.
Das ist nut mit der ATI Extension (GL_ATI_Vertex_array_object) möglich. Alle anderen extension unterstützen nur EINEN Buffer. Bei der ATI Extension kannst du jeweils getrennte ID's übergeben.
Bei VBO's wird von den Herstellern empfohlen, dass du die Daten interleaved abspeicherst. Also Vertexkoordinaten, TexCoord1, TexCoord2, Vertexkoordinaten, TexCoord1, TexCoord2, etc.
Du kannst also davon ausgehen, dass dies die performanteste Möglichkeit ist. Abgesehen mal davon, dass die Programmierung davon auch einfacher ist.
Zitat:
Irgendwie steh' ich gerade auf dem Schlauch. Multitexturing an sich iss ja prinzipiell kein probkem, aber wie kann ich das ganze in Verbindung mit VertexArrays/VBOs realisieren?
Das glVertexPointer muss man nicht für jede Textureinheit aufrufen.
Aber vielleicht hilft dir das ein wenig beim Verstehen der Problematik. mit glTextCoordPointer legst du die Texturkoordinaten für die Texturen fest. Und dies geschieht immer auf die aktuelle Textureinheit. Standard ist dies logischerweise 1. Genau so wie bei glBindTexture. Um die anderen TexturKoordinaten einzustellen musst du nur (wie sos bereits sagt) die Textureinheit aktivieren. Die Textur setzen und den Pointer deiner Texturkoordinaten (mittels glTexCoordsPointer) setzen.
@SOS: Hey, VA, TCA, iss doch quasi das gleiche *duck
@Lossy: Dumm nur, das ich 'ne nVidia Karte hab. Naja. Aber bei VBOs iss es dann möglich, mehrere TCs hintereinander im Interleaved-Buffer anzugeben? Muss mir wohl mal die Definition der Extension anschaun.
Ok, soviel zur Theorie. Iss mr jetzt einigermaßen geläufig. Werd' heute Abend mal entsprechend 'rumspielen...
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja das ist möglich. Ist sogar üblich.
Es gäbe aber durchaus noch eine andere Möglichkeit. (nicht zum Nachmachen empfohlen)
Du könntest ein großes stück Speicher reservieren und dann erst alle VertexKoordinaten, dann alle Texturkoordinaten (TMU1) und dann alle Texturkoordinaten (TMU2). Mit den gl*Pointermethoden kann man auch so etwas einstellen. Aber das ist nicht zu empfehlen! Es würde aber funktionieren.
Ja klar. Ich fang' moch mit meiner eigenen Speicherverwalltung an! (Hmmm, warum eigentlich nicht ).
Allerdings iss das nicht ganz abgwähgig, da man bisher bei der NVidia-Extension teilweise auf solche "Tricks" angewiesen war! Nur gut, dass es das ARB gibt
@Lossy: Wenn ich nurn Vertice, TC1 und TC2 hintereinander in einem VBO hab (also immer anwechselnd, wie von Dir beschrieben), wie teil' ich dass dann OpenGL mit? Die Lösung von SOS iss mir ja geläufig, aber die Du genannt hast? Hmm...
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
MultiTexture Koordinaten sind für IMHO ohnehin etwas ungünstig implementiert - muss man doch jede Textureinheit separat mit Texturkoordinaten "befüllen", obwohl es sich oft um genau die selben Koordinaten handelt (etwa wenn Texturen nur übergeblendet werden sollen)
Einen bequemen Ausweg bieten hier Vertexprogramme, mit denen man Texturkoordinaten leicht auf verschiedene Textureinheiten durchschleifen kann, und die eigentlich von der gesamten gängigen Hardware unterstützt werden (blöd ist hier dafür eventuell, dass man dann evtl. ein eigenes Beleuchtungsmodell implementieren muss, da das von OpenGL effektiv ausgeschaltet wurde)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Unter einigen Gesichtspunkten würde das vielleicht sogar Sinn machen. Aber ich glaube mal, dass das nur ein Nebeneffekt der flexiblen Schnittstellen ist.
Zu dem Wie.
Das machst du genau so wie SOS auch beschrieben hat. (Sofern ich da nicht was falsch verstanden hab. *g*)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
MultiTexture Koordinaten sind für IMHO ohnehin etwas ungünstig implementiert - muss man doch jede Textureinheit separat mit Texturkoordinaten "befüllen", obwohl es sich oft um genau die selben Koordinaten handelt (etwa wenn Texturen nur übergeblendet werden sollen)
Hier sollte es doch ausreichen, wenn man für die beiden Textureinheiten ein und den selben Pointer definiert. Oder spuckt einem da der Treiber dazwischen?
Nein, das klappt natürlich schon - nur legt der Treiber die Daten serverseitig (also z.B. auf der GraKa) wahrscheinlich dennoch doppelt ab, da er kaum checken wird, dass es sich effektiv um die selben Koordinaten handelt.
Mit einem Vertexprogramm "weiß" ich, dass ich nur ein Koordinatenpaar pro Schnittpunkt übergebe (das wahrscheinlich auch nur einmal transformiert wird).
Außerdem spart man einiges an Datendurchsatz, da die Texturkoordinaten ja dennoch zweimal kopiert werden, auch wenn die selbe Addresse übergeben wird.
Übrigens (weils grad zum Thema passt):
Neue Grafikkarten haben ja mehr Texture Image Units als Texture Coordinate Units - weiß jemand eine Möglichkeit diese auch zu nutzen (außerhalb von Fragmentprogrammen), bzw. eine Möglichkeit zu definieren, welche TCU welcher Image Unit zugeordnet wird ?
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.