未定義の数の表示コンテキストがあり、それぞれにテクスチャが表示されます。glGenTextures を呼び出すと、すべてのディスプレイ コンテキストで同じ名前が返されます。これは機能しますか?それらは同じ名前を持っていますが、異なるテクスチャを保存して表示しますか? そうでない場合、これを回避するために何をすべきですか?
3 に答える
テクスチャは (デフォルトでは) コンテキスト間で共有されません。これを明示的に有効にする必要がありますが、その方法はプラットフォーム固有です。
win32 では でwglShareLists
あり、他のほとんどのプラットフォームでは、コンテキストを作成するときに指定されます (たとえば、OS-X ではshare
to パラメーターを使用)。aglCreateContext
glGenTexture から同じ名前を取得することと、同じテクスチャを表示することは同じではありません。
テクスチャ名は、コンテキストの裁量による単なる整数であり、通常は 1 から始まり、glGenTexture ごとにインクリメントされますが、必ずしもそうとは限りません。実装はそのように機能する必要はありません (ただし、ほとんどの場合)。ただし、理論的には、多かれ少なかれ「乱数」を取得することもできます。たとえば、任意の種類のオブジェクト (つまり、テクスチャだけでなく、バッファーやシェーダーも) に対して増加する整数、または 32 ビット ポインター アドレスでさえも取得できます。ドライバーのアドレス空間、またはその他の難解なもの。名前が特定のものでなければならないという要件はありません。
従来の OpenGL では、glGenTexture を使用する代わりに独自の名前を作成することもできましたが、それは現在では合法ではありません。それが許可されたときに彼らが何を考えていたのかはわかりませんが、とにかく... :)
異なるコンテキストの同じ番号 (名前) は、通常、異なるテクスチャであるか、テクスチャがまったくない可能性があります。そのため、同じテクスチャ名を持つ別のコンテキストで同じテクスチャが表示される場合は、コンテキストを共有しているか、ドライバーにバグがあります。
wglCreateContextAttribsARB を使用する場合、2 番目のパラメーターは既存のコンテキストのハンドル (または null) であることに注意してください。ここでコンテキスト ハンドルを指定すると、glShareLists を明示的に呼び出さなくてもコンテキストを共有できます。たぶんそれは偶然に起こったことです。
私の知る限り、テクスチャ共有を有効にしていません。ただし、同じテクスチャがすべてのディスプレイ コンテキストで表示されています。