Буферные объекты, используемые в качестве источников данных вершин, существуют для рендеринга .Переход назад (чтение данных назад), как правило, не рекомендуется с точки зрения производительности.
Подсказка, которую вы даете glBufferData, имеет три шаблона доступа: DRAW, READ и COPY;они сообщают OpenGL, как вы собираетесь получать / извлекать данные из объекта буфера напрямую.Подсказки не управляют тем, как OpenGL должен читать / записывать с него / на него.Это всего лишь подсказки;API не обеспечивает какого-либо конкретного поведения, но его нарушение может привести к снижению производительности.
DRAW означает, что вы будете помещать данные в буфер, но не будете читать из него.READ означает, что вы будете читать данные из буфера, но не будете писать в него (обычно для обратной связи преобразования или пиксельных буферов).И COPY означает, что вы не будете ни читать, ни записывать в буфер напрямую.
Обратите внимание, что нет подсказки для «чтения и записи».Есть только «написать», «прочитать» и «ни то, ни другое».Учтите, что намек на то, насколько хорошей является идея записать данные в буфер напрямую, а затем начать чтение из этого буфера.
Опять же, подсказки предназначены для пользователя, непосредственно получающего или получающего данные.glBufferData
, glBufferSubData
, и все различные функции отображения делают запись, в то время как glGetBufferSubData
и все функции отображения делают чтение.
В любом случае нет, вы не должны этого делать.Храните копию данных о местоположении в памяти клиента, если вам нужно использовать ее на клиенте.
Кроме того, некоторые драйверы полностью игнорируют советы по использованию.Вместо этого они решают, где разместить буферный объект, основываясь на том, как вы на самом деле его используете, а не на том, как вы собираетесь его использовать.Это будет хуже для вас, потому что если вы начнете читать из этого буфера, драйвер может переместить данные буфера в память, которая не так быстро.Он может быть перемещен из графического процессора и даже в пространство памяти клиента.
Однако, если вы настаиваете на этом, есть два способа чтения данных из объекта буфера.glGetBufferSubData
является обратным glBufferSubData
.И вы всегда можете сопоставить буфер для чтения вместо записи.