私が尋ねた質問が、探している答えを得るのに最適な形式ではない場合に備えて、私の全体的な目標について説明します。X 軸を中心に回転する単語または「単語ボール」の球体があります。単語が後ろに回転するにつれて (Z 座標は -1 から 1、前から後ろに移動します)、各単語のサイズと不透明度を変更して、「前」の単語が 100% 不透明でフルサイズの単語になるようにします。後ろは小さく、やや透明です。私はこれをまっすぐな Delphi コードで行い、Direct3D などを避けたいと思います。回転コードは既に正常に動作しています。Z 座標ベースの知覚シェーディングのアイデアを実装するだけです。
単語ボールを作成するとき、単語ごとに TImage コンポーネントを動的に作成します。TCanvas.TextOut() メソッドを中央に配置して、単語を TImage ビットマップに「出力」します。BitBlt を使用して、そのビットマップをメイン Canvas 内の単語ボールを保持する正しい場所にコピーするつもりです。BitBlt は高速で、オンザフライでビットマップのサイズを変更できるため、私の知覚シェーディング操作の要件の 1 つを満たしています。
しかし、アルファブレンディングを容易にする最善の方法がわかりません。Windows には AlphaBlend() 呼び出しがあることを知っており、使用するのはかなり簡単です。しかし、アルファ チャネルを持つ単語ごとの TImage コンポーネントのコピーであるビットマップを作成する方法を知る必要があります。私の場合、Z座標に基づいて単語全体に不透明度を均一に適用したいので、ビットマップ全体のアルファチャンネルの値は均一になることに注意してください。
TCanvas.TextOut() を使用して作成されたビットマップを持つ動的に作成された TImage コンポーネントには、アルファ チャネルがありますか? そうでない場合、AlphaBlend() 呼び出しに渡されるアルファ チャネルを持つ TImage ビットマップのコピーをリアルタイムで作成または作成するにはどうすればよいですか? これをすべて行うためのより良い方法があれば、私に知らせてください。