【问题标题】:Unable to obtain buffer object data through glGetBufferSubData无法通过glGetBufferSubData获取缓冲区对象数据
【发布时间】:2020-04-12 15:05:28
【问题描述】:

我希望使用 opengl 制作河内塔游戏。最终,我遇到了处理和将数据从一个缓冲区对象传输到另一个缓冲区对象的问题。 我已经成功地将我的顶点存储在一个缓冲区对象中,并将它与一个顶点数组绑定。现在想将它移动到另一个创建的缓冲区对象,该对象绑定到另一个顶点数组。问题是当我尝试使用 glGetBufferSubData 获取我的顶点时,我的数据数组显示它的所有元素都为零(我将它打印在控制台上)。我仔细检查了天气,我的缓冲区对象的数据正确,看起来是这样。请帮助我,我已经走到了尽头。

我的代码:

struct Stack
{
    unsigned int top;
    VA vao; 
};

void transfer(Stack& s1, Stack& s2)
{
    float data[20];//collects data 
    s1.vao.Bind();
    glGetBufferSubData(GL_ARRAY_BUFFER, 0,  20* sizeof(float), data);`

    for (int i = 0; i < 20; i+=5)//prints data collected
    {
        cout << i+1 << "th loop" << endl;
        for (int j = i; j < i + 5; j++)
        {
            cout << data[j]<<"\t";
        }
        cout << endl;
    }

    s2.vao.Bind();
    glBufferSubData(GL_ARRAY_BUFFER, 0, 20 * sizeof(float), data);
}

Output Screen hopefully

【问题讨论】:

  • 嘿伙计们,我忘了告诉你我的 VA 是一个用于基本绑定和解除绑定操作的顶点数组类,对不起我的错......

标签: c++ opengl towers-of-hanoi vertex-array-object vertex-buffer-objects


【解决方案1】:

对于glGetBufferSubDataglBufferSubData的使用,你必须绑定Buffer Object而不是Vertex Array Object。 此操作从当前绑定到指定目标的缓冲区对象中读取。

GL_ARRAY_BUFFER 是一个全局状态。在 VAO 的状态向量中存储对 VBO 的引用,但绑定 VAO 不会绑定任何 VBO。如果缓冲区目标是GL_ELEMENT_ARRAY_BUFFER,那么您必须绑定VAO,因为Index Buffer 绑定存储在VAO 中。

无论如何,如果你想将数据从一个缓冲区复制到另一个缓冲区,那么你可以使用glCopyBufferSubData/glCopyNamedBufferSubData,它将缓冲区对象的数据存储直接复制到另一个缓冲区对象的数据存储,而无需从GPU 到 CPU。

【讨论】:

    【解决方案2】:

    GL_ARRAY_BUFFER 不是 VAO 状态的一部分。因此绑定 VAO 不会更改 GL_ARRAY_BUFFER 绑定。

    在读取数据之前,您应该保留缓冲区的 id 以绑定它。如果由于某种原因您没有原始缓冲区 id,您可以使用

    检索它
    glGetVertexAttribiv(attrib, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &id)
    

    注意 VAO 的每个属性可能有不同的缓冲区。

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 2020-07-13
      • 2011-11-02
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多