OpenGL 2.1: glMapBuffer и подсказки использования

Я использую glBufferData, и для меня имеет смысл указать, что вам нужно указать подсказки использования (например, GL_DYNAMIC_DRAW).

Однако недавно я предложил в Stack Overflow использовать glMapBuffer или glMapBufferRange для изменения несмежных блоков данных вершин.

При использовании glMapBuffer, кажется, нет точки, в которой вы указываете подсказку об использовании. Итак, мои вопросы таковы:

  • Можно ли использовать glMapBuffer для данного VBO, если вы никогда не вызывали glBufferData на этом VBO?
  • Если да, то как OpenGL угадывает использование, так как ему не дали подсказки?
  • Каковы преимущества/недостатки glMapBuffer vs glBufferData? (Я знаю, что они не делают то же самое. Но кажется, что, получив указатель с glMapBuffer, а затем записывая на этот адрес, вы можете сделать то же самое, что и glBufferData.)

Ответ 1

  • Можно ли использовать glMapBuffer для данного VBO, если вы никогда не вызывали glBufferData на этом VBO?

Нет, поскольку для сопоставления некоторой памяти она должна быть назначена первой.

  • Если да, то как OpenGL угадывает использование, так как ему не дали подсказки?

Это не так. Вы должны вызвать glBufferData хотя бы один раз, чтобы инициализировать объект буфера. Если вы не хотите загружать данные (потому что вы собираетесь использовать glMapBuffer), просто передайте нулевой указатель указателя данных. Это работает так же, как с glTexImage, где создается буфер/текстурный объект, который должен быть заполнен либо glBufferSubData/glTexSubImage, либо в случае объекта-буфера, а также путем сопоставления памяти.

  • Каковы преимущества/недостатки glMapBuffer vs glBufferData? (Я знаю, что они не делают точно то же самое. Но похоже, что, получив указатель с glMapBuffer, а затем записывая на этот адрес, вы можете сделать то же самое, что и glBufferData).

glMapBuffer позволяет вам асинхронно писать в буфер из другого потока. И для некоторых реализаций возможно, что драйвер OpenGL предоставляет вашему процессу прямой доступ к памяти DMA для графического процессора или даже к памяти самого GPU. Например, на архитектуре SoC со встроенной графикой.

Ответ 2

Нет, это недействительно. Вы должны вызвать glBufferData, потому что иначе OpenGL не сможет узнать размер вашего буфера.

Что касается того, что быстрее, ни я, ни Интернет в целом, похоже, не знают определенного ответа. Просто проверьте его и посмотрите.