OpenGL VBOs und Multitexturing
-
Genau, Displaylisten hatte ich erst in Verwendung allerdings ist da das Problem dass man, wenn man die Szene verändert, die Liste komplett anlegen muss.
Verzeihung dass ich die ganze Zeit von VBOs rede, ich hab jetzt rausgekriegt wie man VertexArrays richtig verwendet. Da kann man nämlich einfach bestimmte Werte innerhalb des Pointers (z.B: VerticesList[VertexIndex*3+0] = x; VerticesList[VertexIndex*3+1] = y; VerticesList[VertexIndex*3+2] = z) verändern. Das ist jedenfalls schneller als Displaylisten nicht wahr?!
-
ich glaube du verwechselst/vermischt VertexArrays mit VBOs. das sind zwei verschiedene dinge.
Je nachdem wie gut man coded und wie gut der treiber ist, sind VBOs oder DLs schneller.
Vertexarrays sollten langsammer sein.
-
Das ist jedenfalls schneller als Displaylisten nicht wahr?!
wenn du eine neue displayliste anlegst werden alle dafuer benoetigten daten vom ram in den grafikspeicher kopiert plus einige optimierungen vom treiber durchgefuehrt weil er davon ausgeht, dass du die liste mehr als einmal benutzen willst.
wenn du den vertexbuffer deines vbos (komplett) mit neuen daten ueberschreibst ist der aufwand dafuer ungefaehr der gleiche.
grundlegend macht das nur dann sinn, wenn sich die aenderungen nicht sinnvoll durch einen vertex-shader erledigen lassen.
wenn deine vertexdaten nicht interleaved sind hast du bei vbos jedoch den vorteil, dass du nur einen buffer ueberschreiben musst, wenn sich nur ein attribut deiner vertices aendert.
-
rapso schrieb:
ich glaube du verwechselst/vermischt VertexArrays mit VBOs. das sind zwei verschiedene dinge.
Ja, das hab ich auch erst vor kurzem gemerkt.

Allerdings glaube ich dass man bei VBOs, wenn man auch nur ein Vertex verändern will, genau wie bei Displaylisten, alles neu erstellen muss oder?
Und noch was: es sollte doch relativ leicht sein von VertexArrays auf VBOs umzustellen oder?
-
Allerdings glaube ich dass ...
Und wie kommst Du zu dieser These?
Guck doch mal in die Dokumentation, da steht sowas drin.
Dann kennt man die Fakten und muss keine Vermutungen anstellen.
Hier gibt's auch ein Paper dazu, kannste mal lesen - das macht schlau.
-
Nagut, ich bin gerade dabei auf VBOs umzustellen allerdings habe ich jetzt ein anderes Problem:
class vector3d { public: /* jede menge funktionen (operator +, -, * / ... usw.) */ float X, Y, Z; }; class color { public: /* ebenfalls funktionen ähnlich wie in vector3d */ unsigned char Red, Green, Blue, Alpha; }; typedef struct { vector3d Coord; color Color; } vertex3DInfo; std::vector<vertex3DInfo> VerticesList; /* Vertices anlegen ... */ // Geht das so? glBufferDataARB(GL_ARRAY_BUFFER_ARB, VerticesList.size()*sizeof(vector3d), &(VerticesList)[0].Coord, GL_STATIC_DRAW_ARB); // Mit 'glVertexPointer' sah das so aus: //glVertexPointer(3, GL_FLOAT, sizeof(vertex3DInfo), &(VerticesList)[0].Coord);Man beachte hier bei dass bei 'glBufferDataARB' auf einen Pointer verwiesen wird in dem auch noch andere Informationen, nämlich 'Color', stehen. Mit 'glVertexPointer' hat das wunderbar funktioniert. Wie mache ich das am bessten mit VBOs?
-
wenn du deine vertex-struktur so beibehalten willst, hast du eben nur einen einzigen vertexbuffer (interleaved) und gibst dann bei gl...Pointer() einen offset an, wo das jeweilige vertexattribut in der struktur zu finden ist.
-
In Ordnung, aber soll dass heißen dass ich auf alle Fälle die Funktion 'glInterleavedArrays' verwenden muss?
-
Ich hab das jetzt in etwa so:
// 4*(3 + 1) >> 4 = 4 bytes (3 float & 4 char), NULL + 0 >> 0 = steht als erstes in der vertex3DInfo struct! glVertexPointer(3, GL_FLOAT, 4*(3 + 1), (char*)NULL + 0);Aber irgendwas mache ich immer noch falsch. Ich kann kein Object sehen.
Und wenn ich das schreibe stürzt das Programm ganz ab:glVertexPointer(3, GL_FLOAT, sizeof(vertex3DInfo), (char*)NULL + 0);Was mache ich denn falsch?
-
Wenn Du mal sizeof(vector3d) und mal sizeof(vertex3DInfo) nimmst, wird das wohl auch nicht gehen...
Solche Fluechtigkeitsfehler koenntest Du auch alleine finden.
-
Funktioniert inzwischen. Ich glaube es lag sogar an deinem benannten Fehler. Kann ich nicht genau sagen, ich hab ein Testprogramm geschrieben um meinen Fehler zu finden und dann hat's auch geklappt.
Noch ne kleine Frage:
Was ist schneller, in einer for-Schleife eine Displaylist aktualisieren oder einen VBO-Buffer aktuallisieren?