1

グラフィカル ユーザー インターフェイスは、そのカーテンの下に謎のメカニズムを隠しています。2D と 3D のコンテキストが 1 つの画面に混在し、これら 2 つのまったく異なる世界をシームレスに構成できます。しかし、実際にはどのような方法で、どのレベルでインターリーブされているのでしょうか?

実際には、OpenGL コンテキストを 2D ウィジェット ライブラリに埋め込むことができるため、2D インターフェイス全体を OpenGL でサポートできることが示されています。また、ハードウェア アクセラレーションを調査するアプリケーションもあれば、そうでないアプリケーションもあります (同じ画面にレンダリングされている間)。グラフィック カードは画面上の 2D および 3D 領域を「認識」しており、ウィンドウ マネージャはフロントエンドがまとまっているという錯覚を作り出していますか? ...たとえば、Web ページをスクロールしたり、ビデオ プレーヤーを画面上で動かしたりすると、加速されたウィンドウ (3D、ビデオ) が 2D インターフェイスに収まるように「ホッピング」することに気付くことがあります。

質問は些細なことのように思えますが、包括的な答えを教えてくれる人に会ったことがありません。OpenGL コンテキストを GTK+ アプリケーションに埋め込み、それがどのように機能しているかを理解できるようにする答え。GtkGlExt と GLUT を試しましたが、トピックを深く理解し、アカデミック プロジェクトの一環として独自のソリューションを作成したいと考えています。X、GLX、GTK、OpenGL、およびウィンドウ マネージャの関係と、このライブラリのネットワークを調べて意識的にプログラミングする方法を知りたいです。

誰かがここに論文を書くとは思っていませんが、そのトピックに関する指摘、提案、または記事へのリンクがあれば感謝します。

4

1 に答える 1

7

あなたは非常に複雑すぎることを考えています。GTK+ や Qt などのツールキットは、何かにかなりの抽象化レイヤーを追加します。これは実際にはかなり単純です。システムのグラフィックス デバイスは、プロセッサとそれが動作するメモリで構成されています。最も単純なケースでは、プロセッサは通常のシステム CPU であり、メモリは通常のシステム メモリです。ただし、最新のコンピューターには、独自の高帯域幅メモリを備えた専用グラフィックス プロセッサ (GPU) が搭載されています。

メモリにはフレームバッファが保持されます。論理的には、フレームバッファは値の 2D 配列です。GPU は、特定の方法でフレーム バッファ内の値を処理するようにプログラムできます。これは、フレームバッファへの描画に使用できます。画像を表示するモニターは、メモリ内の特定のフレームバッファのデータを画面に継続的に供給する特別な回路に接続されています (通常は RAMDAC または CRTC と呼ばれます)。そのため、GPU のメモリには、画面に直接送信されるフレーム バッファがあります。そこに絵を描くと、画面に物が現れます。

X11サーバーのようなプログラムは、グラフィックプリミティブを描画するためにGPUをプログラムする方法を「知っている」ドライバーをロードできます。X11 自体が特定のグラフィックス プリミティブを定義しており、拡張モジュールはさらにそれらを追加できます。X11 自体は、GPU メモリ上のフレームバッファを Drawables と呼ばれる論理領域に分離することを可能にします。オンスクリーン フレーム バッファ上のドローアブルは、Windows と呼ばれます。論理ウィンドウは重複する可能性があるため、X サーバーは Z スタッキングも管理します。これは、再描画のために Windows をソートするために使用されます。クライアントが何らかの Window に描画しようとするたびに、X11 サーバーが GPU に、その描画操作はフレームバッファーのピクセルのみを変更し、描画先の Window が表示されていることを伝えます (これは「ピクセル所有権テスト」と呼ばれます)。X11 サーバーは、Drawables も作成します (つまり、画面上のフレームバッファ メモリ領域の一部ではないフレームバッファ)。これらは、X11 用語では PBuffers または Pixmaps と呼ばれます (また、特別な拡張により、ウィンドウを画面外に移動することもできます)。

ただし、これらの Drawables はすべて単なるメモリです。技術的には、これらは何かを描画するキャンバスです。これは「グラフィックプリミティブ」と呼ばれるものです。X11 自体は、X コアという名前の特定のセットを提供します。また、X コアにはないプリミティブを提供する XRender と呼ばれる事実上の標準拡張もあります。ただし、X11 コアも XRender も、3D 描画の印象を生成できるグラフィックス プリミティブを提供しません。そのため、GLX と呼ばれる別の拡張機能があり、X11 サーバーに別のグラフィックス プリミティブのセット、つまり OpenGL の形式を教えます。

ただし、X コア、XRender、および GLX/OpenGL はすべて、同じ種類の Canvas、つまり X11 によって管理される単純なフレームバッファで動作する異なるペン、ブラシ、および鉛筆です。

それでは Qt や GTK+ のようなツールキットは何をするのでしょうか? X11 と X11 が提供するグラフィックス プリミティブを使用して、X11 が認識していないボタン、メニューなどのウィジェットを実際に描画します。

于 2013-08-01T23:42:49.650 に答える