1

OpenGL のメイン インターフェイスについて疑問に思っていました。簡単に言うと、OpenGL DLL はどのようにグラフィックス関数を呼び出すのでしょうか? C++ には秘密の隠しレンダリング コードがありますか? DLL から GPU を呼び出すことができれば、どの C++ プログラムでも可能です。もしそうなら、自分のプログラム用に独自の API を作成できますか? または何?ここの誰かが知っていることを願っています。誰かがこの主題に光を当てることができますか? 前もって感謝します!

4

4 に答える 4

2

何よりもまず、最新の OpenGL はライブラリではなく、Windows では DLL にハードウェアと通信する OpenGL 実装が含まれていません。opengl32.dll は、ドライバーが低レベル関数 (ICD と呼ばれる) をフックするプレースホルダーとして機能するだけです。

ここで詳しく答えました:https://stackoverflow.com/a/6401607/524368

于 2013-04-21T08:00:58.767 に答える
2

OpenGL DLL は、他のアプリケーション モジュールと同様に Ring 0 と通信し、DeviceIoControl. これらの呼び出しに渡されるデータの正確な詳細は公開されておらず、変更される可能性はありません。GPU メーカーは、その情報を手放す気はありません。独自の API を作成することは可能です、ドライバーと対話するための詳細はすぐには入手できません。

于 2013-04-21T07:54:05.520 に答える
1

一般的な意味での答えは「はい」ですが、実行可能にするためには、ある程度「ハードウェア依存」である必要があります。

一番下のレベルで「グラフィック関数」(OGLが基づいていると思われるもの)と呼ぶものは、ハードウェアが画像フレームをそれ自体に構造化し、プロセッサと通信する方法によって異なります。

単なるプレーン フレーム バッファであるハードウェアと、ベクトル シーンのラスタライズ プロセスを自分で管理できるハードウェアがあります。

平面の 2d ベクトルとイメージングのサポート (GDI など) または 3 次元モデリング システム (direc3d など) であるオペレーティング システム API があります。

OGL は単なる API です。一貫した一連の関数プロトタイプを定義して、タスク (3D シーンを記述) を達成します。renderimg プロセスは、使用するシステムの性質によって異なる DLL に実装されます。

それらの一部は、OS ネイティブ API を介して画面上でビットマップをブリットするための生データとして扱う独自のバッファーで動作するだけであり ( BitBlitを参照)、OGL 呼び出しを特定の op-code への特定の io- コードへの呼び出しに変換するものもあります。ハードウェア デバイスのポート。

OGL の普及により、ライブラリとデバイス間の「言語」を標準化するメーカーもあります。そのため、物事は見た目ほど「直線的」ではありません...

于 2013-04-21T08:00:22.490 に答える
0

ハードウェア レジスタへの直接書き込みは、OpenGL やその他の標準化されたグラフィックス API が導入される前のグラフィックス プログラミングの方法でした。

一般的に言えば、書くのは悪夢であり、デバッグするのはほとんど不可能でした。高レベルの API が発明されたのには理由があります。

最近、ハードウェアに最も近いのはコンソールで、PC よりもはるかに低いレベルのアクセスしかありませんが、そのアクセスでさえ、以前よりも抽象化されています。

本当にやりたい場合はできますが、独自の OS も作成していない場合は、基本的に独自のドライバーを作成することになり、最新の GPU で公開されているドキュメントはあまり見つかりません。

于 2013-04-21T08:07:07.823 に答える