SFML 混合模式用 alpha 插值颜色

SFML blending mode to interpolate colors with alpha

假设我有一个 C_1 = (255, 0, 0, 127) 填充 sf::Texture 和一个 sf::RenderTexture 填充 C_2 = (0, 0, 0, 0)。然后我打电话

render_texture.draw(texture);

sf::BlendAlpha 给出的结果是用 (127, 0, 0, 127) 填充的纹理,但我的目标(对于我正在编写的小型图形编辑器应用程序)是混合这两种颜色以获得 (255, 0, 0, 127),因为直觉上,在完全透明的纹理上绘图是“将画笔的颜色复制到它”。我检查了 sf::BlendAlpha 的公式,它似乎是这样工作的:

C_res = C_src * aplha_src + C_dst * (1 - alpha_src)

其中 C_srcC_1C_dstC_2。但是等等,它完全忽略了 aplha_dst 吗?

如果我对混合理解正确,我需要的公式类似于

alpha_sum = alppha_src + alpha_dst
C_res = C_src * alpha_src / alpha_sum + C_dst * alpha_dst / alpha_sum

它提供了足够的颜色并且不会忽略 alpha_dst。但是使用 SFML 的 BlendingMode,使用不同的 Factors 和 Equations,没有机会得到除法(这在处理 alpha_sum = 0 时也会带来麻烦)。关于我应该如何考虑混合颜色和绘画有什么建议吗?至少,我做对了吗,SFML 通常使用的 alpha 混合不是图形编辑器所做的? (在 Aseprite、Krita、Photoshop 上测试,它们将笔刷中的颜色混合到 (0, 0, 0, 0),如我所料)

我最终得到的解决方案:使用 glsl 编写自己的混合模式并使用着色器。这样您就可以创建和公式,而无需考虑如何将其引入 sfml,因为它已经支持着色器,可以轻松传递给任何绘制调用。