0

テクスチャなしで一般的な形状を描画できる関数を作成しようとしています。これには、プリミティブな多角形のシステムが含まれますが、例として、show myrectangle 関数を使用します。

void Rectangle(float x1, float y1, float x2, float y2);

すべてのレンダリングで VAO を使用しているため、これをどのように処理すればよいかわかりません。私の現在の考え方は、単一の VBO が接続された 1 つの VAO を使用し、これらの関数のいずれかが呼び出されるたびにこの VBO を編集することです。したがって、四角形の例では、単純にバッファをバインドし、glBufferData を呼び出して四角形のポイントのパラメータを含む配列を渡し、頂点配列をレンダリング システムの残りの部分に渡します。

情報が見つからないのは、VAO がバッファへの参照を保存するか、バッファとフォーマットに基づいてデータの内部コピーを作成するかです。VAO で描画しようとするたびにバッファを編集しても問題ありませんか? その場合、毎回 glVertexAttribPointer を呼び出す必要がありますか?

4

1 に答える 1

2

VAO はバッファ オブジェクトを参照するため、その内容を変更したりストレージを再割り当てしたりすると、バッファ オブジェクトを使用すると、これが表示されます。

ただし、これを行うべきではありません。ARBは先月、これを不可能にすることを主な目的とする拡張機能/コア機能をリリースしました。拡張機能が行うことはそれだけではありませんが、基本的には拡張機能によって残りの部分が機能します。

これは、ARB と IHV が、バッファー オブジェクトのストレージを勝手に再割り当てすることについてどの程度考えているかということです。だからやらないでください。にデータをストリーミングするためのバッファが必要な場合、それは素晴らしいことです。適度に大きなものを割り当てて、それにストリーミングするだけです。を使用してバッファglBufferData(..., NULL)を無効化できます(無効化または使用のためにマッピングできないと仮定します)。ただし、これを行うときは、バッファーのサイズを変更しないでください。glInvalidateBufferData

于 2013-08-06T21:44:21.700 に答える