10

VertexAttribPointerを再度呼び出さない限り、BindBufferの後にシェーダーへの入力がないことに気づきました。それは必要ですか?シェーダーは書き込みでは変更できませんが、使用されるバッファーのみが変更されます。

4

2 に答える 2

24

tiburはすでに実際の質問に答えていますが、コンテキストを追加したいと思いました。

glBindBuffer(GL_ARRAY_BUFFER, ...)それ自体は何もしません。への追加の引数と考えてくださいglVertexAttribPointer

複数のバッファーを異なる属性にバインドできることを忘れないでください(たとえば、属性0はvbo 1を使用し、属性1と2はvbo 2を使用します)。そのセットアップでどのようなAPIの順序が表示されますか?

実際のAPIでは、次のようになります。

glBindBuffer(GL_ARRAY_BUFFER, 1);
glVertexAttribPointer(0, ...)
glBindBuffer(GL_ARRAY_BUFFER, 2);
glVertexAttribPointer(1, ...)
glVertexAttribPointer(2, ...)

glDraw*(...)

なぜ仕様がそのように機能するのでしょうか?まあ、それはその頭を育てる後方互換性です。VBOが導入されたとき、glVertexPointer等。使用するバッファオブジェクトを渡すためのパラメータがありませんでした。セマンティックごとに多くの新しいエントリポイント(VertexPointer / NormalPointer / TexCoordPointer ...)であるか、それ自体が追加のエントリポイントであり、*Pointer呼び出しの追加パラメータとして機能していました。彼らは後者を選択しました(補足として、これがバッファ内のオフセットをポインタとして渡さなければならない理由でもあります)。

于 2010-09-08T10:07:18.727 に答える
13

OpenGL OpenGL仕様、51ページ(バッファオブジェクトの状態)に従って、配列ポインタに対応する状態はバッファIDを格納します。つまり、描画するバッファオブジェクトを変更する場合は、関数を呼び出す必要がありglVertexAttribPointerます。

glBindBuffer(1);
glVertexPointer(...);
glDrawArrays(...); /// Drawing will use buffer 1

glBindBuffer(2);
glDrawArrays(...); /// Drawing will still use buffer 1

glVertexPointer(...);
glDrawArrays(...); /// Drawing will now use buffer 2
于 2010-09-08T08:21:41.697 に答える