Tenho alguns dados de vértices que mudam a cada quadro, mas como não sei o número (máximo) de vértices com antecedência, preciso usar glBufferData
todos os quadros, em vez de usar glBufferSubData
. Estou alocando o próprio VAO/VBO apenas uma vez durante a inicialização.
Minha pergunta é: Dado que estou usando glBufferData
todos os quadros (e, portanto, eu acho, realocando buffers novos a cada quadro), devo usar GL_DYNAMIC_DRAW
ou GL_STATIC_DRAW
?
Meu instinto é GL_STATIC_DRAW
que nunca escreverei sobre a memória buffer existente, mas estou me perguntando se isso GL_DYNAMIC_DRAW
afeta alguma coisa nas chamadas subsequentes glBufferData
( não glBufferSubData
) no mesmo VBO.
GL_STATIC_DRAW normalmente é usado quando você não espera que os dados sejam alterados com frequência e é adequado para situações em que você carrega os dados uma vez e os renderiza várias vezes sem alterá-los. O uso de GL_STATIC_DRAW informa ao driver OpenGL para otimizar dados estáticos, e o driver pode fazer certas suposições que podem prejudicar o desempenho se os dados forem atualizados com frequência.
Por outro lado, GL_DYNAMIC_DRAW indica que os dados podem mudar frequentemente, e o driver irá otimizar para esse cenário, tornando-o mais adequado para o seu caso de uso em que você está chamando glBufferData a cada quadro com dados novos.
O uso de GL_DYNAMIC_DRAW não deve impactar negativamente as chamadas subsequentes para glBufferData, mesmo se você estiver criando novos buffers em cada quadro. É mais sobre como você pretende usar os dados dentro do buffer. Para dados que mudam frequentemente, GL_DYNAMIC_DRAW é a escolha mais apropriada