Общий массив атрибутов вершин N использует указатель с небольшим значением (0x0000000000000000)? - PullRequest
0 голосов
/ 31 октября 2018

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

[OPENGL] [SEVERITY_LOW] [API] [OTHER] Предупреждение об использовании: общая вершина массив атрибутов 1 использует указатель с небольшим значением (0x0000000000000000). Это предназначено для использования в качестве смещения в объект буфера?

[OPENGL] [SEVERITY_LOW] [API] [OTHER] Предупреждение об использовании: общая вершина массив атрибутов 2 использует указатель с небольшим значением (0x0000000000000000). Это предназначено для использования в качестве смещения в объект буфера?

Код для настройки 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, чтобы остановить эти ошибки? Или я должен просто заставить свой метод обратного вызова игнорировать эти типы ошибок?»

1 Ответ

0 голосов
/ 31 октября 2018

Это сообщение об ошибке возникает из-за того, что включены неверные атрибуты вершины.

Две строки

glEnableVertexAttribArray(verticesVboId_);
glEnableVertexAttribArray(indicesVboId_);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...