OpenGL 2.1: glMapBuffer и советы по использованию - PullRequest
11 голосов
/ 14 января 2012

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 14 января 2012
  • Допустимо ли использовать glMapBuffer для данного VBO, если вы никогда не вызывали glBufferData для этого VBO?

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

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

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

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

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

1 голос
/ 14 января 2012

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

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

...