如何跨多个VBO创建线条?

时间:2012-05-29 19:04:11

标签: opengl

我正在开发一个简单的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呈现为一条线,而不会跳到中间?

1 个答案:

答案 0 :(得分:2)

您可以通过

执行此操作
  1. 将一个VBO中的最后一个点复制为下一个VBO中的第一个点或
  2. 使用GL_LINES,并将下一个VBO的第一个点添加到上一个VBO。
  3. 要制作完整的折线,你需要在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,你可以使用它来绘制一个索引网格。