2017-01-21 4 views
1

У меня есть простой двумерный треугольник, отображаемый на экране, я хочу обновлять данные цветового буфера каждый кадр, поэтому цвет треугольника меняется постоянно, но im not sure как эффективно обновлять данные.Как обновлять данные буфера вершин часто (каждый кадр) opengl

это код для буфера цвета:

GLfloat colourVert[] = { 
     0.0f, 1.0f, 0.0f, 
     1.0f, 0.0f, 0.0f, 
     0.0f, 0.0f, 1.0f 
    }; 



GLuint colourBuffer; 
glGenBuffers(1, &colourBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(colourVert), colourVert, GL_DYNAMIC_DRAW); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 

ли мне нужно добавить что-то в этих строках или мне нужно изменить шейдер, может кто-нибудь объяснить, пожалуйста, спасибо за любую помощь.

+1

Вы должны решить, какой тип OpenGL вы хотите, поскольку ответ будет во многом зависеть от этого. И, пожалуйста, укажите, какую версию. Например, es 3.0 использует VAO для хранения привязок атрибутов, а 2.0 нет. – BDL

+0

@BDL В IOS opengl es 2.0 полностью поддерживает VAO, но не Android – Sung

ответ

4

Вы не должны генерировать новый буфер для каждого кадра. Просто повторите использование уже существующего. Также настройка указателей атрибутов также может выполняться только один раз, так как они хранятся в VAO. Фактически необходимы только две строки: glBindBuffer и glBufferData (или даже лучше использовать glBufferSubData, поскольку это позволит повторно использовать выделенную память вместо выделения нового сегмента памяти).

Обратите внимание, что этот ответ применим только к OpenGL 3.3 Core (и новее) и OpenGL-ES 3.0 (и новее). Для версий OpenGL, которые не поддерживают/требуют VAO, настройка атрибута может также произойти в каждом фрейме.

+0

Неважно, пользуетесь ли VAO или нет. В любом случае нам нужно обновить только VBOs, а не VAO – Sung

+0

@Sung: Я никогда не говорил, что вам нужно обновить VAO. Я сказал: «Если вы используете VAO, вы не должны вызывать' glVertexAttribPointer' каждый кадр, так как эти настройки сохраняются в состоянии vao ». – BDL

+0

вы сказали: «Также настройка указателей атрибутов также может выполняться только один раз, так как они хранятся в VAO» «Обратите внимание, что этот ответ применим только к OpenGL 3.3 Core (и новее) и OpenGL-ES 3.0». Ваша посылка заключается в том, что он используя VAO, о котором не нужно упоминать. – Sung