【发布时间】:2011-07-23 05:43:24
【问题描述】:
我制作了一个查找表,允许您使用不使用浮点值的单字节 Alpha 通道混合两个单字节通道(每个通道 256 种颜色)(因此没有浮点到 int 的转换)。查找表中的每个索引对应于通道的 256ths 的值,与 alpha 值相关。
总而言之,要完全计算 3 通道 RGB 混合,需要对每个通道的数组进行两次查找,外加一个加法。这总共是 6 次查找和 3 次添加。在下面的示例中,为了便于演示,我将颜色拆分为单独的值。这个例子展示了如何通过 0 到 256 的 alpha 值混合三个通道,R G 和 B。
BYTE r1, r2, rDest;
BYTE g1, g2, gDest;
BYTE b1, b2, bDest;
BYTE av; // Alpha value
BYTE rem = 255 - av; // Remaining fraction
rDest = _lookup[r1][rem] + _lookup[r2][av];
gDest = _lookup[g1][rem] + _lookup[g2][av];
bDest = _lookup[b1][rem] + _lookup[b2][av];
效果很好。精确到您可以使用 256 个颜色通道。事实上,使用实际的浮点计算,您将获得相同的精确值。查找表是使用双精度计算的。查找表太大,无法放入这篇文章(65536 字节)。 (如果您想要一份副本,请发送电子邮件至 ten.turtle.toes@gmail.com 给我发邮件,但不要期待明天才能回复,因为我现在要睡觉了。)
那么……你怎么看?值不值?
【问题讨论】:
-
这是一个非常糟糕的主意。你会破坏缓存,通常会因为做这种愚蠢的事情而受到严厉的惩罚。计算它,如果可能的话,使用 SSE/MMX 等并行计算。甚至更好,使用 GPU。
-
您可以在编译时使用模板生成表格,也可以在启动期间在运行时生成表格,从而避免巨大的文件。
-
我支持关于缓存垃圾的评论。
-
我仍然无法理解 XMM 寄存器;它们用于浮点但用于整数计算?你能推荐任何材料来详细了解它们吗?
-
在现实世界中计算它比在内存中查找要快得多(无论如何在台式电脑上)。如果你做一个微基准测试并使用相同的内存地址在它上面进行测试,你会自欺欺人地相信这个表更好,因为你最终会缓存比你真正想要的更多。请记住,内核的运行速度至少比主板接口快 10 倍。许多工作可以在一个总线周期发生的时间内完成。巨型表的坏处:它们将真实数据推出缓存。
标签: c++ c optimization graphics alphablending