11

VAOがバッファマッピングをどのように正確に処理しているかを理解するのに苦労しています。私がしていることは、この擬似コードで説明できます。

SetUp:
  BindVAO
  BindArrayBuffer
  glBufferData(GL_ARRAY_BUFFER, ExpectedMaxCount, NULL, GL_DYNAMIC_DRAW);//Allocate storage
  glEnableVertexAttribArray
  glVertexAttribPointer

  BindElementBuffer
  Allocate storage (no data yet)

  UnbindVAO
  UnbindArrayBuffer
  UnbindElementBuffer

Draw:
  SubArrayAndElementDataIfNeeded
  BindVAO
  DrawElements
  1. これは、DrawElementsが呼び出されたときに、OpenGLがバインドされたVAOを使用して配列と要素のバッファーバインディングを解決するということは正しいですか?Draw呼び出しの後、バインドされた配列バッファーは0ですが、要素バッファーは引き続きDrawに使用されたものです。

  2. VAOのセットアップ中にバッファメモリを割り当てることは必須ですか?セットアップ後にBufferDataが呼び出された場合、VAOは無効になりますか?

4

1 に答える 1

17

VAOがバッファマッピングをどのように正確に処理しているかを理解するのに苦労しています。

「バッファ」の周りに「マッピング」という言葉を使用するときは、十分に注意してください。これは、バッファオブジェクトを処理するときに特定の意味を持ちます。これは、おそらく意図しないものです。

これは、DrawElementsが呼び出されたときに、OpenGLがバインドされたVAOを使用して配列と要素のバッファーバインディングを解決するということは正しいですか?Draw呼び出しの後、バインドされた配列バッファーは0ですが、要素バッファーは引き続きDrawに使用されたものです。

一方は他方とは何の関係もありません。頂点配列オブジェクトには、その名前が示すように、配列から頂点データを取得するために必要なすべての状態が含まれています。1つをバインドすると、そのすべての状態がコンテキストに戻ります。

「バインドされた配列バッファ」が呼び出し後に0である理由は、呼び出しは0であったためです。描画呼び出しはOpenGLの状態を変更しません。

GL_ARRAY_BUFFERさらに、あなたは罠に落ちたようです。バインディングは、、、およびGL_ARRAY_BUFFER3つの関数にのみ重要glVertexAttribPointerですglVertexAttribIPointerglVertexAttribLPointer(パターンを参照してください)。これらは、そのバインディングを調べる唯一の関数です。それらが行うことは、これらの関数が呼び出されたときにバインドされたバッファーを取得し、そのバッファーを現在のVAOに関連付けることです。VAOの状態の一部でGL_ARRAY_BUFFERはありません。バッファオブジェクトは、これら3つの関数のいずれかを呼び出した場合にのみVAOに関連付けられます。その呼び出しを行うと、必要なものをバインドできますGL_ARRAY_BUFFER

GL_ELEMENT_ARRAY_BUFFER VAOの状態の一部です

VAOのセットアップ中にバッファメモリを割り当てることは必須ですか?セットアップ後にBufferDataが呼び出された場合、VAOは無効になりますか?

技術的にはありませんが、ストレージができるまでバッファを使用しないことをお勧めします。特に静的バッファの場合。

于 2012-09-28T14:58:54.927 に答える