OpenGL 2.1: подсказки glMapBuffer и использования
я использую glBufferData
, и для меня имеет смысл, что вам нужно указать подсказки использования (например, GL_DYNAMIC_DRAW).
однако, это было недавно предложил мне на переполнение стека что я использую glMapBuffer
или glMapBufferRange
для изменения несмежных блоков данных вершин.
при использовании glMapBuffer
, похоже, нет какой-либо точки, в которой вы указываете подсказку об использовании. Итак, мои вопросы таковы:
- можно ли использовать
glMapBuffer
на данном VBO, если вы никогда не вызывалиglBufferData
на этом VBO? - если да, то как OpenGL угадывает использование, так как ему не дали подсказку?
- каковы преимущества / недостатки
glMapBuffer
vsglBufferData
? (Я знаю, что они делают не совсем то же самое. Но кажется, что, получив указатель сglMapBuffer
и потом писать на этот адрес, вы можете сделать то же самоеglBufferData
делает.)
2 ответов
- допустимо ли использовать glMapBuffer на данном VBO, если вы никогда не вызывали glBufferData на этом VBO?
нет, потому что для отображения некоторой памяти она должна быть выделена первой.
- Если да, то как OpenGL угадывает использование, так как ему не дали подсказку?
это не так. Для инициализации объекта buffer необходимо вызвать glBufferData хотя бы один раз. Если вы не хотите загружать данные (поскольку вы собираетесь использовать glMapBuffer), просто передайте нулевой указатель для указателя данных. Это работает так же, как с glTexImage, где создается объект buffer/texture, который должен быть заполнен либо glBufferSubData/glTexSubImage, либо в случае объекта buffer, а также через сопоставление памяти.
- каковы преимущества / недостатки glMapBuffer vs glBufferData? (Я знаю, что они делают не совсем то же самое. Но кажется, что, получив указатель с glMapBuffer, а затем писать на этот адрес, вы можете сделать то же самое, что делает glBufferData.)
glMapBuffer
позволяет записывать в буфер асинхронно из другого потока. И для некоторых реализаций может быть возможно, что драйвер OpenGL дает вашему процессу прямой доступ к памяти DMA GPU или даже лучше к памяти самого GPU. Например, на архитектурах SoC со встроенной графикой.
нет, это кажется недопустимым. Вы должны позвонить glBufferData
, потому что в противном случае OpenGL не может знать размер вашего буфера.
Что касается того, что быстрее, ни я, ни интернет в целом, похоже, не знают определенного ответа. Просто проверь и увидишь.