0

我正在开发一个简单的 opengl 应用程序,在该应用程序中我绘制了一堆表示为一条线的数据。出于性能原因,我将数据分成多个块并将它们上传到多个 VOB。之后,我分别渲染每个 VBO。以下是一些示例代码:

n_COORDINATES_PER_VERTEX = 2
NBR_DATA_POINTS_PER_VBO = 1000

# plot each VBO
for segment in range(segments):

    # bind the named buffer object so we can work with it.
    glBindBuffer(GL_ARRAY_BUFFER, vbos[segment])

    # specifies the location and data format of an array of vertex coordinates to use when rendering
    glVertexPointer(n_COORDINATES_PER_VERTEX, GL_FLOAT, 0, 0)

    # render primitives from array data
    glDrawArrays(GL_LINE_STRIP, 0, NBR_DATA_POINTS_PER_VBO)

这非常有效,但不幸的是,前一个 VBO 的最后一点和下一个 VBO 的第一点之间存在视觉差距。这是有道理的,因为GL_LINE_STRIP仅为每个 VBO 内的数据创建。

因此我的问题是:如何实现将多个 VBO 呈现为一条线,而不会在其间跳转?

4

1 回答 1

2

你可以这样做

  1. 将一个 VBO 中的最后一个点复制为下一个 VBO 中的第一个点或
  2. 改为使用 GL_LINES 并将下一个 VBO 的第一个点添加到前一个 VBO。

要制作完整的折线,您需要在 VBOS 中共享公共点(我看不到其他选项),您可以选择任何您想要的方法。

    n_COORDINATES_PER_VERTEX = 2
    NBR_DATA_POINTS_PER_VBO = 1000

    # One extra point that is the first vertex of the next batch
    NBR_DATA_POINTS_REAL = NBR_DATA_POINTS_PER_VBO + 1

    # Use GL_LINE_STRIP and duplicate vertices
    # plot each VBO
    for segment in range(segments):

        # Duplicate
        if (not_last_segment)
            vbos[segment][NBR_DATA_POINTS_REAL - 1] = vbos[segment + 1][0];

        # bind the named buffer object so we can work with it.
        glBindBuffer(GL_ARRAY_BUFFER, vbos[segment])

        # specifies the location and data format of an array of vertex coordinates to use when rendering
        glVertexPointer(n_COORDINATES_PER_VERTEX, GL_FLOAT, 0, 0)

        # render primitives from array data
        glDrawArrays(GL_LINE_STRIP, 0, NBR_DATA_POINTS_REAL)

类似的东西 - 看起来你不能一次渲染所有点 - 所以我将跳过涉及 glDrawElements 的解决方案,你可以使用它来绘制索引网格。

于 2012-05-29T19:13:21.630 回答