Я новичок в переполнении стека.У меня следующая проблема: я хочу, чтобы в моем окне был вращающийся треугольник.Теперь мне уже удалось запустить мой код, и у меня был вращающийся треугольник.Однако я хотел переписать код для изучения, добавив две следующие важные вещи:
- Обновление объекта буфера позже с помощью memcpy
- Наличие массива структур (AoS) вместо структуры массивов (SoA)
Я имею в виду книгу "Superbible OpenGL".Я предоставлю вам некоторые фрагменты кода:
glGenVertexArrays(1, &vao);
static const vertex vertices[] = {
{ 0.25, -0.25, 0.5, 1.0 ,
1.0, 0.0, 0.0, 1.0},
{ -0.25, -0.25, 0.5, 1.0,
0.0, 1.0, 0.0, 1.0 },
{ 0.25, 0.25, 0.5, 1.0,
0.0, 0.0, 1.0, 1.0 }
};
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, sizeof(vertices), NULL, 0);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
void * ptr = glMapNamedBuffer(buffer, GL_WRITE_ONLY);
memcpy(ptr, vertices, sizeof(vertices));
glUnmapNamedBuffer(GL_ARRAY_BUFFER);
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4));
// Positions
glVertexArrayAttribBinding(vao, 0, 0);
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, offsetof(vertex, x));
glEnableVertexArrayAttrib(vao, 0);
// Color
glVertexArrayAttribBinding(vao, 1, 0);
glVertexArrayAttribFormat(vao, 1, 4, GL_FLOAT, GL_FALSE, offsetof(vertex, r));
glEnableVertexArrayAttrib(vao, 1);
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vertex));
Я настроил структуру вершины следующим образом:
struct vertex {
// Position
float x;
float y;
float z;
float w;
// Color
float r;
float g;
float b;
float a;
};
В первый раз я жестко закодировал цвет в своей вершине.шейдер.И у меня были данные о положении в массиве данных.Я устанавливаю данные напрямую, вызывая glNamedBufferStorage вместо того, чтобы (как сейчас) вставлять NULL.Тогда это работало.Но когда я изменил две вещи, он перестал работать.Я точно знаю, что оба эти основных шага содержат некоторые ошибки.
Здесь я предоставлю вам вершинный шейдер.Кстати, матрица MVP работает, так что это не проблема.
#version 420 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
out vec4 vs_color;
uniform mat4 mvp;
void main(void)
{
gl_Position = mvp * position;
vs_color = color;
}
Любые советы будут с благодарностью.