2

私は多くのサークルを扱うゲームを書こうとしています (まあ、トライアングル ファンですが、アイデアはわかります)。各円には、x 位置、y 位置、および質量特性があります。すべての円の質量特性は異なります。また、透明な円の中心を維持し、円の周囲に沿って不透明にフェードしながら、いくつかの円のグループを異なる色にしたいと考えています。

私は VBO を使用するように言われ、一日中 Google を使っていました。これらの円をどのように描くかについての完全な例と、VBO がどのように機能するかについての説明を、その説明を簡単に保ちながらお願いします。

4

2 に答える 2

3

私自身はまだ VBO を実装していませんが、私が理解していることから、VBO はテクスチャ オブジェクトと同様に機能します。実際、VBO とは何かを他の人に説明するとき、概念的な類似性を強調するために、テクスチャ オブジェクトを誤って「テクスチャ バッファ オブジェクト」と呼ぶのが好きです。

( NVIDIA が指定した拡張機能GL_EXT_texture_buffer_objectからのバッファー テクスチャと混合しないでください。)

それでは考えてみましょう: テクスチャ オブジェクトとは何ですか? これらは、 を使用して生成するオブジェクトですglGenTextures()glGenBuffersARB()同様のことをします。glBindTexture()および との類推が適用されglBindBufferARB()ます。

(OpenGL 1.5 の時点で、関数glGenBuffers()glBindBuffer()はコア OpenGL に組み込まれているため、同等の拡張機能の代わりにそれらを使用できます。)

しかし、これらの「テクスチャ オブジェクト」とは正確には何で、何をするのでしょうか? 実際、glTexture2D()各フレームで を使用してテクスチャを設定できると考えてください。テクスチャ オブジェクトは、GPU とメイン メモリ間のトラフィックを削減するためだけに機能します。ピクセル配列全体を送信する代わりに、静的であることがわかっているテクスチャ オブジェクトの「OpenGL 名」 (つまり、整数識別子)だけを送信します。

VBO も同様の目的を果たします。頂点配列を何度も送信する代わりに、一度使用して配列をアップロードしglBufferData()、オブジェクトの「OpenGL 名」だけを送信します。これらは静的オブジェクトには適していますが、動的オブジェクトには適していません。実際、Ogre3D などの多くの一般的な 3D エンジンでは、メッシュが動的か静的かを指定する方法が提供されています。おそらく、VBO と頂点配列のどちらを使用するかを決定できるようにするためです。

あなたの目的のために、VBOは正しい答えではありません。連続的にモーフィングおよび変化する多数の単純なオブジェクトが必要です。簡単に言えば、頂点が 200 未満のものを意味します。非常にスマートで複雑な頂点シェーダーを作成するつもりでない限り、VBO は適していません。メイン CPU から簡単に操作でき、VBO 全体をグラフィック カードに再アップロードするためにグラフィック カードに特別な呼び出しを行わずにフレームごとに更新できる頂点配列を使用したい (頂点配列を送信するよりも遅くなる可能性がある)。

これは、VBO API に関するnVidia の非常に優れた letscallit の「man ページ」です。詳細については、それを読んでください!

于 2009-09-29T20:27:00.747 に答える
1

良い vbo チュートリアル

あなたがしていることはパーティクルのように見えます。念のため、「パーティクル レンダリング」をググってみてください。

于 2009-09-30T07:21:26.993 に答える