【发布时间】:2012-10-12 16:53:33
【问题描述】:
我在我的项目中使用 GPUImage,我需要一种有效的方法来获取列总和。天真的方式显然是检索原始数据并添加每一列的值。有人可以为此提出更快的方法吗?
【问题讨论】:
我在我的项目中使用 GPUImage,我需要一种有效的方法来获取列总和。天真的方式显然是检索原始数据并添加每一列的值。有人可以为此提出更快的方法吗?
【问题讨论】:
做到这一点的一种方法是使用我对 GPUImageAverageColor 类采取的方法(如this answer 中所述),而不是在每一步减少每个帧的总大小,只对一个维度执行此操作图片。
平均颜色过滤器通过在 X 和 Y 方向上降低四倍来确定整个图像的平均颜色,每一步平均 16 个像素为一个。如果在单个方向上操作,您应该能够使用硬件插值在单个方向上每步减少 18 倍,并具有良好的性能。您的最后一步可能需要对小得多的图像进行基于 CPU 的快速迭代,或者需要调整此着色器的版本,将列中的最后几个像素拉到该列的最终结果像素中。
您注意到我在这里一直在讨论平均,因为任何 OpenGL ES 操作的输出值都需要以颜色表示,每个通道只有 0-255 范围。总和很容易溢出,但您可以使用平均值作为总和的近似值,动态范围更有限。
如果您只关心一个颜色通道,您可以将更大的值编码到 RGBA 通道中,并以这种方式保持 32 位和。
除了我上面描述的之外,您还可以在 Accelerate 框架的帮助下查看执行此求和。虽然可能没有基于着色器的缩减那么快,但它可能足以满足您的需求。
【讨论】: