OpenGL ES 1.1 / 2.0着色器,用于比较Android上的图像

时间:2011-04-05 10:18:53

标签: java android c opengl-es shader

我正在开发一种比较图像的软件,我需要快速完成!实际上我用普通c比较它们,但它太慢了。

我想使用着色器和几个gl表面(纹理)来比较它们,使用c而不是java,但这并没有改变这种情况,并且返回一个已更改部件的列表,但我真的不喜欢不知道从哪里开始。

基本上我想使用像SIMD霓虹灯指令来比较像素颜色来检查变化(好吧,我只需要检查第一个像素片段颜色,例如只有红色...这些是照片所以这是不现实的不改变)但改为使用霓虹灯指令我想使用像素着色器进行比较并获得更改后的部分列表

更多,如果可能的话,我想在同一个图像中使用并行比较,将它分成块:)

有人能打击吗?

注意:我知道我不能输出一个东西列表,但是,好吧,使用第三个纹理,因为输出对我来说是好的(如果我把纹理2 ushorts指示x和y我' m ok并且在纹理的末尾有一个uint,用于报告更改的像素数量)

1 个答案:

答案 0 :(得分:2)

OpenGL ES 1.1没有着色器,我想要做的最佳路线就是将色彩精度降低50%。问题是:

  1. 没有扩展,有添加混合,但不是减法。没问题,只需上传第二个纹理,并将所有颜色值反转。
  2. OpenGL将输出颜色钳制到[0,1]范围,没有扩展名,每个通道限制为一个字节。因此,您需要使用7位颜色通道上传纹理,以确保在8位内容中获得正确的结果。
  3. 着色器允许稍微迂回的路线,因为你可以添加或减少或做任何你想做的事情,并可以分割结果。如果您要发送两个三通道24位图像以获得四通道32位图像,显然每个源通道有足够的空间容纳9位,即使您将不得不奇怪地划分数据并在以后重建它

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

    在这两种情况下,您可能最终得到差异的图像,而不是简单的计数和列表。无论你怎么想,计数都是并发操作,所以不是 真的是你在GL或通过NEON做的事情。您需要检查最终图像才能解决问题。