1

現在、iOS と Android の両方のプラットフォームで OpenGL ES 2.0 アプリケーションをプログラミングしています。

このアプリケーションでは、すべて VBO を使用する複数のメッシュをレンダリングします。レンダリングを最適化する過程で、レンダリングするメッシュが 2 つの頂点フォーマットを共有していることに気付きました。だから私は次のことをしたかった:

最初に、すべての頂点属性ポインター オフセットを設定し、次に、この頂点形式を使用する各 VBO を単純にバインドし、glVertexAttribPointer関数を再度呼び出さずにレンダリングします。

しかし、それは私に奇妙な結果をもたらします。

私の質問は:glVertexAttribPointer新しい VBO をバインドするたびに呼び出しを行う必要がありますか?

4

2 に答える 2

2

まず第一に、すべての OpenGL 状態と同様に、 で設定された状態は、glVertexAttribPointer誰かがglVertexAttribPointer(同じ属性インデックスに対して) 再度呼び出すまで変更されません。ただし、ここで重要なことは、 で変更された内部状態は、glVertexAttribPointerレンダリングに使用されるバッファー オフセットを格納するだけでなく、呼び出し時に VBO バウンドにオフセットされるということglDraw...です。また、呼び出し時にバインドされた実際のバッファ オブジェクトも格納しますglVertexAttribPointer

はい、頂点データを別の VBO から取得したい場合はいつでも、この VBO をバインドし、glVertexAttribPointerこの VBO がバインドされている間に適切な呼び出しを行う必要があります。あなたの場合、これは面倒に思えるかもしれませんが、これは実際には良いことです。この方法では、何かをレンダリングするときに現在バインドされているバッファについて心配する必要はありませんが、glVertexAttribPointer. さらに重要なことは、レンダリングの前に別の VBO をバインドすることです。これにより、1 回のレンダリング呼び出しで異なる VBO から異なる頂点属性を取得できます (他にどのように行うでしょうか?)。

編集:ただし、頂点配列オブジェクトを使用して、頂点データの設定プロセスを容易にすることができます。それらは、一連の配列からのレンダリングに必要なすべての状態をカプセル化します (したがって、 によって変更されたすべてのものglVertexAttribPointergl(En/Dis)ableVertexAttribArrayおよび にバインドされたバッファーGL_ELEMENT_ARRAY_BUFFERですが、前述のように、 にバインドされたバッファーではありませんGL_ARRAY_BUFFER)。もちろん、呼び出す前にバッファを適切にバインドする必要がありますglVertexAttribPointer。しかし、VAO を使用すると、セットアップ ルーチンでこのコードが必要になるだけで、レンダリングに必要なのは を呼び出すことだけglBindVertexArrayです。特定の ES デバイスがそれらをサポートしているかどうかはわかりませんが。

于 2013-01-30T10:26:17.290 に答える
1

VAO / VBO での描画で見つけたクールなリソース

http://www.arcsynthesis.org/gltut/Positioning/Tutorial%2005.html#d0e4720

たとえば、複数のVAOと単一のVBOを使用して、複数のオブジェクトを駆動する方法を示しています(各VAOは、同じVBOへの異なるオフセットを持つポインターを保持しています)

あなたがそれを学ぶ部分は言うまでもなく、一見の価値があります

  • glBindBuffer(GL_ARRAY_BUFFER...glVertexAttribPointerデータをバインドしません。実際のデータ バインディングを行う次の呼び出しの単なるグローバル ポインターです。

しかし

  • glBindBuffer(GL_ELEMENT_ARRAY_BUFFER...要素配列を現在のVAOにバインド/保存します
于 2013-02-01T03:51:23.653 に答える