【问题标题】:SFML blending mode to interpolate colors with alphaSFML 混合模式用 alpha 插入颜色
【发布时间】: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_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,使用不同的因子和方程,没有机会得到除法(这在处理 alpha_sum = 0 时也会带来麻烦)。关于我应该如何考虑混合颜色和绘画的任何建议?至少,我说对了吗,SFML 使用的通常的 alpha 混合不是图形编辑器所做的吗? (在 Aseprite、Krita、Photoshop 上进行了测试,它们将笔刷中的颜色混合到 (0, 0, 0, 0) 上,正如我所料)

【问题讨论】:

    标签: c++ colors sfml alphablending blending


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-12
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多