Невозможно отобразить VBO в OpenGL - PullRequest
0 голосов
/ 18 августа 2011

У меня есть VBO и IBO в OpenGL, но я не могу их правильно нарисовать.Не могли бы вы дать мне знать, что я мог забыть в функции отображения кадра?- struct Point3D является структурой с 3 числами с плавающей точкой внутри (x, y, z).- nbVertex - количество вершин в массиве glVertex.- nbVBOInd - количество индексов в массиве VBOInd.

    glGenBuffers(1, &VertexVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(struct Point3D)*nbVertex, glVertex, GL_STATIC_DRAW);

    glGenBuffers(1, &IndexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(glVertex), BUFFER_OFFSET(0));   //The starting point of the VBO, for the vertices

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   //The starting point of the IBO

Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Я вижу ту же проблему, что и Rodrigo - у вас есть несоответствие типов данных, как вы можете видеть здесь:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

sizeof (int) - использование целочисленного типа

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   

GL_UNSIGNED_SHORT - использование короткого типа

в соответствии со спецификацией openGL, для glDrawElements возможны только типы данных без знака. Чтобы это исправить, вам нужно:

  • изменить VBOInd на тип без знака в объявлении, например:

    unsigned int* VBOInd = new unsigned int[nbVBOInd]

  • заменить 6-й вызов на

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

  • заменить 11-й (последний) вызов на

    glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

В любом случае, я считаю, что проблема скрыта в настройке указателя, измените 9-й вызов на :

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

Если это не сработает, пожалуйста, покажите нам, как glVertex и VBOInd объявляются и заполняются данными. Может быть, вы используете std :: vector? Вам нужно вызвать эти контейнеры данных как:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, &VBOInd[0], GL_STATIC_DRAW);

Если что-то неясно, просто спросите в комментариях ..

2 голосов
/ 18 августа 2011

Попробуйте изменить последнюю строку на:

glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

Если ваши данные в IndexVBOID не очень короткие, но тогда приведенный выше размер (int) будет неправильным.

...