VertexArray glVertexAttribPointer GL_INVALID_VALUE 0x0501 - PullRequest
1 голос
/ 26 сентября 2019

Написание программы OpenGL для рисования квадрата на экране, но с ошибкой недопустимого значения.Ошибка возникает при звонке MyGLCall(glVertexAttribPointer(i,.MyGLCall - это абстракция GLCALL, чтобы на консоли можно было печатать код ошибки, как показано ниже.

Не уверен, что значение здесь недопустимо.Я считаю, что все типы данных верны для glVertexAttribPointer , но здесь что-то не хватает.

Вывод на консоль

Rendering...
OpenGL version 3.3.0 NVIDIA 388.13
GL Extension Wrangler version 2.1.0
[!!! OpenGL ERROR!!!] (0x0501)
glVertexAttribPointer(i, element.elements_per_vertex, element.type, element.normalized, layout.get_stride(), (const void*) offset)

Макет иТипы данных элемента

enter image description here

Исходный код

// bind vertex buffer and set memory layout
void VertexArray::add_buffer(const VertexBuffer& vb, const VertexBufferLayout& layout) 
{
    VertexArray::bind();
    vb.bind();
    // auto is std::vector<VertexBufferLayoutElement>
    const auto& elements = layout.get_elements();
    unsigned int offset = 0;
    for (unsigned int i = 0; i < elements.size(); i++) 
    {       
        const auto& element = elements[i];      
        // GL_INVALID_VALUE 0x0501
        MyGLCall(glEnableVertexAttribArray(i));
        MyGLCall(glVertexAttribPointer(i,
            element.elements_per_vertex,
            element.type,
            element.normalized,
            layout.get_stride(),
            (const void*) offset)); // heckin, what is this (const void*)???
        offset += element.elements_per_vertex * VertexBufferLayoutElement::get_size_of_type(element.type);
    }   
}

struct для VertexBufferLayoutElementв моем заголовочном файле VertextBufferLayout

struct VertexBufferLayoutElement
{
    // nice mem alignment bro, mem size on most machines is
    unsigned int elements_per_vertex;   // 4 bytes
    unsigned int type;                  // 4 bytes
    unsigned char normalized;           // 1 byte
    static unsigned int get_size_of_type(unsigned int type)
    {
        switch (type)
        {
            case GL_FLOAT:          return 4;
            case GL_UNSIGNED_INT:   return 4;
            case GL_UNSIGNED_BYTE:  return 1;
        }
        ASSERT(false);
        return 0;
    }
};

Ошибка была в этом файле заголовка выше

Не следовал правильный порядок параметров первого firstc Список параметров спецификации для функции указателя arrtrib .GL_FLOAT и elements_per_vertex поменялись местами, вызвав ошибку, на скриншоте ниже указан правильный порядок.

enter image description here

1 Ответ

2 голосов
/ 26 сентября 2019

2-й параметр glVertexAttribPointer - это размер кортежа, который должен быть 1, 2, 3, 4 или GL_BGRA.Третий параметр - это тип (например, GL_UNSIGNED_BYTE, GL_FLOAT).

Вы передаете element.elements_per_vertex второму и element.type третьему параметру, который кажется правильным.Но значения параметров меняются местами:

elements_per_vertex : 5126
type                : 3   

Обратите внимание, что 5126 - это 0x1406, и это значение константы перечислителя GL_FLOAT.

Установите

elements_per_vertex = 3
type = GL_FLOAT

для решения проблемы.

...