我想要的(基本上)与“对图像的所有像素求和”相同。 然而,似乎这不能通过着色器实现(我认为这就是我要问的原因; - )):
我想传递图像+参数“treeshold”并检查图像的每个像素(如果该像素(R,G,B)是否在阈值(R +/-,G +/-,B +/-)
IS IN操作没问题,没什么复杂的。
问题是我需要在图像中完成此操作的所有像素(计数)的总和。
使用着色器的想法是最小化此计算,因为在CPU中非常昂贵(此外,我们必须多次重复此计算)。
一个想法是如果像素没有实现,则将矢量(0,0,0)作为输出,如果像素达到,则将(1,0,0)作为输出,然后在软件汇总中将所有第一个通道。
即使只使用软件这个速度更快,我们仍在使用NXM图像进行总和。
另一种方式(不那么精确)是为(例如)10个相邻像素执行此操作(如果“im a neighbor”,则省略计算)。 然后我们只对每个10位置的数组求和。 我们的速度提高了10倍,但是,我们仍然有O(N * M)。
另外,我相信我们可以使用这样的东西,但我完全不明白如何在像素弯曲机中使用它 Efficient pixel shader sum of all pixels
提前感谢任何其他解决方案。
答案 0 :(得分:0)
您可能需要考虑分而治之的方法,多次运行过滤器。
一种可能性是编写一个过滤器,用于写出从[(coord.x * 10.0), (coord.y * 10.0)]
每次通过,此过滤器会将您关注的区域减少到1/10。
因此,Flash中最大可能的图像尺寸为8192像素,您必须运行此滤镜四次以获得左上角像素的答案。
您可以通过几种方式对其进行优化。首先是每个在第一个之后运行,你可以将它传递给前面输出图像的左上角十分之一,所以它只需要处理每个运行1%的像素;第二,你可以传入包含图像宽度和高度的十分之一的Float2参数,并让你的代码跳过求和,如果coord.x或coord.y超出那个范围,只需将输出像素设置为0
通过这些优化,您的第一遍将读取每个像素;第二个将读取1%的像素;第三个读数为0.01%;最终将读为0.0001%。因此,在第一次传递之后的所有传递都不应该为您的处理时间添加任何东西。
这一切都假定您使用校验和算法,该算法可以将答案压缩到单个像素,并且零不会影响结果。按位异或将是理想的,但在PB中不存在按位运算符。 :(