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が、間にジャンプすることなく1行としてレンダリングされるようにするにはどうすればよいですか?

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 に答える