2011-01-31 12 views
13

Tengo que dibujar un búfer que contenga un par de miles de vértices. Estoy usando un vbo para almacenar los datos.Datos de actualización de OpenGL VBO

Sé que tendré que actualizar el VBO muchas veces, pero solo en pequeñas partes a la vez.

Así que me pregunto cuál es el mejor método para hacerlo es:

  1. de Split VBO arriba en OISCIV más pequeños (que sostienen como 300 Verts) y luego actualizar OISCIV individuales con 1 llamada?
  2. Un gran VBO y use lotes de glBufferSubData() llamadas?
  3. Use glMapBuffer() y una gran VBO?

Respuesta

2
  1. no suena como una buena idea: te obliga a dibujar en varias llamadas mientras se cambia el tampón de ligado entre cada llamada sorteo.
  2. Podría hacer el truco si tu memoria intermedia es enorme.
  3. Todo el búfer se cargará en la GPU. Esto sin duda será tan eficiente como uno glBufferData, pero puede hacerlo de forma asíncrona.

Si piensas que glBufferData o glMapBuffer son la mejor solución si tu memoria intermedia es pequeña. 100000 * sizeof(float) * 3 ~= 1MB. No debería haber ningún problema con eso.

+0

Nota al margen: ya sé que tengo que dibujarlo en varias llamadas, use o no muchas VBO o no. También sé que solo dibujaré parte de los vértices a la vez. ¿Hay un montón de sobrecarga para cambiar el buffer VBO enlazado? Además, ¿mapBuffer es más lento que bufferdata? – Pubby

+0

La ventaja de mapBuffer es que puedes copiar tus datos dentro del buffer mientras GL está haciendo otra cosa. Por otro lado, el rendimiento real del mapeo de búfer depende realmente de la implementación. Si puede evitar cambiar su VBO varias veces, le aconsejo que lo haga. – tibur

10

Hay otra opción, que es un poco como la opción 3 - utilizar una gran VBO (probablemente con GL_STREAM_DRAW modo), que se revisa cada cuadro (llamando glBufferData con un puntero NULL búfer y el mismo tamaño cada vez) y luego glMapBuffer -ed de inmediato. El búfer se deja mapeado a medida que se rellena, luego sin asignar justo antes del dibujo. Repetir.

La llamada a glBufferData le dice a OpenGL que el contenido del búfer antiguo no es necesario, por lo que el glMapBuffer no tiene que esperar potencialmente para asegurar que la GPU finalice con la GPU.

Este enfoque parece ser el que oficialmente sancionado por la extensión vertex_buffer_object. Ver los "conjuntos de Vertex usando un tampón objeto mapeado" ejemplo:

http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt

Esto sugiere que OpenGL (o el controlador?) Estarán atentos a este tipo de comportamiento, y (cuando manchada) organizar las cosas para que se realiza de manera eficiente.

Cuestiones relacionadas