OpenGL のメイン インターフェイスについて疑問に思っていました。簡単に言うと、OpenGL DLL はどのようにグラフィックス関数を呼び出すのでしょうか? C++ には秘密の隠しレンダリング コードがありますか? DLL から GPU を呼び出すことができれば、どの C++ プログラムでも可能です。もしそうなら、自分のプログラム用に独自の API を作成できますか? または何?ここの誰かが知っていることを願っています。誰かがこの主題に光を当てることができますか? 前もって感謝します!
4 に答える
何よりもまず、最新の OpenGL はライブラリではなく、Windows では DLL にハードウェアと通信する OpenGL 実装が含まれていません。opengl32.dll は、ドライバーが低レベル関数 (ICD と呼ばれる) をフックするプレースホルダーとして機能するだけです。
ここで詳しく答えました:https://stackoverflow.com/a/6401607/524368
OpenGL DLL は、他のアプリケーション モジュールと同様に Ring 0 と通信し、DeviceIoControl
. これらの呼び出しに渡されるデータの正確な詳細は公開されておらず、変更される可能性はありません。GPU メーカーは、その情報を手放す気はありません。独自の API を作成することは可能ですが、ドライバーと対話するための詳細はすぐには入手できません。
一般的な意味での答えは「はい」ですが、実行可能にするためには、ある程度「ハードウェア依存」である必要があります。
一番下のレベルで「グラフィック関数」(OGLが基づいていると思われるもの)と呼ぶものは、ハードウェアが画像フレームをそれ自体に構造化し、プロセッサと通信する方法によって異なります。
単なるプレーン フレーム バッファであるハードウェアと、ベクトル シーンのラスタライズ プロセスを自分で管理できるハードウェアがあります。
平面の 2d ベクトルとイメージングのサポート (GDI など) または 3 次元モデリング システム (direc3d など) であるオペレーティング システム API があります。
OGL は単なる API です。一貫した一連の関数プロトタイプを定義して、タスク (3D シーンを記述) を達成します。renderimg プロセスは、使用するシステムの性質によって異なる DLL に実装されます。
それらの一部は、OS ネイティブ API を介して画面上でビットマップをブリットするための生データとして扱う独自のバッファーで動作するだけであり ( BitBlitを参照)、OGL 呼び出しを特定の op-code への特定の io- コードへの呼び出しに変換するものもあります。ハードウェア デバイスのポート。
OGL の普及により、ライブラリとデバイス間の「言語」を標準化するメーカーもあります。そのため、物事は見た目ほど「直線的」ではありません...
ハードウェア レジスタへの直接書き込みは、OpenGL やその他の標準化されたグラフィックス API が導入される前のグラフィックス プログラミングの方法でした。
一般的に言えば、書くのは悪夢であり、デバッグするのはほとんど不可能でした。高レベルの API が発明されたのには理由があります。
最近、ハードウェアに最も近いのはコンソールで、PC よりもはるかに低いレベルのアクセスしかありませんが、そのアクセスでさえ、以前よりも抽象化されています。
本当にやりたい場合はできますが、独自の OS も作成していない場合は、基本的に独自のドライバーを作成することになり、最新の GPU で公開されているドキュメントはあまり見つかりません。