PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : nochmal VBO (zeckensack;))


Chris Lux
2003-05-26, 06:07:32
hi, nochmal ;)

ich habe mal einen einfachen test gehackt um vbo zu testen. ich rendere nur ein riesen quadrat (mit variabler dimension was die triangulierung angeht). wenn ich vbos benutzte bekomme ich ca 42,5mio Dreiecke pro sekunde. nutze ich keine vbos bekomme ich immer noch 39mio Dreiecke pro sekunde. sollten vbos nicht einen richtigen schub bringen was dies angeht oder sind meine daten nicht realistisch?

für die testzwecke habe ich ein 500x500 Gitter von vertices als triangle strip benutzt (als einen generalisierten tristrip) was in ca. 500*500*2 Dreiecken resultiert. wie man unten sieht schicke ich nur vertexpositionen an die grafikkarte, im vs gebe ich die position noch als farbe weiter an die fs (nur damit ich was sehe ;)).


#ifdef USE_VBO
glBindBufferARB(GL_ARRAY_BUFFER_ARB, gBufferID);
glVertexPointer(3, GL_FLOAT, 0, (char*)NULL +vertOff);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, gEBufferID);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawElements(GL_TRIANGLE_STRIP, gEBufferCount, GL_UNSIGNED_INT, (char*)NULL + inOff);

glDisableClientState(GL_VERTEX_ARRAY);
#else
glVertexPointer(3, GL_FLOAT, 0, gBuffer);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawElements(GL_TRIANGLE_STRIP, gEBufferCount, GL_UNSIGNED_INT, gEBuffer);

glDisableClientState(GL_VERTEX_ARRAY);
#endif



edit:
ich nutze eine gf4 ti4600, mit den det44.03. und die buffer wurden mit GL_STATIC_DRAW_ARB angelegt um wirklich maximale performance zu testen.

edit2:
wenn ich nur ein 100x100 gitter benutze steigt der unterschied von 27mio zu 47mio Dreiecken. ok ;) das macht mich jetzt stutzig...

zeckensack
2003-05-26, 11:40:06
Original geschrieben von Hans Ohlo
hi, nochmal

ich habe mal einen einfachen test gehackt um vbo zu testen. ich rendere nur ein riesen quadrat (mit variabler dimension was die triangulierung angeht). wenn ich vbos benutzte bekomme ich ca 42,5mio Dreiecke pro sekunde.Das hört sich ungefähr nach dem theoretischen Maximum der Gf4Ti4600 an. Wenn man 'pro Vertex ein Dreieck' rechnet, kommt man auf ~150 Mio/Sekunde, mehr geht einfach nicht.
nutze ich keine vbos bekomme ich immer noch 39mio Dreiecke pro sekunde.Wie stellst du das an? Ganz ohne Extensions (NV_vertex_array_range)?
Das ist nämlich schon eine erstaunlich hohe Zahl :|
Hast du das ganze vielleicht in eine Display List gekapselt? Geometrie aus DLs ist immer sehr schnell, wenn ja, vergleiche nochmal ohne.
sollten vbos nicht einen richtigen schub bringen was dies angeht oder sind meine daten nicht realistisch?VBOs sollen den Geometrietransfer optimal gestalten, in Situationen wo die Karte einfach zu viel zu tun hat (vor allem durch zu komplexe Vertex Shader) tut sich nix. Ich denke du hast da schon den richtigen Ansatz.
für die testzwecke habe ich ein 500x500 Gitter von vertices als triangle strip benutzt (als einen generalisierten tristrip) was in ca. 500*500*2 Dreiecken resultiert. wie man unten sieht schicke ich nur vertexpositionen an die grafikkarte, im vs gebe ich die position noch als farbe weiter an die fs (nur damit ich was sehe ;)).Hört sich sinnvoll an. Ich kann zwar der Berechnung des Dreieckscounts nicht ganz folgen, aber wenn du's sagst :)
Um einen höheren Schub zu forcieren, kannst du auch mal mit 'größeren' Vertices inklusive Farben, Texturkoordinaten und was dir sonst noch gerade einfällt versuchen.
Mein Bauchgefühl sagt mir, daß VBOs umso günstiger abschneiden, je dicker (und damit bandbreitenlastiger) die einzelnen Vertices sind.


edit:
ich nutze eine gf4 ti4600, mit den det44.03. und die buffer wurden mit GL_STATIC_DRAW_ARB angelegt um wirklich maximale performance zu testen.Nur so nebenbei: auf Gf4 ist das IMO so implementiert, daß STATIC_DRAW Grafikspeicher und DYNAMIC_DRAW AGP-Speicher besetzt (zumindest bei den Vertex-Daten; bei Indices gibt's AFAIK nur AGP-Speicher, weil die Gf4 das lieber hat).

edit2:
wenn ich nur ein 100x100 gitter benutze steigt der unterschied von 27mio zu 47mio Dreiecken. ok ;) das macht mich jetzt stutzig... Das ist jetzt allerdings wirklich merkwürdig. Du verheimlichst mir doch irgendwas :|

Chris Lux
2003-05-26, 16:55:02
Original geschrieben von zeckensack
Wie stellst du das an? Ganz ohne Extensions (NV_vertex_array_range)?
Das ist nämlich schon eine erstaunlich hohe Zahl :|
Hast du das ganze vielleicht in eine Display List gekapselt? Geometrie aus DLs ist immer sehr schnell, wenn ja, vergleiche nochmal ohne.



nope keine DLs, einfach die felder, welche ich zum initialisieren der VBOs nutze:


gBuffer = (unsigned char*)malloc(gBufferSize);
.
.
.
#ifdef USE_VBO
glGenBuffersARB(1, &gBufferID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, gBufferID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, gBufferSize, gBuffer, GL_STATIC_DRAW_ARB);
free(gBuffer);
#endif
.
.
.
#ifdef USE_VBO
glBindBufferARB(GL_ARRAY_BUFFER_ARB, gBufferID);
glVertexPointer(3, GL_FLOAT, 0, (char*)NULL +vertOff);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, gEBufferID);

glEnableClientState(GL_VERTEX_ARRAY);

glDrawElements(GL_TRIANGLE_STRIP, gEBufferCount, GL_UNSIGNED_INT, (char*)NULL + inOff);

glDisableClientState(GL_VERTEX_ARRAY);
#else
glVertexPointer(3, GL_FLOAT, 0, gBuffer);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawElements(GL_TRIANGLE_STRIP, gEBufferCount, GL_UNSIGNED_INT, gEBuffer);

glDisableClientState(GL_VERTEX_ARRAY);
#endif



+
Das ist jetzt allerdings wirklich merkwürdig. Du verheimlichst mir doch irgendwas :|

nope ;)
ganz simpler beispiel-hack ;) um mir das mal anzuschauen, aber irgendwie scheint der bei dem 1000x1000 gitter wirklich fast identische werte zu bekommen. weiss nicht woran das liegen kann, ich weiss auch nicht in wie weit das von der auflösung abhängt, da er ja sehr kleine (subixel-)dreiecke bekommt durch die sehr feine triangulierung.