Opengl:如何正确映射缓冲区?

Opengl: How to map a buffer CORRECTLY?

我是堆栈溢出的新手。我有以下问题:我想在我的 window 中有一个旋转三角形。 现在,我已经设法得到我的代码 运行 并且我有一个旋转三角形。但是,出于学习目的,我想重写代码,添加以下两个主要内容:

  1. 稍后使用 memcpy 更新缓冲区对象
  2. 使用结构数组 (AoS) 而不是数组结构 (SoA)

我指的是 "OpenGL Superbible" 这本书。 我将为您提供一些代码片段:

    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;                                                      
        }

如有任何提示,我们将不胜感激。

代码中存在几个问题:

glUnmapNamedBuffer 将缓冲区句柄作为参数,而不是 GLenum。将 glUnmapNamedBuffer(GL_ARRAY_BUFFER); 更改为 glUnmapNamedBuffer(buffer);。 (你应该检查 return 值,当有问题时它 return 是错误的)。

glVertexArrayVertexBuffer 的步幅是错误的。每个顶点在前一个顶点之后开始 8 个浮点数(或 sizeof(vertex))。变化

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

glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vertex));