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)

2 点目の y 座標を更新します。

offset = 12
glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(new_data), new_data)

2 番目と 3 番目のポイントなど、複数のポイントの 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は非常にコストがかかるため、1 回の呼び出しですべての値を同時に上書きすることをお勧めします。stride残念ながら、 に値を渡すことはできませんglBufferSubData。つまり、メモリの連続した部分を上書きすることしかできません。

メモリ内のデータを別の方法で再編成する必要があるのではないかと考えていました。

data = [x1x2x3y1y2y3]

このようにして、 の 1 回の呼び出しで複数の値を上書きできますglBufferSubData。ただし、これを行うと、ポイントをglVertexPointerandでレンダリングできなくなりglDrawArraysます。

したがって、私の質問: 私のラインの複数の単一座標を更新する最良の方法は何ですか? メモリ内のデータをどのようにレイアウトすればよいですか? どうすれば線を引くことができますか?

EDIT1:おそらく x 値を追跡し、対応する x/y ペアを上書きすることで複数のポイントを更新できます。でも、できればこれは避けたいですよね。

EDIT2: 1 つの行を 2 つの VBO でレンダリングする方法はありますか? 1 つの VBO が x 値を保持し、別の VBO が y 値を保持しているとします。それは可能ではないようです。

4

1 に答える 1

1

シェーダーは使えますか?必要に応じて、x と y の位置を個別の属性として保持し、それらをシェーダーで結合できます (x と y を個別のバッファーに入れることもできます)。

固定パイプラインの場合は、glMapBuffer を確認できます。これにより、バッファー全体をローカル クライアントにマップできます。その後、任意の方法で任意の値を更新できます。これがパフォーマンスにどのような影響を与えるかはわかりません。

于 2012-07-04T19:16:51.470 に答える