Индексированный рендеринг Opengl с несколькими VBO - PullRequest
0 голосов
/ 09 февраля 2019

Я новичок в OpenGL, и у меня проблема с рендерингом объектов (я буду называть их объектами).

У меня есть отдельный объект Renderer, который просто обрабатывает вызовы отрисовки, и япередать сущность, которую я хочу визуализировать.

Теперь у меня проблема в том, что когда я вызываю glDrawElements(), он ничего не рисует.

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

Моя функция рендеринга

void render(Entity model,EntityShader shader) {
        glBindVertexArray(model.getVao());
        mat4 modelMatrix = mat4();
        scale(modelMatrix, vec3(2.0));
        translate(modelMatrix, vec3(5.0f,0.0f, 0.0f));
        shader.loadTransformationMatrix(modelMatrix);
        glDrawElements(GL_TRIANGLES,model.getSize(),GL_UNSIGNED_SHORT,(void*)0);
        glBindVertexArray(0);
    }

Часть BufferLoader моей сущности

GLuint vao, iv, pv, nv, tv;

    glGenBuffers(1, &tv);
    glGenBuffers(1, &nv);
    glGenBuffers(1, &pv);
    glGenBuffers(1, &iv);

    glGenVertexArrays(1,&vao);
    glBindVertexArray(vao);

    glBindBuffer(GL_ARRAY_BUFFER, pv);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vec3), &vertices[0], GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, nv);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(vec3), &normals[0], GL_STATIC_DRAW);

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0);
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, tv);
    glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(vec2), &uvs[0], GL_STATIC_DRAW);

    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid *)0);
    glEnableVertexAttribArray(2);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iv);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,indices.size()*sizeof(unsigned short), &indices.front(), GL_STATIC_DRAW);

    glBindVertexArray(0);

Вот структура данных:

    vector <vec3> vertices;
    vector <vec2>  uvs;
    vector <vec3>  normals;
    vector <unsigned short>indices;

Это мои местные жители в glDrawElments () Заранее спасибо за ваши ответы.

...