まず、C++ を使い始める場合は、Visual C++ のような Windows 固有のコンパイラから始めないでください。eclipse やcode::blocksなどのコンパイラが付属する優れたクロスプラットフォーム IDE を入手してください。他のプロジェクトと同様に、段階的に完了できる小さなタスクに分割する必要があります。いくつかのハードルがあるようですね。
- C++ の知識の欠如 (私たちはかつてここにいました)
- 画像に関する知識の欠如 (非常に一般的な苦痛)
- 経験の欠如(私たちはこれに取り組みます)
他の人に落胆させないでください。あなたはこれを行うことができ、おそらくあなたが考えているよりも速いでしょう。C++ に関する本を 1 冊か 2 冊読んでください。あまり知らなくても 1 つのプロジェクトをこなすことができますが、しばしばイライラすることになります。プロジェクトを一連の小さな目標に分割しましょう。それぞれの目標を達成するにつれて、C++ に対する自信が高まります。
- 画像ブレンディング
- マルチモニターをサポートする Windows スクリーン セーバー
- スクリーン キャンバス (directx、opengl、ビットマップ?)
- タイマー
まず、画像ブレンディングの問題を見てみましょう。問題の画像を、アクティブなウィンドウの背景に「フェード」したいと思うでしょう。無地の背景を使用する場合は、キャンバスを更新するたびに問題の画像のアルファ透明度を変更するだけで済みます。基本的に、リフレッシュ タイマーに基づいて、2 つの画像の各ピクセルのカラー値を平均する必要があります。より直接的には、結果のピクセル (P3) の赤、緑、および青のピクセル要素を見つけます。
N = 間隔ごとのタイマー ティック (秒/ミリ秒など)
T = この間隔で発生したティック
P1r = 画像 1 の
赤のピクセル要素 P2r = 画像 2
の赤のピクセル要素 P3r = ブレンドされた画像の結果の赤のピクセル要素
P1g = 緑のピクセル画像 1 の要素
P2g = 画像 2 の緑のピクセル要素
P3g = 合成画像の合成緑ピクセル要素
P1b = 画像 1
の青ピクセル要素 P2b = 画像 2
の青ピクセル要素 P3b = 合成画像の合成青ピクセル要素
P3r = ((T/N * P1r) + ((N-T)/N * P2r))/2
P3g = ((T/N * P1g) + ((N-T)/N * P2g))/2
P3b = ((T/N * P1b) + ((N-T)/N * P2b))/2
ここで、Windows スクリーン セーバーとマルチ モニター サポートの問題を見てみましょう。これらは実際には 2 つの別個の問題です。Windows スクリーンセーバーは、実際には、特定のコールバック関数を使用してコンパイルされた通常の .exe ファイルのみです。スクリーンセーバー機能の設定に関するチュートリアルは、ネット上にたくさんあります。マルチモニターのサポートは、次に説明する Screen Canvas をセットアップするときに実際に問題になります。
スクリーン キャンバスとは、プログラムがビジュアル データを出力する領域を指しています。すべての画像レンダリング アプリまたはチュートリアルは、基本的にこの同じ概念を参照します。これが特に興味深いと思われる場合は、コンピューター ビジョンの大学院プログラムまたは学習コースを検討してください。後悔しないと信じてください。いずれにせよ、アプリの基本的な性質を考慮すると、openGL や DirectX を使用しないことをお勧めします。これは、それぞれにアプリ固有の知識の層があり、それらが役立つ前に取得する必要があるためです。一方、ダブル バッファリングや GPU オフロードなどの組み込みの 3D 機能が必要な場合は、openGL を使用します (よりプラットフォームに依存しません)。楽しい画像ライブラリもたくさんあります。
マルチ モニターのサポートに関しては、これは難しい問題ですが、複雑ではありません。基本的には、複数のモニターのジオメトリに一致するようにキャンバスの境界 (画面の境界) を設定するだけです。同じ解像度の複数のモニターでは問題にならないはずですが、モニターの解像度が一致しないと扱いにくくなる可能性があります (キャンバス領域が画面に表示されないなど)。これらの問題にはよく知られたアルゴリズムと回避策がありますが、おそらくこれは範囲外です。この質問の。
最後に、必要なタイマーに関しては、これが最も簡単な部分です。Windows と Linux は独自の奇妙な方法で時間を処理します (なぜ MS は STRPTIME を実装しないのですか)。移植性に関心がある場合は、サードパーティのライブラリを使用します。それ以外の場合は、Windows の settimer() 基本機能を使用して、画像をコールバック関数でレンダリングします。
高度なトピック: まだ読んでいるのであれば、このプログラムに加えることができる興味深いアルゴリズムの改良点がいくつかあります。たとえば、タイマーが 1 秒ごとに設定された量をオフにすると、最初のいくつかのブレンドされた画像をキャッシュして、処理時間を節約できます (私たちの目は、色のグラデーションの変化を区別するのが苦手です)。openGL を使用している場合は、ブレンドされた画像のセットをディスプレイ リストとしてキャッシュできます (グラフィック カード メモリをすべて使用する必要がありますか?)。楽しいこと、頑張ってください!