Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 18:37

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Multitexturing, Vertex-Arrays & VBOs
BeitragVerfasst: Do Okt 16, 2003 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Hi!

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 11:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da VBOs im Endeffekt genauso an die TMUS gebunden werden wie VAs schreib ich mal wies für VAs gemacht wird :
Code:
  1.  glActiveTextureARB(GL_TEXTURE*_ARB);
  2. glEnableClientState(GL_VERTEX_ARRAY);
  3. glVertexPointer(...);
  4. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  5. glTexCoordPointer(...);

Das muss dann für jede verwendte TMU festgelet werden.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:05 
Offline
DGL Member
Benutzeravatar

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)?

:shock: Ö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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
?!? 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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:21 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:23 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
@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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:42 
Offline
DGL Member
Benutzeravatar

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. :twisted:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 12:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Ja klar. Ich fang' moch mit meiner eigenen Speicherverwalltung an! (Hmmm, warum eigentlich nicht :lol:).

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 13:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
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)

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 13:20 
Offline
DGL Member
Benutzeravatar

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*)
Code:
  1.  
  2.   glBindBuffer(...);
  3.   glEnableClientState(GL_VERTEX_ARRAY);
  4.   glVertexPointer(3, GL_FLOAT, 7 * SizeOf(GL_FLOAT), 0);
  5.  
  6.   glActiveTextureARB(GL_TEXTURE0_ARB);
  7.   ...
  8.   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  9.   glTexCoordPointer(2, GL_FLOAT, 7 * SizeOf(GL_FLOAT), 3 * SizeOf(GL_FLOAT));
  10.  
  11.   glActiveTextureARB(GL_TEXTURE1_ARB);
  12.   ...
  13.   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  14.   glTexCoordPointer(2, GL_FLOAT, 7 * SizeOf(GL_FLOAT), 5 * SizeOf(GL_FLOAT));
  15.  
  16.   usw.
  17.  

Bin mir nocht 100%tig sicher aber sollte so klappen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 13:24 
Offline
DGL Member
Benutzeravatar

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
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.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 16, 2003 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Ü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 ?

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]