【问题标题】:Editing OpenGL VBO with glBufferData removes parts of data使用 glBufferData 编辑 OpenGL VBO 会删除部分数据
【发布时间】:2020-12-14 09:35:14
【问题描述】:

我一直在尝试使用 glBufferData 编辑和/或更新 OpenGL VBO,以将数据发送回缓冲区。在某些情况下,我发送的数据比之前的数据大,但这不重要,因为我使用的是glBufferData,它会覆盖缓冲区的数据,对吧?

好吧,当我运行我的程序并向缓冲区添加更多面孔时,它会从缓冲区的另一部分移除面孔,而不是渲染它们。

这是我的缓冲区更新代码:

glBindVertexArray(vao)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
draw_data = self.generate_vertex_data(data)
print(draw_data.size - previous_draw_data.size)
glBufferData(GL_ARRAY_BUFFER, draw_data.nbytes, draw_data, GL_DYNAMIC_DRAW
previous_draw_data = draw_data

我已经检查过了,draw_data 是正确的:问题在于 glBufferData,它在某种程度上受限于缓冲区的大小。 draw_data 是一个 numpy 数组。另外,如果我不更新缓冲区,一切都很好。

当我更新缓冲区时,如果draw_data 大于previous_draw_data,它会渲染新面孔但停止渲染其他面孔(我假设被删除的面孔存储在缓冲区的前面)。

我想知道为什么glBufferData 显然受限于缓冲区的大小,即使它应该重新发送整个数据。

【问题讨论】:

  • 问题:你确定你也在你的draw call中更新/增加顶点数吗?
  • 我没有,实际上!谢谢一百万,你刚刚解决了大约一周的头疼问题!

标签: python opengl vbo pyopengl


【解决方案1】:

感谢httpdigest,我现在知道我没有在调用glDrawArrays 时更新人脸数量,这有效地限制了可以渲染的人脸数量。就这么简单:我更新了人脸数量,现在可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多