Потому что в первом случае нет необходимости загружать данные в графический процессор.Во втором случае.
Это разница между:
void *memory = malloc(size);
и
void *memory = malloc(size);
memcpy(memory, data, size);
Первый обязательно быстрее второго.
Кроме того, вы можете использовать GL_STREAM_DRAW
вместо GL_DYNAMIC_DRAW
, если вы часто вызываете glBufferData
для одного и того же объекта буфера.