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

时间:2018-06-10 18:52:52

标签: c++ dictionary opengl buffer

我是堆叠溢出的新手。我有以下问题:我希望在我的窗口中有一个旋转的三角形。 现在,我已经设法让我的代码运行,我有一个旋转的三角形。但是,我想重写代码用于学习目的,添加以下两个主要内容:

  1. 稍后使用memcpy
  2. 更新缓冲区对象
  3. 使用阵列结构(AoS)而不是阵列结构(SoA)
  4. 我特此提及" 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;                                                      
            }
    

    任何提示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

代码中有几个问题:

glUnmapNamedBuffer将缓冲区句柄作为参数,而不是GLenum。将glUnmapNamedBuffer(GL_ARRAY_BUFFER);更改为glUnmapNamedBuffer(buffer);。 (你应该检查返回值,当出现问题时返回false)。

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

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

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