OpenGL ES 1.1/2.0着色器在Android上比较图像

问题描述:

我正在开发一种比较图像的软件,我需要以快速的方式完成它!其实我用普通的c比较它们,但它太慢了。OpenGL ES 1.1/2.0着色器在Android上比较图像

我想比较他们使用着色器和几个gl表面(纹理),使用c而不是java,但这并不会改变这种情况,并找回更改的零件列表,但我真的不知道从哪里开始。基本上我想用像SIMD霓虹灯指令来比较像素颜色来检查变化(当然,我需要检查只有第一个像素片段的颜色,例如只有红色......这些都是照片,所以是不切实际的它不会改变),而是使用氖指令我想使用像素着色器做比较,并获得更改部分的列表返回

更多,如果可能,我想对同一图像使用并行比较将其拆分:)

有人可以给一个打击?

注意:我知道我不能输出一个东西的列表,但是,好吧,使用第三个纹理作为输出对我来说是很好的(如果我把纹理2 ushorts表示x和y我没关系,纹理的结尾报告了变化像素的数量)

OpenGL ES 1.1没有着色器,并且我可以想到的最佳路线以您想要的方式结束色彩精度降低50%。问题是:

  1. 没有扩展名有添加剂混合,但不是减法。没问题,只需将所有颜色值反转的第二个纹理上传。
  2. OpenGL将输出颜色限制在[0,1]的范围内,没有扩展名,每个通道只限制一个字节。所以你需要使用7bit色彩通道上传纹理,以确保你在8位内部得到正确的结果。

着色器将允许围绕一个稍微迂回路线,因为你可以增加或减少或做你想做的,可分割的结果。如果您发送两个三通道24位图像以获取四通道32位图像,显然每个通道有足够的空间容纳9位数据,即使您需要奇怪地分割数据并稍后重建它。

在实践中,你会付出相当多的费用上传和下载GPU图像,所以NEON可能是一个更好的选择,不仅仅是为了避免包装的特殊性。假设Android套件提供与iPhone套件相同的编译器内在函数(可能,因为它们都包含GCC),this page有一些介绍,说明如何将图像转换为灰度。所以这并不是你要找的东西,但是它使用NEON在C中进行图像处理,所以它应该是一个好的开始。

在这两种情况下,您最终都会得到差异图像,而不是简单的计数和列表。计数是一种并发操作,无论你如何看待它,所以并非 真的是你在GL或通过NEON所做的事情。你需要检查最终的图像来解决问题。

+0

我同意上传/下载可能根本没有任何改进。最好尝试霓虹灯或在1个寄存器(变量)中包装4个灰度像素。 – fazo 2011-04-05 12:49:57

+0

非常感谢,我会尽量用霓虹灯做比较 – 2011-04-05 16:42:42