1

render 呼び出し間の頂点を効率的に更新し、これらの点のいくつかの間の線を動的にレンダリングするにはどうすればよいでしょうか?

私は基本的な OpenGL の例に取り組んでいます。glDrawArraysこれは、GL_TRIANGLESマクロを使用してレンダリングする静的頂点配列です。

動的に更新される頂点を少し試して、ランダムな点の間に基本的な線を引きたいと思います。

4

1 に答える 1

2

ここで実際に 2 つの質問があります。1 つは頂点データの更新に関するもので、もう 1 つはバッファに含まれる頂点のサブセットの描画に関するものです。

頂点バッファー内のデータを更新する場合、静的フラグが設定されている頂点バッファー オブジェクト内のデータを変更することはできません (むしろ変更すべきではありません)。静的頂点データとはそういう意味ですか?VBO の使用フラグは単なるヒントですが、VBO STATICを呼び出すと、データを 1 回送信して複数回描画することをドライバーに伝えることになっています。

適切なフラグは、STREAM (初期データが提供された後に少なくとも 1 回更新される) またはDYNAMIC (頻繁に更新される) のいずれかです。

Vertex Buffer Object 内のデータを実際に変更するには、次の 2 つのオプションがあります。

  1. を使用してアプリケーションのアドレス空間にマップし、glMapBuffer (...)変更したメモリの領域をドライバーに検出させます。

  2. を使用してデータの連続ブロックを送信しますglBufferSubData (...)

バッファ内のランダムな場所を更新したいと言ったので、何百もの呼び出しを行う可能性があるglBufferSubData (...).

2 つの頂点間に線を引く場合は、Index Array を使用します。最新の OpenGL では、同じメカニズム (頂点バッファー オブジェクト) を使用してインデックスを頂点バッファーに格納します。この場合、プリミティブのタイプ (GL_LINES) で呼び出しglDrawElements (...)て、インデックス配列の頂点インデックス、描画する最初のインデックス、およびインデックスの合計数を使用して構築します。

glDrawElements (...)指定したオフセットから始まるインデックス配列を実行し、(NumberOfElements / NumberOfElementsPerPrimitiveType) プリミティブを描画します。GL_LINES の場合、各線は 2 つのインデックスで定義されます (したがって、n インデックスを指定すると n/2 線が描画されます)。

于 2013-08-14T22:49:39.440 に答える