次の関数は、opengl32.dll と gdi32.dll の間で重複しています。
[opengl32.dll] / [gdi32.dll]
wglChoosePixelFormat / ChoosePixelFormat
wglDescribePixelFormat / DescribePixelFormat
wglGetPixelFormat / GetPixelFormat
wglSetPixelFormat / SetPixelFormat
wglSwapBuffers / SwapBuffers
私は長い間答えを探してきましたが、それがなぜなのか、正確な違いは何かという具体的な情報を誰も持っていないようです.
OpenGL FAQのセクション 5.190 は、これらの関数が機能的に同一ではないことを示唆しています。
OpenGL が正しく動作するようにするには、相当する wgl の wglChoosePixelformat、wglDescribePixelformat、wglGetPixelformat、wglSetPixelformat、および wglSwapBuffers の代わりに、ChoosePixelformat、DescribePixelformat、GetPixelformat、SetPixelformat、および SwapBuffers を使用します。それ以外の場合はすべて、可能な場合は wgl 関数を使用します。5 つの wgl 関数の使用は、OpenGL ドライバーにランタイム リンクする開発者にとってのみ重要です。
「OpenGL ドライバーへのランタイム リンク」は、opengl32.dll をバイパスして ICD を直接ロードすることを意味しますか?
"Mesa3D does not like my context creation code"という名前のスタック オーバーフロー スレッドは、これを強化しているようです。
C# では失敗するがマネージ C++ では失敗する wglCreateContextという名前の別のスタック オーバーフロー スレッドは、GDI 関数を使用するときに gdi32.dll の前に opengl32.dll をロードする必要があることを示唆しています。
私自身のテストでは、これらの関数の opengl32/wgl バージョンが呼び出されると、一部のシステム (Nvidia、ただし Intel または Parallels VM ではない)で「エラー: 2000」が発生することが示されています。GDI バージョンに変更すると、この問題は解消されますが、LoadLibrary("opengl32.dll") を使用しても何も変わらないようです。
これらの WGL 関数と GDI 関数の違いを調査した人はいますか? なんらかの違いがあることは明らかです。どのバージョンをどの状況で使用する必要があるか、間違ったバージョンを使用した場合の潜在的な落とし穴は何かを理解しようとしています。
編集: wayback machineは、ICD の直接読み込みがどのように機能するかを説明する Web ページを表示します。これは、2D アクセラレータと 3D アクセラレータが別々の ICD (通常の opengl32.dll+ICD メカニズムでは処理できない) を備えた 2 つの異なるハードウェアであった Voodoo 1/2 時代に明らかに必要でした。これが直接のICDです。
ただし、以下の投稿は、AMD ICD が wgl バリアントをエクスポートしないことを示しており、この考えと矛盾しています。
この知識の鍵を握っている誰かまたはどこかがそこにいるに違いありません。
編集 2: 上記の Web ページから、これまでで最も明確な提案が得られました。
「したがって、opengl32.dll という名前の OpenGL ドライバーを使用している場合は 、GDI 関数を呼び出す必要があります。opengl32.dll という名前のドライバーを使用していない場合は、GDI 関数を呼び出してはなりません。」
しかし、これは、AMD ICD が wgl 関数をエクスポートしないという事実とどのように適合するのでしょうか?
編集 2: ここで見られるように、明らかに Mesa3d は WGL シンボルをエクスポートします: http://cgit.freedesktop.org/mesa/mesa/tree/src/mesa/drivers/windows/gdi
Mesa3d は ICD として使用することを想定していないため、これは理にかなっています。これは、上にリンクされた Mesa3d スレッドのパターンに適合します。これらの呼び出しは Microsoft の opengl32.dll を介してルーティングされていないため、gdi 関数は失敗しますが、Mesa3d は wgl* 関数をエクスポートしているため、これらは引き続き機能します。ただし、これは Mesa3d に固有のものです。AMD の ICD を直接使用しようとすると、その方法は失敗します。