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

Aktuelle Zeit: Fr Jul 18, 2025 16:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fragen zu VBO's
BeitragVerfasst: Mi Feb 21, 2007 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hallo Leutz,

ich hab mal ein paar Fragen zu VBO.
Erstens wollte ich gerne VBO's und indiziertes Zeichnen benutzen. Dazu habe ich folgenden Code gefunden bei SGI

Code:
  1. Vertex arrays using a mapped buffer object for array data and an
  2.     unmapped buffer object for indices:
  3.  
  4.         // Create system memory buffer for indices
  5.         indexdata = malloc(400);
  6.  
  7.         // Fill system memory buffer with 100 indices
  8.         ...
  9.  
  10.         // Create index buffer object
  11.         BindBufferARB(ELEMENT_ARRAY_BUFFER_ARB, 2);
  12.         BufferDataARB(ELEMENT_ARRAY_BUFFER_ARB, 400, indexdata,
  13.                 STATIC_DRAW_ARB);
  14.  
  15.         // Free system memory buffer
  16.         free(indexdata);
  17.  
  18.     // Frame rendering loop
  19.     while (...) {
  20.  
  21.             // Define arrays (and create buffer object in first pass)
  22.             BindBufferARB(ARRAY_BUFFER_ARB, 1);
  23.             VertexPointer(4, FLOAT, 0, BUFFER_OFFSET(0));
  24.             ColorPointer(4, UNSIGNED_BYTE, 0, BUFFER_OFFSET(256));
  25.             BindBufferARB(ELEMENT_ARRAY_BUFFER_ARB, 2);
  26.  
  27.             // Enable arrays
  28.             EnableClientState(VERTEX_ARRAY);
  29.             EnableClientState(COLOR_ARRAY);
  30.  
  31.             // Initialize data store of buffer object
  32.             BufferDataARB(ARRAY_BUFFER_ARB, 320, NULL, STREAM_DRAW_ARB);
  33.  
  34.         // Map the buffer object
  35.         float *p = MapBufferARB(ARRAY_BUFFER_ARB, WRITE_ONLY);
  36.  
  37.             // Compute and store data in mapped buffer object
  38.             ...
  39.  
  40.         // Unmap buffer object and draw arrays
  41.         if (UnmapBufferARB(ARRAY_BUFFER_ARB)) {
  42.             DrawElements(TRIANGLE_STRIP, 100, UNSIGNED_INT,
  43.                              BUFFER_OFFSET(0));
  44.             }
  45.  
  46.             // Disable arrays
  47.             DisableClientState(VERTEX_ARRAY);
  48.             DisableClientState(COLOR_ARRAY);
  49.  
  50.             // Other rendering commands
  51.             ...
  52.  
  53.     }
  54.  


Dazu meine Frage: wo weis der, dass in dem Buffer die Indizes liegen? Es wird doch nirgendwo der Status aktiviert, dass Indizes benutzt werden sollen.

Zweite Frage: wenn ich andere Daten als Vertex-Daten und Indizes im VRAM ablegen will, z.B. für Bumpmapping den Tangentvektor, wie kann ich da VBOs benutzen? Geht das überhaupt?
Habe ein bisschen gesucht und bin da auf die Attribute gestoßen, welche man an Variablen im Shader binden kann, aber da muss ich die Daten ja auch immer im Hauptspeicher haben und dann übergeben direkt beim Rendern, oder?

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


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

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Es geht alles:
Code:
  1.  
  2. glEnableVertexAttribArrayARB(loc);
  3. glVertexAttribPointerARB(loc,dim,GL_FLOAT,0,0, (char *) NULL);
  4.  

kann ströme an generische attribute binden. loc ist dabei ein int welche man sich mit get location hohlen muss (wie bei den textureinheiten)

So in etwa kann man einen Buffer zum indizieren benutzen
Code:
  1.  
  2. glGenBuffersARB( 1, &VBO);
  3. glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, VBO);
  4. glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, num_of_indices * sizeof(int) , index, GL_DYNAMIC_DRAW_ARB);
  5. glDrawElements(mode, num_of_indices, GL_UNSIGNED_INT, (char *) NULL);
  6.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 21, 2007 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
OK versteh ich das richtig, sobald ich ein VBO aktiviere mit bind, was Indizes enthält(also GL_ELEMENT_ARRAY_BUFFER_ARB als Typ), dann erkennt das DrawElemnts ohne das ich explizit irgendwie was enablen muss?

Code:
  1. glEnableVertexAttribArrayARB(loc);
  2. glVertexAttribPointerARB(loc,dim,GL_FLOAT,0,0, (char *) NULL);


Aber bei der Variante müssen die Daten doch im Hauptspeicher liegen, oder? Also nicht wie beim VBO, das ich die einmal in den VRAM schieben und dann anwendungseitig den Speicher der Attribute wieder freigeb.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 21, 2007 23:13 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Nicht ganz die 3. Zeile lädt die daten hoch uind die 4. rendert. Beide lassen sich nach bedarf verwenden...


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.011s | 14 Queries | GZIP : On ]