我将描述我的总体目标,以防我提出的问题不是获得我正在寻找的答案的最佳形式。我有一个围绕 X 轴旋转的词球或“词球”。随着单词向后旋转(Z 坐标从 -1 到 1,从前到后),我打算更改每个单词的大小和不透明度,以便“前面”中的单词是 100% 不透明和全尺寸的,而单词背面较小且有些透明。我宁愿使用直接的 Delphi 代码来执行此操作,并避免使用 Direct3D 等。我已经让旋转代码工作正常。我只需要实现我的基于 Z 坐标的感知着色想法。
当我创建单词球时,我会为每个单词动态创建一个 TImage 组件。我使用 TCanvas.TextOut() 方法以居中的方式将单词“打印”到 TImage 位图。我打算使用 BitBlt 将该位图复制到包含单词球的主 Canvas 中的正确位置,因为 BitBlt 速度很快并且可以即时调整位图的大小,满足我的感知着色操作的要求之一。
但我不知道促进 Alpha 混合的最佳方法。我知道 Windows 有 AlphaBlend() 调用,而且使用起来相当简单。但我需要知道如何创建一个位图,它是具有 alpha 通道的每字 TImage 组件的副本。请注意,在我的情况下,整个位图将具有统一的 alpha 通道值,因为我希望根据 Z 坐标将不透明度统一应用于整个单词。
使用 TCanvas.TextOut() 制作的位图动态创建的 TImage 组件是否具有 Alpha 通道?如果没有,我如何创建一个,或者实时创建一个 TImage 位图的副本,该位图确实有一个要传递给 AlphaBlend() 调用的 Alpha 通道?如果有更好的方法来完成这一切,请告诉我。