6

私は、OpenGL を使用して画面上のレンダリングを処理する単純な CAD プログラムに取り組んでいます。画面上に描画されるすべての図形は、すべて単純な線分で構成されているため、単純な描画でも何千もの個別の線を処理することになります。

アプリケーションと OpenGL の間でこの一連の行の変更を伝達する最良の方法は何ですか? OpenGL バッファ内の行の特定のサブセットのみを更新する方法はありますか?

ここで概念的な答えを探しています。実際のソース コードに入る必要はありません。データ構造と通信に関する推奨事項をいくつか示します。

4

4 に答える 4

8

表示リスト (glNewList/glEndList) を使用するなどの簡単な方法を使用できます。

もう少し複雑なもう 1 つのオプションは、頂点バッファー オブジェクト (VBO - GL_ARB_vertex_buffer_object) を使用することです。動的に変更できるという利点がありますが、表示リストは変更できません。

これらは基本的にすべてのデータ/変換をまとめて GPU で実行し (ハードウェア アクセラレーションを使用している場合)、パフォーマンスが向上します。

于 2008-12-01T22:09:43.567 に答える
7

Vertex Buffer Objects は、おそらく必要なものです。元のデータ セットをロードしたら、既存のチャンクを で変更できますglBufferSubData()

余分な行セグメントを追加してバッファーのサイズがオーバーフローした場合、もちろん新しいバッファーを作成する必要がありますが、これは、何かが大きくなったときに C で新しい、より大きなメモリ チャンクを割り当てなければならないことと同じです。

編集: 表示リストに関するいくつかの注意事項と、それらを使用しない理由:

  1. OpenGL 3.0 では、ディスプレイ リストは非推奨であるため、それらを使用することは 3.0 以降の前方互換性がありません (もちろん、2.1 の実装はしばらくの間存在するため、ターゲット ユーザーによっては、これは問題にならない場合があります)。
  2. 何かを変更するたびに、表示リスト全体を再構築する必要があり、頻繁に変更されると、表示リストの目的全体が無効になります。
于 2008-12-01T22:15:58.530 に答える
2

すでにこれを行っているかどうかはわかりませんが、可能であれば個々の GL_LINES の代わりに GL_LINE_STRIP を使用して、カードに送信される頂点データの量を減らすようにしてください。

于 2008-12-01T23:13:03.767 に答える
2

私の提案は、線/曲線のある種の階層データ構造であるシーン グラフを使用することです。巨大なモデルがある場合、単純な行のリストがあるとパフォーマンスが影響を受けます。グラフ/ツリー構造を使用すると、バウンディング ボリュームを使用して、表示されているアイテムと表示されていないアイテムを簡単に確認できます。また、シーングラフを使用すると、変換を簡単に適用してジオメトリを再利用できます。

于 2008-12-09T18:08:50.303 に答える