3

GDIPlus 混合函数使用 alpha 位图的预乘 rgb 通道来提高效率。然而,通过 alpha 进行预乘是非常昂贵的,因为您必须逐个处理每个像素。

它似乎是 SSE 组装的一个很好的候选者。这里有人想分享它的实现吗?我知道这是一项艰苦的工作,所以这就是我问的原因。我不是想偷你的工作。如果可以的话,你会得到我所有的考虑来分享这个。

编辑:我不想通过软件进行 alpha 混合。我正在尝试将图像中每个像素的每个颜色分量与其 alpha 预乘。我这样做是因为 alpha 混合是通过以下公式完成的:dst=src src.alpha+dst (1-dst.alpha) 但是 AlphaBlend Win32 函数确实实现了 dst=src+dst(1-dst.alpha)优化原因。要获得正确的结果,您需要在调用 AlphaBlend 之前 src 等于 src*src.alpha。

因为我对汇编知之甚少,所以我会花一些时间来写,所以我问是否有人愿意分享它的实现。SSE 会很棒,因为在论文中,软件 alpha 混合的增益是 300%。

4

3 回答 3

2

有一篇很好的文章在这里找到。它有点旧,但您可能会在它使用 MMX 实现 alpha 混合的部分中找到一些有用的东西。这可以很容易地转换为 SSE 指令以利用更大的寄存器大小(128 位)

MMX 增强的 Alpha 混合

英特尔应用笔记在这里,带有源代码

使用 MMX™ 指令实现 Alpha 混合

于 2009-04-17T09:58:34.547 回答
0

您可能想看看Eigen C++ 模板库。它允许您使用使用优化的汇编器并支持 SSE/Altivec 的高级 C++ 代码。

快速地。(见基准)。
表达式模板允许在适当的时候智能地删除临时变量并启用惰性求值——Eigen 会自动处理这一点并在大多数情况下也处理别名。对 SSE(2 和更高版本)和 AltiVec 指令集执行显式矢量化,并优雅地回退到非矢量化代码。表达式模板允许对整个表达式全局执行这些优化。使用固定大小的对象,可以避免动态内存分配,并且在有意义时展开循环。对于大型矩阵,需要特别注意缓存友好性。

优雅的。(参见 API 展示)。
由于表达式模板,API 非常干净且富有表现力。在 Eigen 之上实现算法感觉就像在复制伪代码。您可以使用复杂的表达式并仍然依赖 Eigen 来生成优化代码:您无需手动将表达式分解为小步骤。

于 2009-04-17T17:05:57.467 回答
0

使用本机 Win32 GDI api 处理每个像素并不昂贵。
见 MSDN

于 2009-04-17T17:34:18.710 回答