Я путаю glVertexAttribPointer (), или мой драйвер HD6480G, вероятно, виноват, и какие у меня есть ресурсы? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь использовать функциональность 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) и квадрат не рисуется.

1 Ответ

0 голосов
/ 24 июня 2019

Похоже, я не в основном контексте ... так что, скорее всего, это ответ на этот беспорядок.Спасибо за быстрый ответ.

...