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