2015-07-11 6 views
1

Запуск очень простого рисования примера треугольника, я пытаюсь выяснить, какие строки относятся конкретно к определению VAO и какие другие могут разваливаться.OpenGL - Правильное разделение определения VAO из создания VBO и других буферов

В настоящее время я использую этот код:

создания буфера & начинка:

TriangleVertices = new float[9] 
{ 
    0.0f, 1.0f, 0.0f, 
    -0.5f, -0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 
}; 

TriangleColors = new float[12] 
{ 
    1.0f, 0.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f, 
}; 

glGenBuffers(1, &VertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(float), TriangleVertices, GL_STATIC_DRAW); 
glGenBuffers(1, &ColorsBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, ColorsBuffer); 
glBufferData(GL_ARRAY_BUFFER, 12*sizeof(float), TriangleColors, GL_STATIC_DRAW); 

glGenVertexArrays(1, &VAOID); 

VAO определение:

glBindVertexArray(VAOID); 
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ARRAY_BUFFER, ColorsBuffer); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0); 

glEnableVertexAttribArray(0); 
glBindVertexArray(0); 

Loop Drawing

glBindVertexArray(VAOID); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
glBindVertexArray(0); 

Пример выполняется нормально, если в цикле рисования я включаю определение VAO для каждого фрейма, но он не работает, если я определяю VAO только один раз, прежде чем начинать рисовать, поэтому я думаю, что определение VAO не содержит какого-либо кода.

Что мне не хватает?

ответ

0

EDIT: Код в правиле. Проблема заключалась в столкновении с другими вызовами OpenGL, которые, как я думал, я не запускал.

Код, описанный ниже, является ситуативным. Как прокомментировал @derhass, нет необходимости включать и отключать VertexAttribArray при выполнении обратного вызова.

...

Старый ответ:

Unbindinding и отключение каждого элемента, когда не требуется больше неподвижной проблема, но я не знаю, если это решение может быть широко распространено или специфичная к моей среде только.

создание буфера & начинка:

TriangleVertices = new float[9] 
{ 
    0.0f, 1.0f, 0.0f, 
    -0.5f, -0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 
}; 

TriangleColors = new float[12] 
{ 
    1.0f, 0.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f, 
}; 

glGenBuffers(1, &VertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(float), TriangleVertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glGenBuffers(1, &ColorsBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, ColorsBuffer); 
glBufferData(GL_ARRAY_BUFFER, 12*sizeof(float), TriangleColors, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glGenVertexArrays(1, &VAOID); 

определение ВАО:

glBindVertexArray(VAOID); 
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glBindBuffer(GL_ARRAY_BUFFER, ColorsBuffer); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glEnableVertexAttribArray(0); 
glBindVertexArray(0); 

Loop Drawing

glBindVertexArray(VAOID); 
glEnableVertexAttribArray(0);//not needed 
glEnableVertexAttribArray(1);//not needed 
glDrawArrays(GL_TRIANGLES, 0, 3); 
glDisableVertexAttribArray(0);//not needed 
glDisableVertexAttribArray(1);//not needed 
glBindVertexArray(0); 
+1

Это не так, как VAOs должны работать. Состояние включения для каждого массива атрибутов является частью состояния VAO. неясно, в чем заключается ваша эксцесс. – derhass

+0

@derhass Вы правы. Я думал, что я использую только пример треугольника, но у меня есть еще один призыв, который явно сталкивается с этим. Я отредактирую ответ. –