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

Aktuelle Zeit: Fr Jul 18, 2025 12:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Feb 08, 2006 13:25 
Offline
DGL Member

Registriert: Mi Feb 08, 2006 13:15
Beiträge: 4
Hoi allerseits,

ich scheiter hier gerade daran Multitexturing bei einem VertexBufferObject anzuwenden...
Also habe ein VertexBufferObject erstellt. Ich zeichne das ganze dann folgendermaßen:
Code:
  1.   glInterleavedArrays(GL_T2F_N3F_V3F, SizeOf(TVertex), nil);
  2.   glDrawArrays(GL_TRIANGLES, 0, VBO_Size);

Mit einer Textur funktioniert das alles super. Nur wenn ich meherer Texturen zwecks Detailmapping usw. verwenden möchte müsste ich ja die Texturkoordinaten per
Zitat:
glMultiTexCoord2f(GL_TEXTURE0, 0, 0);
für jede Texturstufe übermitteln. Doch wie könnte ich das machen, da ich ja zum zeichnen einfach die oberen Funktionen verwende.
Oder kann ich OpenGL irgendwie sagen, dass es die in glInterleavedArrays(GL_T2F_N3F_V3F, SizeOf(TVertex), nil) übergebenen Texturkoordinaten einfach auf alle Texturstufen anwendet?

Vielen Dank schonmal
proteus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich dreh am Rad... War fast fertig mit antworten und dann hab ich Idiot das Fenster zugemacht. Aus versehen versteht sich.

Mit Interleaved kannst du das in diesem Falle vergessen. Das kann nur eine begrenzte Anzahl an Fällen abfackeln. Du brauchst dafür folgende Methoden. glTexCoordPointer, glNormalPointer, glVertexPointer und glEnableClientState.

So in etwa müsste das dann aussehen
Code:
  1. - Textur 0 aktivieren
  2. - TexCoordPointer aufrufen.
  3. - ClientState aktivieren Steht alles im Wiki
  4.  
  5. - Textur 1 aktivieren
  6. - TexCoordPointer
  7. - ClientState
  8.  
  9. - NormalPointer
  10. - ClientState
  11.  
  12. - VertexPointer
  13. - ClientState
  14.  
  15. - DrawArray

Du kannst so auch dafür sorgen, dass alleine deine Vertexe auf einen Haufen liegen und nicht immer alles direkt hintereinander liegen muss wie es mit Interleved der Fall ist. Stride gibt die Größe deines Arrays an. In deinem Fall sollte das 40 - größe des aktuellen feldes sein, da 10F (T2F T2F N3F V3F) = 40 Bytes insgesammt und du musst da halt angeben wie viele Bytes bis zum nächsten Feld existieren. Pointer ist kein wirklicher Pointer sondern gibt das Offset innerhalb des VBOs an. Also bei der ersten TexCoor wäre das 0 bei der zweiten dann 8 usw.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 13:59 
Offline
DGL Member

Registriert: Mi Feb 08, 2006 13:15
Beiträge: 4
Vielen Dank für die schnelle Antwort.
Werd mich da gleich mal intensiver drüber informieren.

mfg
proteus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 18:13 
Offline
DGL Member

Registriert: Mi Feb 08, 2006 13:15
Beiträge: 4
Hm...

also irgendwie krieg ich das nicht so wirklich zum laufen. Hab jetzt erstmal versucht nur die Vertexe über Lossys Code zeichnen zu lassen, aber er zeichnet nur ein riesiges graues Rechteck über den ganzen Sichtbereich.
Code:
  1. procedure TVertexBufferObject.Draw;
  2. begin
  3.   glVertexPointer(3, GL_FLOAT, 20, Pointer(Integer(VBO_Pointer)+20));
  4.   glEnableClientState(GL_VERTEX_ARRAY);
  5.  
  6.   glDrawArrays(GL_TRIANGLES, 0, VBO_Size);
  7.  
  8.   glDisableClientState(GL_VERTEX_ARRAY);
  9. end;

