用一个glSubBuffer调用更新多个线坐标?

时间:2012-07-04 18:57:28

标签: opengl

我使用以下代码渲染一条线,给定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调用覆盖多个值。但是,如果我执行此操作,则无法再使用glVertexPointerglDrawArrays渲染这些点。

因此我的问题: 更新我的线路的多个单一坐标的最佳方法是什么?我该如何在内存中布局数据?我该怎么画线?

EDIT1:我可能会跟踪x值并通过覆盖相应的x / y对来更新多个点。但是如果可能的话,我想阻止它。

EDIT2:有没有办法渲染一行两个VBO?假设一个VBO保持x值而另一个具有y值。这似乎不太可能。

1 个答案:

答案 0 :(得分:1)

你能使用着色器吗?我想如果你想要你可以将x和y位置作为单独的属性,然后将它们组合在着色器中(你甚至可以将x和y放在不同的缓冲区中)。

如果在固定管道中,您可以查看glMapBuffer,它允许您将整个缓冲区映射到本地客户端。然后,您可以以任何方式更新任何值。我不知道表演会对此产生什么影响。