2015-03-17 5 views
0

Когда я сделать куб это выглядит следующим образом:Как изменить текстурные координаты, как только я предоставил VBO?

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, 0, 0); 

glBindBuffer(GL_ARRAY_BUFFER, textureCoordsBuffer); 
glVertexAttribPointer(textureCoordsAttribute, 2, GL_FLOAT, false, 0, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textureId); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 

glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0); 

Я хочу изменить только текстурные COORDS, и я не меняя вершин или индексов. Мой вопрос: мне нужно повторно отправить данные вершин и данные индекса, чтобы снова отобразить этот куб или я могу просто отправить новые текстурные координаты? И если я могу просто отправить новые текстурные коорды, какие вызовы OpenGL мне нужно сделать?

ответ

3

Вы можете сделать

glBindBuffer(GL_ARRAY_BUFFER, textureCoordsBuffer); 
glBufferData(GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW); 

что означает связать буфер снова и вызвать glBufferData на него.

Вы также можете создать новое vbo с координатами текстуры и установить его как буфер атрибута, вызвав , связав его с GL_ARRAY_BUFFER.

+0

Итак, я бы сделал glBindBuffer и glBufferData, чтобы скопировать новые координаты? А затем выполните те же шаги, что и выше, для рендеринга? – Xavier

+0

@ Xavier да, имейте в виду, что старые данные потеряны –

0

Вы можете обновить данные в существующем буфере с помощью glBufferSubData():

glBindBuffer(GL_ARRAY_BUFFER, textureCoordsBuffer); 
glBufferSubData(GL_ARRAY_BUFFER, 0, textureDataSizeInBytes, textureData); 

Если вы обновляете данные часто, вы должны выбрать использования параметр начального glBufferData() вызова соответственно:

glBufferData(GL_ARRAY_BUFFER, textureDataSizeInBytes, NULL, GL_DYNAMIC_DRAW); 

Право называть glBufferData() каждый раз, когда вы хотите изменить данные. Но это потенциально намного менее эффективно, потому что это означает каждый раз назначать новый буферный объект.

Обратите внимание, что данные аргумент glBufferData() может быть указан как NULL в этом случае. При использовании этого способа он будет выделять только память для данных, с ожиданием, что вы позже укажете сами данные с вызовами glBufferSubData().

Смежные вопросы