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

Aktuelle Zeit: Di Jul 15, 2025 16:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glMultiDrawElements
BeitragVerfasst: So Jul 11, 2004 14:11 
Offline
DGL Member

Registriert: So Jun 27, 2004 18:12
Beiträge: 7
Ich benutze zur Zeit VBOs in Verbindung mit glMultiDrawElements.
Nun zu meiner Frage:

Warum finde ich in diesem Forum nicht einen Beitrag zu glMultiDrawElements? Benutzt das niemand bzw. ist von der Benutzung abzuraten? Selbst in lithanders "VBO Performance Test" wird dieser Befehl nicht benutzt :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 11, 2004 14:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Weil die Funktion nicht wirklich Sinn macht. Am besten (zumindest mache ich es so), ist wenn man seine VBOs z.B. nach Material (und/oder Shader) sortiert. Ich habe dann pro Mesh für jedes Material ein eigenes VBO und muss dann ja logischerweise zwischen jedem VBO das Material wechseln, und kann dann diese VBOs nicht mit MultiDrawElements rendern.

Also anstatt mehrere VBOs mit gleichem Material/Shader mit einem Aufruf von MultiDrawElements zu rendern ists in meinen Augen sinnvoller die VBOs dann gleich beim Laden der Szene soweit wie möglich zu vereinen und dann via glDrawArrays o.ä. zu rendern. Ausserdem ist glMultiDrawElements AFAIK eine noch reichlich neue Funktion und könnte daher je nach Hardware noch Probleme machen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 11, 2004 15:15 
Offline
DGL Member

Registriert: So Jun 27, 2004 18:12
Beiträge: 7
Nuja ich war auf der suche nach einer methode die so in etwa DrawIndexedPrimitv (mit dem Befehl ist auch das was du mit den Materialien beschrieben hast möglich) von DirectX ähnelt da ich für meine Modelle halt nen Vertex und Index-buffer habe. Bei glDrawArray würde sich mein Vertexbuffer ca. versechsfachen (da jeder Vertex ca. für 6 Dreiecke verwendet wird). Und da bin ich halt auf glDrawElements und glMultiDrawElements gestossen. Nur bei glDrawElements hab ichs irgentwie nicht zustande gebracht mehr als 1 Dreieck mit einem Aufruf zu rendern ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 12, 2004 06:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bin zeitlich ziemlich kurz angebunden, deswegen hier nur ein Codeschnippsel den ich mal geschrieben hatte.
Code:
  1.   if (GL_ARB_vertex_buffer_object) then begin
  2.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  3.     glEnableClientState(GL_VERTEX_ARRAY);
  4.  
  5.     glBindBufferARB(GL_ARRAY_BUFFER_ARB, FVerticesID);
  6.     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, FTrisID);
  7.  
  8.     for Row := 0 to FHeight -2 do begin
  9.       glTexCoordPointer(2, GL_FLOAT, 5 * SizeOf(TGLfloat), Pointer(Row * FWidth * 5 * SizeOf(TGLfloat)));
  10.       glVertexPointer(3, GL_FLOAT, 5 * SizeOf(TGLfloat), Pointer((Row * FWidth * 5 + 2) * SizeOf(TGLfloat)));
  11.  
  12.       glDrawElements(GL_TRIANGLE_STRIP, FWidth * 2, GL_UNSIGNED_INT, nil);
  13. //      glDrawElements(GL_QUAD_STRIP, FWidth * 2, GL_UNSIGNED_INT, nil);
  14.     end;
  15.  
  16.     glDisableClientState(GL_VERTEX_ARRAY);
  17.     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  18.   end;

Dabei wird eine Große Fläche mit FWidth * FHeight Vertexpunkten gezeichnet. Diese liegen Zeile für Zeile in dem riesigen VBO. Und mit glDrawElements wird jeweils eine ganze Zeile gerendert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 12, 2004 08:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Du könntest auch mit glIndexPointer den Index-Buffer aktivieren und dann ganz normal glDrawArray aufrufen. Diese Funktion verwendet IMO Index-Buffer, wenn diese entsprechend gebunden sind!

_________________
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: Mo Jul 12, 2004 15:45 
Offline
DGL Member

Registriert: So Jun 27, 2004 18:12
Beiträge: 7
Erstmal danke fuer die Antworten :)

Hab heut nochmal mit glDrawElements rumexperimentiert nachdem ich mir Lossys Codeschnipsel nochmal angeguckt hab.
Bin dann im Endeffekt zu der Lösung gekommen:

glDrawElements(GL_TRIANGLES, (EndIndex-StartIndex), GL_UNSIGNED_INT, @indices[StartIndex]);

So kann ich, wie SoS beschrieben hat, meinen Buffer in mehreren Schritten rendern. Ich muss nur wissen ab welchem Index jeder einzelne Teil anfängt.

@glIndexPointer: hat sich auch interessant angehört nur hat das wohl irgntwas mit mit Farb-Indices zu tun :S Auf jeden Fall hab ich dazu nix brauchbares gefunden.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]