【发布时间】:2021-12-15 02:30:41
【问题描述】:
假设我有一个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,使用不同的因子和方程,没有机会得到除法(这在处理 alpha_sum = 0 时也会带来麻烦)。关于我应该如何考虑混合颜色和绘画的任何建议?至少,我说对了吗,SFML 使用的通常的 alpha 混合不是图形编辑器所做的吗? (在 Aseprite、Krita、Photoshop 上进行了测试,它们将笔刷中的颜色混合到 (0, 0, 0, 0) 上,正如我所料)
【问题讨论】:
标签: c++ colors sfml alphablending blending