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_src
是 C_1
,C_dst
是 C_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,因为它已经支持着色器,可以轻松传递给任何绘制调用。
假设我有一个 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_src
是 C_1
,C_dst
是 C_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,因为它已经支持着色器,可以轻松传递给任何绘制调用。