【问题标题】:OpenGL 4 providing data to vertex bufferOpenGL 4 向顶点缓冲区提供数据
【发布时间】:2016-01-26 14:23:27
【问题描述】:

我使用旧方法将数据提供给 OpenGL 中的顶点缓冲区

glGenBuffers(1, buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(pos), pos, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);

从 OpenGL 4.3 开始,出现了一种向顶点着色器提供数据的更清晰的新方法

const GLfloat colors[] =
{
    1.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 1.0f
};
glBindVertexBuffer(1, buffer, 0, 3 * sizeof(GLfloat));

glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(1, 1);
glEnableVertexAttribArray(1);

但我找不到任何资源来解释如何使用新方式提供数据。我当然可以这样做

glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0); //i can do even so, and later I can use glBindVertexBuffer

但它看起来并不优雅。如果我不使用 glBindBuffer 并且只使用 glBindVertexBuffer 然后使用 glBufferData,我将覆盖使用 glBindBuffer 绑定的缓冲区中的数据。
所以问题是:我能否以其他方式向顶点缓冲区提供数据,或者我应该始终使用 glBindBuffer、glBufferData,然后才使用 glBindVertexBuffer、glVertexBufferFormat、glVertexAttribFormat 和 glVertexAttribBinding。谢谢!

【问题讨论】:

    标签: c++ opengl vertex-buffer opengl-4


    【解决方案1】:

    glVertexAttribFormat 和 glVertexAttribBinding 告诉 OpenGL 如何 数据在缓冲区中是如何组织的;本质上它们取代了 glVertexAttribPointer(和 only glVertexAttribPointer)。仍然使用 glBuffer[Sub]Data 加载数据。

    【讨论】:

    • 感谢您的回答。但是无论如何要使用 glBufferData 我应该在之前使用 glBindBuffer 绑定缓冲区,或者存在其他方式告诉 OpenGL 我想将数据放入使用 glBindVertexBuffer 绑定的缓冲区(使用 glBindBuffer 只是为了放置数据和 glBindVertexBuffer 对我来说似乎有点模棱两可) ?
    【解决方案2】:

    根据我从 OpenGL 4.3 规范中可以看出,您仍然需要将顶点缓冲区绑定到“常规”绑定点以更新其数据:

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
    

    4.5 规范通过引入 DSA 函数有效地解决了这个问题,它允许您更新缓冲区数据而无需先将其绑定到插槽:

    glNamedBufferSubData(buffer, offset, size, data);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2019-04-01
      相关资源
      最近更新 更多