Das Vertex array besteht aus packed records der form:
Code:
  1.   TVertex = packed record
  2.     uvS, uvT: Single;
  3.     nX, nY, nZ: Single;
  4.     X, Y, Z: Single;
  5.   end;
  6.  

Und die Daten werden ja auch korrekt in den Vertexbuffer geschrieben, mit glInterleavedArrays(...) funktioniert es ja.

Hab mich jetzt durch das (übrigends sehr gute) Wiki gekämpft aber ich find den Fehler nicht :cry:

mfg
proteus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 19:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst die anderen Pointer ja auch setzen bevor du glDrawArray aufrufst.

Der Aufruf von
Code:
  1. glInterleavedArrays(GL_T2F_N3F_V3F, SizeOf(TVertex), nil);


würde als Einzelaufrufe in etwa so aussehen.
Code:
  1. glTexCoordPointer(...);
  2. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  3.  
  4. glNormalPointer(...);
  5. glEnableClientState(GL_NORMAL_ARRAY);
  6.  
  7. glVertexPointer(...);
  8. glEnableClientState(GL_VERTEX_ARRAY);


Wenn du also den TexturKoordinaten Pointer weglässt dann werden natürlich auch keine TexturKoordinaten gesetzt.


Was mir gerade auffällt. Du darfst als Pointer natürlich keinen Pointer angeben sondern das ist bei VBOs das Offset in dem VBO Buffer. Also 0 (nil) ist der Anfang des Buffers. Und 10 ist 10 Bytes vom Anfang entfernt. Also dort bitte keinen Speicherpointer übergeben. glBindBuffer hast du auch angerufen? Okay. Sonst hättest du vorher ja nichts gesehen gehabt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 20:51 
Offline
DGL Member

Registriert: Mi Feb 08, 2006 13:15
Beiträge: 4
Ah...Es funktioniert. Vielen Dank :D

Code:
  1.   glTexCoordPointer(2, GL_FLOAT, 32, nil);
  2.   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  3.  
  4.   glNormalPointer(GL_FLOAT, 32, Pointer(8));
  5.   glEnableClientState(GL_NORMAL_ARRAY);
  6.  
  7.   glVertexPointer(3, GL_FLOAT, 32, Pointer(20));
  8.   glEnableClientState(GL_VERTEX_ARRAY);
  9.  
  10.   glDrawArrays(GL_TRIANGLES, 0, VBO_Size);
  11.  
  12.   glDisableClientState(GL_VERTEX_ARRAY);

So gehört es richtig. Dann hab ich die Beschreibungen im Wiki falsch verstanden. Auf jedenfall funktioniert es so jetzt optimal.

Nochmals vielen Dank für die schnelle, kompetente Hilfe!

mfg
proteus[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 08, 2006 21:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ne die Beschreibung im Wiki ist richtig. Aber leider nicht ganz für VBOs gültig. Die im Wiki ist nur für Clientseitige VertexBuffer. Die liegen dann aber nicht auf der Grafikkarte. Dort müssen dann Adressen der Daten übergeben werden. VBOs benutzen die selbe Technick und die selben Methoden. Aber mit leicht abgewandeltem letzten Parameter.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 09, 2006 12:59 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Da könnte ja mal jemand der sich damit auskennt den VBO Artikel leben einhauchen:
http://wiki.delphigl.com/index.php/Hintergrundwissen#Optimierungen

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 09, 2006 13:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Irgendwie habe ich das bedrückende Gefühl du möchtest mir etwas sagen? :roll: ;-)

Muss ich mal schauen wenn ich zeitlich ein wenig besser gestückt bin als es gerade der Fall ist. Wobei wir dazu ja auch ein Tutorial haben. Aber da stehen solche Informationen nun auch nicht drinne.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 09, 2006 23:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Och Lossy ... Das scheint nur so... 8)
Es kann sich ruhig auch jemand anderes dafür verantwortlich zeichnen, nur halt wer? Das soll hier jetzt nicht wie ein Aufruf klingen, aber ich rufe hier ganz offen mal zur mitarbeit auf. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 10, 2006 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich denke mal ich werde mich dem annehmen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.009s | 16 Queries | GZIP : On ]