1

给定坐标,我使用以下代码渲染一条线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。但是,如果我这样做,那么我就不能再用glVertexPointerand渲染这些点glDrawArrays了。

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

EDIT1:我可能会跟踪 x 值并通过覆盖相应的 x/y 对来更新多个点。但如果可能的话,我想防止这种情况发生。

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

4

1 回答 1

1

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

如果在固定管道中,您可以查看 glMapBuffer,它允许您将整个缓冲区映射到本地客户端。然后,您可以以任何您想要的方式更新任何值。我不知道性能对此有何影响。

于 2012-07-04T19:16:51.470 回答