「makeContextCurrent」は正確に何をしますか?


12

私はその機能についてかなり混乱しています。GLFWコンテキストリファレンスは次のように述べています。

この関数は、指定されたウィンドウのOpenGLまたはOpenGL ESコンテキストを呼び出し側スレッドの現在のコンテキストにします。コンテキストは、一度に1つのスレッドでのみ最新にすることができ、各スレッドは一度に1つの現在のコンテキストのみを持つことができます。

しかし、それは私にはあまり役に立ちません。メソッドの
ように機能しglBind-ますか?(glBindBuffer、glBindVertexArrayなど)

回答:


19

OpenGLは状態マシンです。OpenGLコンテキストはその状態を保持します。状態には、どのテクスチャがどのテクスチャユニットにバインドされているか、現在のFBOが持っているアタッチメントなどの情報が含まれています。

現在のコンテキストを設定すると、すべての状態が古いコンテキストから新しいコンテキストに切り替わります。次に例を示します。

glfwMakeContextCurrent(window1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture1);

glfwMakeContextCurrent(window2);

これが行うことは、コンテキストをwindow1最新のものにすることです。次に、2Dテクスチャユニットを有効にしてバインドtexture1します。

次に、window2現在のコンテキストを作成します。有効状態を確認GL_TEXTURE_2Dすると、falseになります(以前にwindow2コンテキストで有効にしていない場合)。同様に、2Dテクスチャユニットにバインドされているテクスチャを確認すると、バインドされているテクスチャがないか、バインドされていないテクスチャが見つかる可能性がありますtexture1

基本的に、すべての描画は現在のコンテキストで行われます。別のコンテキストを現在にすると、すべての描画がそのコンテキストで行われるようになります。

マルチスレッドのOpenGLアプリケーションでは、スレッドごとに単一のコンテキストを持つのが一般的です。このようにして、各スレッドは独自のコンテキストに描画し、他のスレッドのコンテキストの状態を台無しにしません。


1
私は15点以下のスコアポイントしか持っていないので、あなたの素晴らしい答えに投票することはできません。ありがとう!!!
エイドリアン

1
心配ない。お役に立てて嬉しいです。
user1118321 2017年

私はこのコメントを読んだので、コンピュータグラフィックスに参加し、この回答に賛成しました。
Jマディソン2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.