Archiv verlassen und diese Seite im Standarddesign anzeigen : Was ist ein Vertex Buffer Objekt?
Ich würde das gerne wissen weil ich nicht verstehe was Google mir verlinkt... Irgendwas mit Vertex Arrays... da weiß ich aber auch nicht was das ist.
Kann man das in für den Laien verständlichen Worten ausdrücken vielleicht mit einem Beispiel? Wäre lieb wenn ihr mir helfen könntet :)
Whiz-zarD
06.04.2014, 00:52
Ein Vertex (Plural ist Vertices) ist einfach ausgedrückt ein Eckpunkt und deren Farbe eines Polygons. Ein Rechteck (= Polygon) besteht also z.B. aus vier Vertices.
Ein Vertex-Array ist also ein Array* von Vertices.
Der Vertex Buffer ist einfach ausgedrückt ein Zwischenspeicher für Vertex-Arrays innerhalb des Grafikspeichers.
Angenommen, wir wollen ein Haus zeichnen. Es wäre ja ziemlich unsinnig, dieses Haus mittels Programmcode zu zeichnen, was ja durchaus möglich ist.
Für ein einfaches Beispiel nehme ich aber ein Dreieck mit folgenden Punkten:
* (1,0)
/|\
/ | \
/ | \
/ | \
---*----|----*---
(0,-1) (0,1)
// Innerhalb des Loops
GeheZu(0, -1)
ZeichneLinie(1, 0)
ZeichneLinie(0, 1)
ZeichneLinie(0, -1)
Das ist jetzt Pseudo-Code und er würde einfacherweise Dreieck zeichnen.
Per Vertex-Array haben wir die Möglichkeit die Eckpunkte vom Dreieck einmal festzulegen, und können sie dann zeichnen. Beispiel:
// Beim Starten der Anwendung
dreieck = { {1,0}, {0,1}, {0,-1} }
SchreibeInDenVertexBuffer(dreieck)
[...]
// Innerhalb des Loops
ZeichneVBO() // VBO = Vertex Buffer Object
Um es mal ganz simpel zu halten.
Das Problem ist ja, dass man jedes Polygon bei jedem Aufruf des Loops** neu berechnen muss. Das kann bei sehr komplexen Polygonen sehr unperformant werden, weil man jedes Mal die Zeichnen-Routine aufruft (oberer Pseudo-Code). Auch führt dies nicht grad zu einem wartbaren Code, wenn da zig tausend Mal die Zeichne()-Funktion aufgerufen wird. Um diese Inperformanz zu minimieren und den Code schlanker zu machen, kann man diese Polygone als Vertex Buffer Object (VBO) im Grafikspeicher hinterlegen, damit diese nicht immer per Zeichnen-Routine und Programmcode berechnet werden müssen (unterer Pseudo-Code).
Ich hoffe, das war verständlich genug. :)
---
* Ein Array kannst du dir wie ein Paket vorstellen. In dieses Paket legt man z.B. Bücher rein. Jedes Buch repräsentiert dann die Daten, auf die man dann innerhalb des Pakets zugreifen kann.
** Der sog. Loop (= Schleife) ist für Grafikanwendungen essentiell. Innerhalb eines Schleifendurchgangs wird die Eingabe verarbeitet, die Logik berechnet und die Ausgabe generiert. Wenn ein Spiel z.B. mit 60 FPS läuft, durchläuft das Spiel also 60 Mal diese Schleife.
Ja das war verständlich und interessant ich danke dir.
Wie wir darauf kamen war, dass jemand in einem Spiel durch einen Grief dafür gesorgt hat, dass jeder in der Nähe unheimlich hohe Memoryauslastung bekam und danach abgestürzt ist mit einer Fehlermeldung die etwas über memory allocation und vertex buffer objects aussagte.
Das deaktivieren der OpenGL Vertex buffer Objects hat dann auch zur Verbesserung im Spiel geführt (auch im Task Manager bei Memory Auslastung ersichtlich). Jetzt wollten wir wissen was VBOs sind, damit wir evtl. verstehen können wie dieser Grief funktioniert hat. Allerdings scheinen VBOs so wie sich das liest ja eher das System zu entlasten, wenn ich das richtig verstanden habe?
Das deaktivieren der OpenGL Vertex buffer Objects hat dann auch zur Verbesserung im Spiel geführt
Ist das eine Option in eurem Spiel? Kann mir grad nicht vorstellen, was das tun soll. Das Prinzip des Buffering, also Zwischenspeicherns, ist im Grafikbereich ziemlich fundamental. Vielleicht betrifft die Option eine Art und Weise wie der Speicher alluziert also angelegt wird. Der VBO ist ein sehr fundamentaler Teil von 3D Grafikprogramierung. Das ist weniger ein Feature, als einfach ein absolut notwendiges etwas. Wie Shader. Die machen den Code auch sehr textlastig, wenn man nur einfache Sachen zeichnen will.
Es könnte sein, dass der Spieler ein Objekt mit sehr vielen Punkten "erschaffen" hat, und das den Speicher bei euch lokal lahmlegte.
Ja es gibt OpenGL Vertex Buffer Objects und Gestreamte VBOs als Option und wenn ich beides deaktiviere läuft das Spiel bei mir flüssiger.... Der Grief scheint irgendwie durch sehr komplexe Meshs hervorgerufen werden, von denen mehrere platziert werden und somit das System überlasten, graphic griefer gibt es in diesem Spiel schon lange und teilweise ist das so böse, dass alte Grafikkarten kaputt gehen. Ich weiß aber nicht wieso gerade das abstellen von VBOs geholfen hat, dass der Grief unwirksam war, weil sollte dann nicht das gleiche was bei VRAM passierte dann beim Hauptspeicher passieren?
Ich find das ganze irgendwie interessant, deshalb danke für die Informationen :)
Whiz-zarD
06.04.2014, 10:48
Ich weiß nicht, um welches Spiel es sich handelt. Meine erste Vermutung war Minecraft, aber seit 2011 wurde der Code für die VBOs umgeschrieben (zumindest hatte man es vor). Notch hatte jemanden um Hilfe gebeten, der sich mit OpenGL sehr gut auskennt. Ich kann mir auch nicht erklären, wieso ein Spiel besser laufen sollte, wenn man die VBOs deaktiviert. Die VBOs sind ja dafür da, um das System zu entlasten. Ich kann mir nur vorstellen, dass jemand die VBOs falsch implementiert hat. Z.B. wenn jemand pro Loop-Durchgang den Vertex Buffer leert und neu beschreibt. Das könnte vielleicht zu Problemen führen, aber dafür kenne ich mich mit der Computergrafik nicht gut genug aus.
mh das kann durchaus möglich sein. auf jeden Fall hat dieser Thread schon mal zu meinem Verständnis beigetragen. Ich habe das oft, dass es Grafikoptionen gibt wo ich kA habe was die machen. Ich weiß zumindest bis heute nicht ob es nun Anti-Aliasing oder Anisotropische Filterung ist, die Kanten glättet
mh das kann durchaus möglich sein. auf jeden Fall hat dieser Thread schon mal zu meinem Verständnis beigetragen. Ich habe das oft, dass es Grafikoptionen gibt wo ich kA habe was die machen. Ich weiß zumindest bis heute nicht ob es nun Anti-Aliasing oder Anisotropische Filterung ist, die Kanten glättet
Sowohl als auch glättet Kanten. Beides sind zwei verschiedene Verfahren, welche jeweils zu einer anderen Situation eingesetzt werden um Kanten weicher zu machen und damit 3D-Grafiken ein "natürlicheres" Aussehen zu geben.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.