4

Windows での OpenGL 1.0 および 1.1 の関数ポインタの性質について少し混乱しています。私はそれを理解していると思いますが、100% 確信があるわけではないので、誰かが私の現在の理解を確認またはコメントできることを願っています:

現時点での私の理解では、 で 1.2+ 関数をロードすることになっていますwglGetProcAddress()が、その 1.0 および 1.1 関数は でロードする必要がありGetProcAddress()ますopengl32.dll。ただし、私の注意を引くのは、現在のコンテキストwglGetProcAddress()に応じて異なる関数ポインターを返すと思われることです。HGLRCしかし、おそらく 1.0 と 1.1 のポインターGetProcAddress()は常に同じです。この行動の不一致は異常に感じます。

では、複数のHGLRCオブジェクトがある状況があるとしましょう。それらAを and と呼びますB。を呼び出し、結果を 用とwglGetProcAddress()用の別々のポインター プールに保持します。しかし、1.0 と 1.1 の関数をこれらのポインター プールにロードする必要もあります。この場合、 と のポインターは常に同じになるようです。ABAB

驚いたことに、1.0 と 1.1 の関数は、OpenGL 呼び出しを現在の に関連付けられているドライバーにリダイレクトする薄いラッパーでなければなりませんHGLRC。しかし、そのようなリダイレクト メカニズムが既に Windows に実装されwglGetProcAddress()ている場合、コンテキスト依存のポインターを返す危険性が軽減されるため、なぜそれを使用できないのだろうかと思います。この問いに対する答えを知る必要は必ずしもないのですが、その問いの存在そのものが、そもそも私が物事を正しく理解しているかどうか疑問に思わせるものです。

4

1 に答える 1

4

この理由は単純です。OpenGL-1.1 のシンボルは固定セットであるため、インターフェイス DLLopengl32.dllにはフォールバック実装と、グラフィックス ドライバー (ICD) によって提供される本格的な OpenGL 実装へのトランポリンの両方を含めることができます。これらのシンボルは、インターフェイス DLL によってシンボル テーブルに公開されるため、GetProcAddress.

バージョン OpenGL-1.2 を超えるものは、インターフェイス ライブラリには認識されません。したがってopengl32.dll、これらの関数の ICD へのフォールバックもトランポリンも含まれていません。wglGetProcAddress代わりに、呼び出しをグラフィックス ドライバー (ICD) の実際の OpenGL 実装に渡すプロキシとして機能します。ただし、さまざまな OpenGL コンテキストがさまざまなグラフィックス ドライバー (ICD) によって提供される可能性があるため、結果はさまざまなアドレスに存在するシンボルになる可能性があります。wglGetProcAddress一部の DLL のシンボル テーブルを参照しませんが、ICD が適合すると判断したものは何でも実装できます。

于 2014-08-09T02:02:22.890 に答える