- Допустимо ли использовать glMapBuffer для данного VBO, если вы никогда не вызывали glBufferData для этого VBO?
Нет, потому что для отображения некоторой памяти она должна быть выделена первой.
- Если это так, как OpenGL угадывает использование, поскольку ему не дали подсказку?
Это не так. Вы должны вызвать glBufferData хотя бы один раз, чтобы инициализировать буферный объект. Если вы не хотите загружать данные (потому что собираетесь использовать glMapBuffer), просто передайте нулевой указатель на указатель данных. Это работает так же, как и в случае glTexImage, где создается объект буфера / текстуры, для заполнения либо glBufferSubData / glTexSubImage, либо в случае объекта буфера, а также с помощью отображения памяти.
- Каковы преимущества / недостатки glMapBuffer по сравнению с glBufferData? (Я знаю, что они не делают одно и то же. Но кажется, что, получив указатель с помощью glMapBuffer и записав его на этот адрес, вы можете сделать то же самое, что и glBufferData.)
glMapBuffer
позволяет выполнять асинхронную запись в буфер из другого потока. А для некоторых реализаций может оказаться возможным, что драйвер OpenGL дает вашему процессу прямой доступ к памяти DMA графического процессора или, что еще лучше, к памяти самого графического процессора. Например, для архитектур SoC со встроенной графикой.