Respuesta corta:
Uso glMapBufferRange y sólo actualizar el subrango que necesita modificación.
Respuesta larga:
El truco consiste en trazar el buffer ya existente con glMapBufferRange, y sólo asignar el rango que necesita. Teniendo en cuenta estos supuestos:
- Su geometría utiliza la animación por vértice morphing
- El recuento de vértices para los modelos es constante durante la animación.
continuación, puede utilizar glMapBufferRange para actualizar sólo las partes que cambian, y dejar el resto de los datos por sí solos. Las cargas completas que usan glBufferData son lentas como una tortuga, ya que eliminan el almacén de memoria antiguo y asignan uno nuevo. Eso es además de cargar los nuevos datos. glMapBufferRange solo le permite leer/escribir datos existentes, no asigna ni cancela la asignación.
Sin embargo, si usa animación de esqueleto, pase las transformaciones de vértices como matrices 4x4 por vértice al sombreado de vértices y realice los cálculos allí. Por supuesto, los datos por vértice se especifican con glVertexAttribPointer.
Además, recuerde que puede leer datos de textura en el sombreado de vértices, y que OpenGL 3.1 introdujo algunas llamadas a nuevas instancias; glDrawArraysInstanced y glDrawElementsInstanced. Los combinados se pueden usar para búsquedas específicas de instancia. Es decir, puede hacer llamadas de instancia con los mismos datos de geometría encuadernados, pero enviar posiciones o cualquier dato por vértice que necesite como texturas o matrices de texturas. Esto puede evitar que mezcle y haga coincidir diferentes conjuntos de datos de matriz de vértices.
Imagine si desea representar 100 instancias del mismo modelo, pero con diferentes posiciones o combinaciones de colores. O incluso mapas de texturas.
+1 para reconocer el procesamiento por lotes como el mayor problema con la codificación de gráficos en estos días. 1 llamada de sorteo por Mhz me parece optimista después de algunos códigos de OpenGL ES iPhone - ¡He encontrado que estoy limitado a 30-40 lotes para mantener una tasa de fotogramas decente! – tsalter
Ok, debería haber agregado que esta regla puede no aplicarse directamente a los dispositivos móviles. Lo he visto primero en algunas diapositivas de GDC hace unos años, y me ha sido útil en PC con Windows. –
Por cierto, acabo de encontrar las diapositivas aquí: http://ati.amd.com/developer/gdc/D3DTutorial3_Pipeline_Performance.pdf (principalmente D3D9, OpenGL en la página 28) –