1

今気になっているアプリは3Dモデルビューアです。ユーザーは非常にまれに大きな新しいメッシュをロードしてレンダリングすることがあり、古いメッシュは破棄する必要があります (破棄する必要があります)。

このため、GL_STATIC_DRAW明らかに VBO の正しいヒントです。

この時点で少し確信が持てないのはglDeleteBuffers()、VBO と IBO に対して、またglDeleteVertexArrays[OES]()VAO に対しても行うのか、それとも何も行わずにglBufferData()新しくロードしたメッシュで VBO と IBO のみを実行するのか、何も削除して再生成したり、再生成したりする必要がないことです。 -VAOglVertexAttribPointer状態を定義します。(サブ質問: VBO のみを削除して再生成し、VAO はそのままにしておく場合、スキップできglVertexAttribPointer()ますか?)

を呼び出すと OpenGL が VBO 内の以前のデータを実際に破棄する場合glBufferData()、これは完璧です。私が読んだ限りでglBufferData()は、VBO を再割り当てすることになっています。

しかし、実際に私が探しているのは、このタマネギのさまざまなレイヤーまで再ロードすることと、頂点を変更することだけが必要な場合にどこまで行く必要があるかについての具体的な説明です。アプリケーション内のインデックス バッファー コンテンツ (生のジオメトリ)、または VBO をまったく再生成または削除する必要があると考えられる状況が存在する場合。同じ VBO が異なる VAO のセット間で便利に共有される可能性があることがわかります。また、二度と使用しない VAO がいくつかあるため、割り当てを解除する状況を想像できますが、VBO のように見えます。内部に含まれるデータを再割り当てするための API が存在する場合は、引き続きリサイクルできます。

そこにあるすべてのチュートリアルと説明は、セットアップを支援することだけを扱っていることがわかりましたが、その段階を理解した今、これらの詳細の残りを正しくする方法があまり明確ではありません.

4

1 に答える 1

2

頂点配列オブジェクトを削除すると、バッファオブジェクトの内容に何らかの影響があると考える理由がわかりません。FBO を削除しても、それにアタッチされているテクスチャまたはレンダー バッファーのストレージには影響しません。また、VAO を削除しても、それにアタッチされているバッファー オブジェクトのストレージには影響しません。

標準に関する限り、好きなことを行うことができます。ヒントはヒントです。それらに従う必要はありません。

そして、AMDに関する限り、好きなことをすることができます. その理由は、ヒントがどのように機能するかを理解していない人々のおかげで、人々AMDがヒントをほとんど完全に無視するところまで好きなことをしたからです. バッファオブジェクトの使用パターンを監視し、実際の使用方法がわかるまで移動します。

NVIDIA は実際にヒントを気にかけ、あなたを引き留めます。ヒントが十分に明確に定義されている限り、それらを保持するのに十分です。間違ったヒントを使用すると、パフォーマンスが永遠に低下します。AMDは最終的にあなたが本当に何を意味したかを理解します.

いずれにせよ、実際にヒントに忠実でありたい場合はGL_STATIC_DRAW、「このバッファ オブジェクトに 1 回だけアップロードする」ことを意味することを意図しています。これがバッファオブジェクトの再割り当てとどのように調和するかはあなた次第です。

ただし、ARB の意見を推測したい場合は、最近の ARB_buffer_storage 4.4 機能を検討してください。そこでは、(ヒントに関係なく) バッファー オブジェクトのストレージの再割り当てを完全に禁止します。使用する使用上のヒントに関係なく、(既存の buffer を無効にするために使用glBufferDataする以外に) ストレージを再割り当てすることは悪い考えであるという「ヒント」としてそれを受け取ることができます。

また、buffer_storage からは、クライアント ストレージからアップロードする操作をGL_STATIC_DRAW 禁止します。そこにあると、他のバッファからコピーしたり、GL内プロセスの他の宛先として使用したりできます。ただし、その内容を変更することはできません。削除のみ可能です。

GL_STATIC_DRAWこれは、「削除する、再割り当てしない、再アップロードしない」という意味のヒントだと思います。

これが OpenGL ES にとって何を意味するのかは、私にはわかりません。これは、さまざまな実装がバッファーのストレージをどのように実装するかに依存します (これが、デスクトップ GL と GL ES 実装の両方の動作について尋ねるのが間違っている理由です)。ただし、一般的にモバイル GPU には 2 つの別個のメモリ プールがないことを考えると、実際には気にしないと思います。確かに、実装はメモリをキャッシュされていないものとして割り当てたり、メモリへのアクセスを高速化したりすることができます。しかし、それを超えて、それはおそらく問題ではありません。

于 2013-09-05T05:33:48.233 に答える