10

OpenGL と DirectX がグラフィック カードでどのように機能するかを理解しようとしています。

三角形を実行する OpenGL でプログラムを作成し、同じことを DirectX で別のプログラムを作成した場合、GPU 側では正確にどうなりますか?

プログラムを実行すると、OpenGL ライブラリへのすべての呼び出しと DirectX ライブラリへのすべての呼び出しで GPU 用のコードが生成され、2 つのプログラムから生成される GPU のマシン コードは同じになりますか? (DirectX と OpenGL がプリコンパイルされた Java Bytecode のようなものである場合、実際に実行すると同じ結果が生成されます)

または、GPU には 2 つの異なる命令セットがあり、それぞれに 1 つずつありますか。つまり、GPU の正確な OpenGL と DirectX とは何ですか? 2 つの API の違いをどのように行うことができますか?

これはプログラマーの観点からのみ異なるのですか?

4

1 に答える 1

8

私はすでにここでそれらに答えましたWindowsでは、OpenGLはDirectXとどのように異なりますか?

答えの1つの完全な引用は次のとおりです


OpenGL 自体は単なるフロント エンド API であるため、この質問に答えるのはほとんど不可能です。実装が仕様に準拠し、結果がこれに準拠している限り、任意の方法で実行できます。

質問は次のようなものかもしれません: OpenGL ドライバーは最下位レベルでどのように機能しますか。ドライバーはハードウェアの一部と密接に結びついており、開発者が設計したように動作する可能性があるため、これも一般的に答えることは不可能です。

したがって、質問は、「OpenGL とグラフィックス システムの舞台裏で、平均してどのように見えるか?」であるはずでした。これを下から見てみましょう。

  1. 最下位レベルにはグラフィックス デバイスがあります。現在、これらは GPU であり、操作を制御する一連のレジスタ (正確にはデバイスに依存するレジスタ) を提供し、シェーダー用のプログラム メモリ、入力データ (頂点、テクスチャなど) 用の大容量メモリ、および残りへの I/O チャネルを備えています。データおよびコマンド ストリームを送受信するシステムの

  2. グラフィックス ドライバーは、GPU の状態と、GPU を使用するすべてのリソース アプリケーション プログラムを追跡します。また、アプリケーションから送信されたデータの変換またはその他の処理も担当します (テクスチャを GPU でサポートされているピクセル形式に変換し、GPU のマシン コードでシェーダーをコンパイルします)。さらに、アプリケーション プログラムへの抽象的でドライバー依存のインターフェイスを提供します。

  3. 次に、ドライバー依存の OpenGL クライアント ライブラリ/ドライバーがあります。Windows では、これは opengl32.dll を介してプロキシによってロードされます。Unix システムでは、これは次の 2 つの場所にあります。

    • X11 GLX モジュールとドライバーに依存する GLX ドライバー
    • および /usr/lib/libGL.so には、直接レンダリング用のドライバー依存のものが含まれている場合があります

    MacOS X では、これはたまたま「OpenGL フレームワーク」です。

    (2) で説明されているドライバーの部分で、OpenGL 呼び出しをドライバー固有の関数の呼び出しに変換するのは、この部分です。

  4. 最後に、実際の OpenGL API ライブラリ (Windows では opengl32.dll、Unix では /usr/lib/libGL.so)。これはほとんどの場合、コマンドを適切な OpenGL 実装に渡すだけです。

実際の通信がどのように行われるかは一般化できません。

Unix では、3<->4 接続は、ソケット (そうです、必要に応じてネットワークを経由します) または共有メモリを介して行われます。Windows では、インターフェイス ライブラリとドライバー クライアントの両方がプロセス アドレス空間に読み込まれるため、通信はそれほど多くなく、単純な関数呼び出しと変数/ポインターの受け渡しだけです。MacOS X では、これは Windows と似ていますが、OpenGL インターフェイスとドライバ クライアントが分離されていない点だけです (これが、MacOS X が新しい OpenGL バージョンに追いつくのが非常に遅い理由です。新しいバージョンを提供するには、常にオペレーティング システムの完全なアップグレードが必要です)。フレームワーク)。

3<->2 間の通信は、ioctl、読み取り/書き込み、または一部のメモリをプロセス アドレス空間にマッピングし、そのメモリへの変更が行われるたびに一部のドライバ コードをトリガーするように MMU を構成することによって行われます。これは、カーネル/ユーザーランドの境界を常に越える必要があるため、どのオペレーティング システムでも非常に似ています。最終的には、何らかのシステムコールを通過します。

システムと GPU の間の通信は、周辺バスとそれが定義するアクセス方法 (ポート I/O、メモリ マップド I/O、DMA、IRQ を介して動作する PCI、AGP、PCI-E など) を介して行われます。

于 2012-06-07T06:10:56.250 に答える