我使用以下代码渲染一条线,给定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坐标,那么事情会变得更复杂,例如第二和第三点:
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
和glDrawArrays
渲染这些点。
因此我的问题: 更新我的线路的多个单一坐标的最佳方法是什么?我该如何在内存中布局数据?我该怎么画线?
EDIT1:我可能会跟踪x值并通过覆盖相应的x / y对来更新多个点。但是如果可能的话,我想阻止它。
EDIT2:有没有办法渲染一行两个VBO?假设一个VBO保持x值而另一个具有y值。这似乎不太可能。
答案 0 :(得分:1)
你能使用着色器吗?我想如果你想要你可以将x和y位置作为单独的属性,然后将它们组合在着色器中(你甚至可以将x和y放在不同的缓冲区中)。
如果在固定管道中,您可以查看glMapBuffer,它允许您将整个缓冲区映射到本地客户端。然后,您可以以任何方式更新任何值。我不知道表演会对此产生什么影响。