Opengl: как правильно сопоставить буфер? - PullRequest
0 голосов
/ 10 июня 2018

Я новичок в переполнении стека.У меня следующая проблема: я хочу, чтобы в моем окне был вращающийся треугольник.Теперь мне уже удалось запустить мой код, и у меня был вращающийся треугольник.Однако я хотел переписать код для изучения, добавив две следующие важные вещи:

  1. Обновление объекта буфера позже с помощью memcpy
  2. Наличие массива структур (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;                                                      
        }

Любые советы будут с благодарностью.

1 Ответ

0 голосов
/ 10 июня 2018

В коде есть несколько проблем:

glUnmapNamedBuffer принимает дескриптор буфера в качестве параметра, а не GLenum.Измените glUnmapNamedBuffer(GL_ARRAY_BUFFER); на glUnmapNamedBuffer(buffer);.(И вы должны проверить возвращаемое значение, оно возвращает ложь, когда есть проблема).

Шаг для glVertexArrayVertexBuffer неверен.Каждая вершина начинается с 8 плаваний после предыдущей (или sizeof(vertex)).Измените

glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4));

на

glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vertex));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...