Я пытаюсь использовать функциональность VAO (объект массива вершин) в контексте opengl.Мои буферные объекты без vao хорошо рисуются, но когда я связываю свой VAO и рисую, никакой объект не рисуется.Я в основном использую некоторый пример кода и чувствую, что он должен работать.Но у меня есть гибридная сдвоенная видеокарта, которая немного устарела и была источником глубокого горя и сожаления, и несколько раз в прошлом я исследовал и обнаружил намеки, что это может быть связано с ней или синхронизацией с графическим процессором.и ресурсы требуют .. Но нужен эксперт, чтобы разобраться со мной и определить расположение земли.
Я использую версию opengl ..3.3 (Core Profile) Mesa 18.2.8 в Linux Ubuntu.Я отключил весь другой код, запустил установку и сделал, пока drawcalls довольно прилежно.Я установил обратные вызовы ошибок и поиграл со значениями
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
, которые, как я полагаю, являются источником моего greif.Я прочитал, что они не включены по умолчанию и активируются при вызове отрисовки и инициализации, которые я покажу ниже.
Здесь я создаю свой VAO
void createSquare() {
float vertices1[] = {
0.5f, 0.5f, 0.0f, // top right
0.5f, -0.5f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f // top left
};
unsigned int indices1[] = { // note that we start from 0!
0, 1, 3, // first Triangle
1, 2, 3 // second Triangle
};
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices1), indices1, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
// remember: do NOT unbind the EBO while a VAO is active as the bound element buffer object IS stored in the VAO; keep the EBO bound.
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other
// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.
glBindVertexArray(0);
}
И это все, что есть в моей функции рисования ..
glUseProgram(programID);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
Как я уже говорил, этовыдается ошибка ---> GL_INVALID_VALUE в glVertexAttribPointerARB (idx) и квадрат не рисуется.