Написание программы 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)
Макет иТипы данных элемента
Исходный код
// 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
поменялись местами, вызвав ошибку, на скриншоте ниже указан правильный порядок.