A resposta mais correta é: depende de como você a programa, mas é uma boa coisa para se preocupar. Embora as GPUs tenham se tornado incrivelmente rápidas, a largura de banda de e para a RAM da GPU não é e será o gargalo mais frustrante.
Seus dados são enviados para a memória da GPU apenas uma vez e ficam lá para sempre?
Espero que sim. Para velocidade de renderização, você deseja que o máximo possível de dados fique na GPU, em vez de reenviá-lo a cada quadro. Os VBOs atendem exatamente a esse propósito. Existem VBO's estáticas e dinâmicas, sendo a primeira melhor para modelos estáticos e a segunda melhor para modelos cujos vértices mudam a cada quadro (por exemplo, um sistema de partículas). Mesmo quando se trata de VBOs dinâmicos, você não deseja reenviar todos os vértices a cada quadro; apenas os que estão mudando.
No caso de sua construção, os dados do vértice permaneceriam lá, e a única coisa que muda são suas matrizes (modelo / mundo, projeção e exibição).
No caso de um sistema de partículas, criei um VBO dinâmico grande o suficiente para armazenar o número máximo de partículas que jamais existirão para esse sistema. Cada quadro eu envio os dados para as partículas emitidas, juntamente com alguns uniformes, e é tudo. Quando desenho, posso especificar um ponto inicial e final nesse VBO, para não precisar excluir dados de partículas. Só posso dizer que não desenhe isso.
Quando o modelo é realmente renderizado em cada quadro, os processadores da GPU precisam buscar seus dados sempre da memória da GPU? O que eu quero dizer é - se eu tivesse dois modelos renderizados várias vezes cada - importaria se eu renderizasse o primeiro várias vezes e depois o segundo várias vezes ou se eu renderizasse o primeiro apenas uma vez, o segundo apenas uma vez e manteve intercalando assim?
O ato de enviar várias chamadas de draw em vez de apenas uma é um limite muito maior. Confira a renderização instanciada; isso pode ajudá-lo bastante e tornar a resposta a essa pergunta inútil. Eu tive alguns problemas com o driver que ainda não resolvi, mas se você conseguir fazê-lo funcionar, o problema será resolvido.
Obviamente, as placas gráficas têm RAM limitada - quando não pode conter todos os dados de modelo necessários para renderizar 1 quadro, acho que ele continua buscando (alguns) da RAM da CPU em cada quadro, está correto?
Você não quer ficar sem RAM da GPU. Se você fizer isso, mude as coisas para não mudar. No cenário hipotético em que você se esgota, provavelmente cairá de alguma forma, mas nunca vi isso acontecer, por isso sinceramente não sei.
Esqueci de fazer uma distinção: há o envio dos dados para a GPU e há a configuração / ligação dos buffers como atuais. O último causa algum fluxo de dados?
Não há fluxo de dados significativo, não. Existe algum custo para isso, mas isso é verdade para todas as linhas de código que você escreve. Descobrir quanto custa você é, novamente, para que serve o perfil.
criação de buffer com inicialização
A resposta de Raxvan parece boa, mas não é muito precisa. No OpenGL, a criação do buffer não reserva nenhum espaço. Se você deseja reservar espaço sem passar nenhum dado, pode chamar glBufferData e apenas passar nulo. (Veja a seção de notas aqui .)
atualização de dados do buffer
Eu estou supondo que você quer dizer glBufferData, ou outras funções como essa, certo? É aqui que a transferência real de dados ocorre. (A menos que você passe nulo, como acabei de dizer no último parágrafo.)
vincular o buffer como ativo (é apenas uma maneira de dizer à API que eu quero que esse buffer seja renderizado na próxima chamada de empate e não faz nada sozinho?)
Sim, mas pode fazer um pouco mais do que isso. Por exemplo, se você vincular um VAO (objeto de matriz de vértices), vincular um VBO, esse VBO se tornará vinculado ao VAO. Mais tarde, se você vincular esse VAO novamente e chamar glDrawArrays, ele saberá qual VBO desenhar.
Observe que, embora muitos tutoriais façam você criar um VAO para cada VBO, fui informado que esse não é o uso pretendido. Supostamente, você deve criar um VAO e usá-lo em todos os VBO que possuam os mesmos atributos. Ainda não tentei isso, então não posso dizer com certeza se é melhor ou pior.
Chamada de empate da API
O que acontece aqui é bem direto (da nossa perspectiva). Digamos que você vincule um VAO e chame glDrawArrays. Você especifica um ponto inicial e uma contagem, e ele executa seu sombreador de vértice para cada vértice nesse intervalo, que por sua vez passa suas saídas pela linha. Todo esse processo é outro ensaio, no entanto.