2011-12-22 14 views
3

私はthisチュートリアルに沿って読んでいると私は頂点バッファを使用する方法では終わりに向かって降りると、私はすでに私が二度目バインドする必要があり、一度に生成され、glBindBufferと呼ばれる頂点バッファことを参照してください。なぜglBindBufferへの2回目の呼び出し?

glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle); 

私はopenGL(3日間など)にはまだまだ新しいので、これらの多くのことがどのように機能するか心配しています。コマンドに関するkhronosやopengl.orgの読書に多くの時間を費やしていますが、なぜこれが二回呼び出されるのか理解できませんでした。何かヒント?ありがとう。

答えて

7

は、厳密にその特定の例をい
バインド
スタッフデータを作成必要 2番目のバインド
のですか?いいえ。OpenGLは状態を保持しています。バッファオブジェクトがターゲットにバインドされている場合、そのオブジェクトにバインドするまでバインドされたままになります。

しかし、2番目のバッファを作成するバッファの作成後にコードを挿入するとどうなりますか?結局のところ、2つのオブジェクトが必要な場合があります。あるいは、あなたが望む多くの人がいます。バッファオブジェクトを共有する必要はありません。

これを実行すると、コードが期待しているバッファがにバインドされているバッファは実際にはバインドされていないため、コードが壊れます。したがって、あなたが状態を管理し、あなたが何をやっているかを本当に知っていない限り(チュートリアルに従っているなら、答えは「いいえ」です)、あなたはあなたが意図したことをする必要があるどのような状態にもすべきです。

したがって、特定のバッファから描画する場合は、バインドして適切な状態(gl*Pointer呼び出し)を設定する必要があります。

+0

ああ。だからこそ、私のコードは潜在的に間違っていても私に問題を与えていないのです。洞察力のある!ありがとう。これはこのすべてのことを学ぶのに非常に役立ちます。 – Narcolapser

5

バッファをバインドしてアンバインドして、 'C'からコピーしてOpenGLから描画する必要があります。 プログラムとグラフィックスの間のロック/ロック解除と考えることができます。

ので、シーケンスが
アンバインド

バインド
表示が
バインド解除

+0

ooh。そうですか。感謝しています。 (また、私のコードで潜在的なエラーを指摘した...) – Narcolapser

+0

OpenGLで覚えておくべき重要なことは、ステートマシンだということです。設定を変更するまで設定は変わりません。 –

2

概要:第2のものは通常、最初のものをアンバインドする。

名前バッファを持つバッファオブジェクトが存在しない場合、その名前で作成されます。バッファオブジェクトがターゲットにバインドされると、そのターゲットの以前のバインドは自動的に解除されます。

バッファオブジェクト名は符号なし整数です。値ゼロは予約されていますが、各バッファオブジェクトターゲットのデフォルトバッファオブジェクトはありません。その代わり、ゼロに設定されたバッファは、以前にバインドされたバッファオブジェクトを効果的にアンバインドし、そのバッファオブジェクトターゲット(そのターゲットでサポートされている場合)のク​​ライアントメモリ使用率を復元します。バッファ・オブジェクト名および対応するバッファ・オブジェクトの内容は、現在のGLレンダリング・コンテキストの共有オブジェクト・スペースに対してローカルです。 2つのレンダリング・コンテキストは、適切なGLウィンドウ・インタフェース機能を介してコンテキスト間で明示的に共有を可能にする場合にのみ、バッファ・オブジェクト名を共有する。 参照:https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml

関連する問題