【发布时间】:2018-07-25 12:27:40
【问题描述】:
我是 OpenGL 的新手。现在我可以在屏幕上渲染一些东西,这很棒。现在我想在我的屏幕上流式传输一些数据点(GL_POINTS)。但是,最初它没有显示任何内容。我花了好几天的时间才弄清楚如何让它发挥作用。
重点是,我使用 VBO 来保存数据并调用 glBufferSubData() 来更新缓冲区。但是,只有在第一个渲染循环之前调用 glBufferData() 时它才有效。换句话说,如果我只是这样做
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
在我的初始化函数中(在第一次渲染循环之前),在我的 updateData 循环中我这样做
glBindVertexArray(VAO);
glBindBuffer(VBO);
glBufferData(GL_ARRAY_BUFFER, myData.size() * sizeof(float), &myData[0], GL_DYNAMIC_DRAW);
... // glVertexAttribPointer and other required general process
它不会渲染任何东西。看来我必须 glBufferData(/some random data here/) 来“分配”缓冲区(我认为它是在调用 glGenBuffer() 时分配的)。并使用
glBufferSubData(/*override previous data*/) or
glMapData()
更新该缓冲区。 所以我的问题是......如果我不知道在编译时需要绘制多少数据/顶点,初始化 VBO 的正确/正常方法是什么? (现在我只是 glBufferData() 一个 loooooong 缓冲区并在需要时更新它)
注意:OpenGL3.3、Ubuntu16.04
更新:
在我看来,它的工作方式就像分配char[],我不得不指出我需要多少字符串char[200],并通过snprintf()填写数据。但是我们现在有了向量或字符串,它允许我们动态地改变内存位置。为什么OpenGL不支持?如果他们这样做了,我应该如何使用它。
【问题讨论】:
标签: opengl