3

私はtxtファイルからいくつかのポイントを読み取るアプリケーションを開発しており、ポイントを表示するために折れ線グラフを作成する必要があります。

ポイントの配列とインデックスの別の配列でglDrawElementsを使用しています。以下を表示する必要があります。

  • x 軸と y 軸
  • 軸の色を変更する可能性
  • ポイントとカラー用のバッファのカップル

これまでのところ、私のアプローチは次のとおりでした。

  • 私は1つのVBOを作成しました
  • 2 つの頂点配列オブジェクトを使用します。1 つは軸の情報を格納し、もう 1 つはグラフ用です。
  • 複数の行と対応するインデックス用に、いくつかのバッファがあります
  • 各線の色は、{{XYZW}, {RGBA}} のように、点と同じバッファーにあります。

本当に 2 つの異なる頂点配列を作成する必要がありますか?それとも、対応するバッファーを使用して、軸とグラフの両方に 1 つの配列を使用できますか? 要点は、描画するものを格納するために異なる頂点配列 (glGenVertexArrays) を作成する必要があることをいつ知っているのでしょうか?

4

1 に答える 1

1

お気付きだと思いますがglEnableVertexAttribArray、頂点配列オブジェクトを扱うときは、属性配列を有効にする必要があります。属性ごとに異なるバッファーをバインドできますが、「描画呼び出しごと」などに異なる属性をバインドすることはできません。これは、VAO が指すすべてのものに同じ属性が格納されている必要があることを意味します。もちろん、VAO によって指定されたいくつかの属性を無視することもできますが、これは非効率につながる可能性があり、おそらく良い方法ではありません。

これは、同じ VAO バウンドを持つすべての描画呼び出しが同じ属性を使用することを意味します。新しい VAO が必要かどうかを判断するには、これが最善の方法だと思います。まず、別の属性セットが必要かどうかを判断してください。次に、インデックス バッファー内の別の場所にある一連のインデックスをポイントすることで、オブジェクトのどの部分を描画するかを簡単に決定できます。

よりオブジェクト指向のシーン (個別のメッシュがあるゲームなど) では、最も実用的な方法は、メッシュごとに 1 つ以上の VAO を単純に作成することです。これにより、メッシュごとに異なるタイプのバッファー (静的、動的、またはストリーム) を持つことができます。いくつかの大きなバッファー (バッファーごとに 1 から 8 MB など) を使用し、同じバッファーを使用する複数の VAO を使用することもできます。頻繁なメモリ割り当てを避けるために、私はよくこれを行います。

私はあなたに2つのオプションを与えました:

  • 新しい属性セットごとに新しい VAO
  • シーン内の個別のオブジェクトごとに新しい VAO

どのシーンが最も便利かにもよりますが、ほとんどの場合、パフォーマンスに大きな違いは見られません。もちろん少し性能が良い場合もありますが、それは自分で考えてください。

あなたの問題を考えると、2 つの選択肢が考えられます。頂点を頻繁に更新するかどうかについては言及していません。グラフを常に変更して頂点を更新している場合は、軸に独自の VAO を与えます。軸は決して変更されないため、静的バッファーを使用でき、グラフ自体は動的バッファーまたはストリーム バッファーを使用できます。ただし、軸がグラフ全体の一部であり、グラフ自体が頻繁に更新されない場合は、便宜上、それらすべてを 1 つの VAO に入れることができます。

これらは単なる提案であることを忘れないでください。フレームワークに最適なもの、および/または最高のパフォーマンスを持つもの、または単に最も便利なものを選択する必要があります。

これが少し役立ったことを願っています。

于 2013-04-30T11:37:43.700 に答える