La respuesta más correcta es, depende de cómo lo programes, pero es algo bueno de qué preocuparse. Si bien las GPU se han vuelto increíblemente rápidas, el ancho de banda hacia y desde la GPU RAM no lo es, y será su cuello de botella más frustrante.
¿Sus datos se envían a la memoria de la GPU solo una vez y se quedan allí para siempre?
Esperemos que si. Para la velocidad de renderizado, desea que se guarden tantos datos en la GPU como sea posible, en lugar de reenviarlos cada fotograma. Los VBO sirven para este propósito exacto. Hay VBO estáticos y dinámicos, el primero es el mejor para los modelos estáticos, y el segundo es el mejor para los modelos cuyos vértices cambiarán cada cuadro (por ejemplo, un sistema de partículas). Sin embargo, incluso cuando se trata de VBO dinámicos, no desea reenviar todos los vértices de cada cuadro; solo los que están cambiando.
En el caso de su edificio, los datos de vértice simplemente se quedarían allí, y lo único que cambia son sus matrices (modelo / mundo, proyección y vista).
En el caso de un sistema de partículas, hice un VBO dinámico lo suficientemente grande como para almacenar la cantidad máxima de partículas que existirán para ese sistema. Cada cuadro que envío los datos de las partículas emitidas ese cuadro, junto con un par de uniformes, y eso es todo. Cuando dibujo, puedo especificar un punto de inicio y fin en ese VBO, por lo que no tengo que eliminar datos de partículas. Solo puedo decir que no los dibujes.
Cuando el modelo se procesa realmente cada cuadro, ¿los procesadores de GPU tienen que recuperar sus datos cada vez de la memoria de GPU? Lo que quiero decir es que si tuviera 2 modelos renderizados varias veces cada uno, importaría si primero renderizo el primero varias veces y luego el segundo varias veces o si rendericé el primero solo una vez, el segundo solo una vez y siguió intercalando así?
El acto de enviar múltiples llamadas de extracción en lugar de solo una es un límite mucho mayor. Echa un vistazo a la representación instanciada; podría ayudarte mucho y hacer que la respuesta a esta pregunta sea inútil. Tuve algunos problemas con el controlador que aún no he resuelto, pero si puedes hacerlo funcionar, entonces el problema está resuelto.
Obviamente, las tarjetas gráficas tienen RAM limitada; cuando no puede contener todos los datos del modelo necesarios para renderizar 1 fotograma, supongo que sigue obteniendo (algunos) de la RAM de la CPU cada fotograma, ¿es correcto?
No quieres quedarte sin GPU RAM. Si lo hace, cambie las cosas para que no lo haga. En el escenario muy hipotético que se acaba, probablemente se bloqueará de alguna manera, pero nunca lo he visto suceder, así que honestamente no lo sé.
Olvidé hacer una distinción: hay que enviar los datos a la GPU y hay que configurar / vincular los búferes como actuales. ¿Esto último causa algún flujo de datos?
No hay flujo de datos significativo, no. Tiene un costo, pero eso es cierto para cada línea de código que escriba. Descubrir cuánto te cuesta es, de nuevo, para qué sirve el perfil.
creación de búfer con inicialización
La respuesta de Raxvan suena bien, pero no es del todo precisa. En OpenGL, la creación del búfer no reserva espacio. Si desea reservar espacio sin pasar ningún dato, puede llamar a glBufferData y simplemente pasar nulo. (Vea la sección de notas aquí .)
actualización de datos de búfer
Supongo que te refieres a glBufferData u otras funciones como esa, ¿verdad? Aquí es donde ocurre la transferencia de datos reales. (A menos que pase nulo, como acabo de decir en el último párrafo).
enlazar el búfer como activo (¿es solo una forma de decirle a la API que quiero que este búfer se represente en la próxima llamada de extracción y no hace nada por sí mismo?)
Sí, pero puede hacer un poco más que eso. Por ejemplo, si vincula un VAO (objeto de matriz de vértices), luego vincula un VBO, ese VBO queda vinculado al VAO. Más tarde, si vincula ese VAO nuevamente y llama a glDrawArrays, sabrá qué VBO dibujar.
Tenga en cuenta que si bien muchos tutoriales le permitirán crear un VAO para cada VBO, me han dicho que este no es su uso previsto. Supuestamente, debe crear un VAO y usarlo con cada VBO que tenga los mismos atributos. Todavía no lo he probado, así que no puedo decir con certeza si es mejor o peor.
Llamada de sorteo API
Lo que sucede aquí es bastante sencillo (desde nuestra perspectiva). Digamos que vincula un VAO, luego llame a glDrawArrays. Usted especifica un punto de inicio y un conteo, y ejecuta su sombreador de vértices para cada vértice en ese rango, que a su vez pasa sus salidas por la línea. Sin embargo, todo ese proceso es otro ensayo propio.