Универсальный массив атрибутов вершин n использует указатель с небольшим значением (0x0000000000000000)?

Получение этого вывода из моего обратного вызова отладки OpenGl каждый раз, когда вызывается glDrawElements:

[OPENGL][SEVERITY_LOW][API][OTHER]Usage warning: Generic vertex attribute array 1 uses a pointer with a small value (0x0000000000000000). Is this intended to be used as an offset into a buffer object?

[OPENGL][SEVERITY_LOW][API][OTHER]Usage warning: Generic vertex attribute array 2 uses a pointer with a small value (0x0000000000000000). Is this intended to be used as an offset into a buffer object?

Код для настройки VAO / VBO:

inline void Mesh::CreateMesh(std::vector<int> _indices, std::vector<float> _verts, std::vector<float> _norms, std::vector<float> _texCoords) {
    indices_ = _indices;
    vertices_ = _verts;
    normals_ = _norms;
    texCoords_ = _texCoords;

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

    std::cout << "Mesh::SetupAttribBuffer::Vertex Array Created: " << vaoId_ << std::endl;

    glGenBuffers(1, &indicesVboId_);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesVboId_);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_.size() * sizeof(int), indices_.data(), GL_STATIC_DRAW);

    std::cout << "Mesh::SetupAttribBuffer::Indices Buffer Created: " << indicesVboId_ << std::endl;

    verticesVboId_ = SetupAttribBuffer(0, 3, vertices_.data());
    //normalsVboId_ = SetupAttribBuffer(1, 3, normals_);
    //texCoordsVboId_ = SetupAttribBuffer(2, 2, texCoords_);

    glEnableVertexAttribArray(verticesVboId_);
    //glEnableVertexAttribArray(normalsVboId_);
    //glEnableVertexAttribArray(texCoordsVboId_);
    glEnableVertexAttribArray(indicesVboId_);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

inline int Mesh::SetupAttribBuffer(int _location, int _components, float _data[]) {
    unsigned int bufferId;
    glGenBuffers(1, &bufferId);
    glBindBuffer(GL_ARRAY_BUFFER, bufferId);
    glBufferData(GL_ARRAY_BUFFER, sizeof(_data) * sizeof(float), _data, GL_STATIC_DRAW);
    glEnableVertexAttribArray(_location);
    glVertexAttribPointer(_location, _components, GL_FLOAT, GL_FALSE, 0, 0);

    std::cout << "Mesh::SetupAttribBuffer::Attribute Buffer Created: " << bufferId << std::endl;

    return bufferId;
}

Как я вызываю glDrawElements:

glBindVertexArray(mesh->vaoId_);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->indicesVboId_);
glDrawElements(GL_TRIANGLES, mesh->indicesCount(), GL_UNSIGNED_INT, nullptr);

glBindVertexArray(0);

Несмотря на то, что я получаю результат обратного вызова (вверху), моя сетка (треугольник) по-прежнему хорошо отображается. Мой вопрос: «Что-то мне нужно изменить при настройке моих VAO / VBO, чтобы остановить эти ошибки? Или я должен просто заставить мой метод обратного вызова игнорировать эти типы ошибок?»

glEnableVertexAttribArray(verticesVboId_);: параметр должен быть местоположением атрибута в шейдере, а не VBO. glEnableVertexAttribArray(indicesVboId_); то же самое, но кроме того индексные буферы не являются атрибутами.
BDL 31.10.2018 12:16

Это решило это! Спасибо.

Stuart 31.10.2018 12:24
0
2
338
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это сообщение об ошибке возникает из-за включения неправильных атрибутов вершины.

Две линии

glEnableVertexAttribArray(verticesVboId_);
glEnableVertexAttribArray(indicesVboId_);

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

Другие вопросы по теме