画面に特定の効果を直接追加したいと思います(最初はubuntu 12.04で)。たとえば、(たとえば)すべての画面をリアルタイムでぼかすことができるC ++デーモンをコーディングしたいと思います。マウスを動かしたり、テキストを読んだり、インターネットを閲覧したりできるはずですが、すべてがぼやけています。タスクはスクリーンバッファにアクセスして変更する必要があることを読みました。本当 ?OpenGL を使用して間違った方法を探していますか?
2 に答える
Compizなどの合成マネージャーを使用する必要があります。Compizは、OpenGLを介してすべての描画を再ルーティングし、あらゆる種類の凝ったことを実行できるようにします。
たとえば、Ubuntuに同梱されているものを使用すると、雨滴が画面に落ちる可能性があります。これは、Compiz設定マネージャーでオンにできます。
ただし、OpenGLを初めて使用する場合は、これに飛び込むことはお勧めしません。最初に基本的なドローコールについて学び、次にシェーダーに取り組みます。また、Xについても学ぶ必要があるかもしれません。
画面に特定の効果を直接追加したいと思います(最初はubuntu 12.04で)。たとえば、(たとえば)すべての画面をリアルタイムでぼかすことができるC ++デーモンをコーディングしたいと思います。マウスを動かしたり、テキストを読んだり、インターネットを閲覧したりできるはずですが、すべてがぼやけています。
これはコンポジション効果と呼ばれ、通常はコンポジターのプラグインとして実装されます。
タスクはスクリーンバッファにアクセスして変更する必要があることを読みました。
最新の OS では、スクリーンバッファに直接アクセスできません。したがって、これは機能しません。
本当?
いいえ、または実際には非常に不正確です。
OpenGL の使用方法が間違っていますか?
いいえ、あなたは正しい方向を見ています。
説明させてください: 昔は、画面はすべてのアプリケーションが共有する 1 つの大きなフレームバッファで構成されていました。ただし、アプリケーションを相互に保護するために、そのフレームバッファに直接アクセスすることはできません。代わりに、Linux の場合は伝統的に X11 (現在開発中の別のシステムがありますが、率直に言って、私はその設計が非常に嫌いです)、Windows では GDI、MacOS X では Quartz であるグラフィック/ウィンドウ システムを使用します。
グラフィックス システムは、ウィンドウへの描画操作がスクリーン バッファーの適切な場所に配置され、ウィンドウ ジオメトリや画面上の他のウィンドウによって適切に切り取られ、遮られるように注意を払いました。ウィンドウのサイズが変更されるか、以前に遮られていた部分が表示されるたびに、それらの部分を再描画するためにメッセージが送信されました。ウィンドウを移動するだけでも、バッファー内ビットブリッティングによって実装できます。
最新の GPU とそのローカル フレームバッファー メモリ モデルの出現により、この古いウィンドウ管理方法は時代錯誤になりました。これで、各ウィンドウに独自の独立したフレームバッファーを与えることができます。ウィンドウのサイズが変更された場合にのみ、強制的な再描画が必要になります。Windows のコンテンツに損傷を与えるオクルージョンはなくなりました。
しかし、このモデルが機能するためには、ウィンドウの内容を含む個々の個別のフレームバッファを取得し、それらをスクリーンバッファ上の単一の画像に合成して、ユーザーに提示するプログラムが必要です。これはコンポジターによって行われます。また、合成は利用可能な描画 API で発生する可能性があるため、OpenGL を使用してクレイジーな効果を適用することもできます。