给定坐标,我使用以下代码渲染一条线data
:
创建和上传数据:
nPoints = 3 # let's use three points as an example, in reality this would be 1000
data = [x1y1 x2y2 x3y3]
# upload data
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, mode)
划清界线:
# draw line
stride = 0
offset_to_first_vertex = 0
glVertexPointer(2, GL_FLOAT, stride, offset_to_first_vertex)
offset_to_first_vertex = 0
glDrawArrays(GL_LINE_STRIP, offset_to_first_vertex, nPoints)
更新第二个点的 y 坐标:
offset = 12
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(new_data), new_data)
如果我想同时更新多个点的 y 坐标,例如第二点和第三点的 y 坐标,事情会变得更加复杂:
offset = 12
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(new_data), new_data)
offset = 20
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(new_data), new_data)
调用glBufferSubData
非常昂贵,因此我宁愿进行一次调用并同时覆盖所有值。不幸的是,您不能将stride
值传递给glBufferSubData
,这意味着我只能覆盖内存的连续部分。
我在想,也许我需要以不同的方式重新组织内存中的数据:
data = [x1x2x3y1y2y3]
这样我可以一次调用覆盖多个值glBufferSubData
。但是,如果我这样做,那么我就不能再用glVertexPointer
and渲染这些点glDrawArrays
了。
因此我的问题是: 更新我的线的多个单坐标的最佳方法是什么?我应该如何布局内存中的数据?我怎样才能画线?
EDIT1:我可能会跟踪 x 值并通过覆盖相应的 x/y 对来更新多个点。但如果可能的话,我想防止这种情况发生。
EDIT2:有没有办法渲染一行两个 VBO?假设一个 VBO 保留 x 值,而另一个 VBO 保留 y 值。这似乎是不可能的。