2016-08-19 8 views
2

Давайте предположим, что у меня есть массив вершин и указатель VBO:OpenGL: Мне еще нужен массив вершин после буферизации в VBO?

std::vector<Vertex> vertices; 
GLuint vbo; 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

Теперь буфер данных:

glBufferData(
    GL_ARRAY_BUFFER, 
    vertices.size()*sizeof(Vertex), 
    &vertices[0], 
    GL_STATIC_DRAW 
); 

Если я понимаю правильно, я по-прежнему нужно держать вершин массива из-за GL_STATIC_DRAW. Однако, если я изменю его на GL_STATIC_COPY, тогда все данные будут скопированы в память графического процессора, поэтому я могу освободить память, используемую vertices. Это верно? Если это так, то зачем нам *_DRAW? Это полезно из-за ограничения памяти GPU? Плюс как работает GL_STATIC_READ?

ответ

6

Все это объясняется в справочных страницах glBufferData().

https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

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

Если данные не являются NULL, хранилище данных инициализируется данными этого указателя.

Не используйте GL_STATIC_COPY, это неверно. Документация гласит:

содержания магазина

COPY

данных модифицируют путем считывания данных из GL, и используются в качестве источника для команд GL рисования и спецификации изображения.

Таким образом, GL_STATIC_COPY предназначен только для внутренних копий между различными буферами OpenGL, а не для копий из вашего приложения в OpenGL. Используйте DRAW.