Opengl es 如何使用OpenGL ES 2.0/3.0进行计算?

Opengl es 如何使用OpenGL ES 2.0/3.0进行计算?,opengl-es,gpgpu,Opengl Es,Gpgpu,我在想一个问题,在移动设备中使用OpenGL ES进行一些数组计算是可能的。例如,我使用glTexImage2D向着色器传递一个浮点数组(其中包含一些0.0和1.0,例如{0.0,1.0,0.0,0.0…}),我希望通过着色器语言计算出这个数组中有多少个“1”。最后将结果返回给CPU。这可能吗?我该怎么做 那么,您可以试试renderscript(假设您使用的是android) 如果不可行,您可以尝试以下方法: 可以通过将这些数据写入纹理来实现,其中每个纹理都是1或0,具体取决于数据。然后,您应

我在想一个问题,在移动设备中使用OpenGL ES进行一些数组计算是可能的。例如,我使用
glTexImage2D
向着色器传递一个浮点数组(其中包含一些0.0和1.0,例如{0.0,1.0,0.0,0.0…}),我希望通过着色器语言计算出这个数组中有多少个“1”。最后将结果返回给CPU。这可能吗?我该怎么做

那么,您可以试试renderscript(假设您使用的是android)

如果不可行,您可以尝试以下方法:

可以通过将这些数据写入纹理来实现,其中每个纹理都是1或0,具体取决于数据。然后,您应该在该纹理上执行类似mip映射的操作,直到只有1个像素。然后,这1个像素将具有所有像素的平均值组合,因此您可以通过将其与初始浮点数组的大小相乘,精确计算出其中有多少像素是1。例如,如果1个像素的值为0.25,并且您有400个数据,那么其中100个像素的值为1

注意:如果数据不完全适合纹理(例如,数据为奇数),请使用0填充未使用的texel

注2:如果数据太多,浮点精度可能会破坏精度。。。确保使用精度最高的单通道纹理格式。单通道32位纹理(您应该瞄准)仅在opengl es 3.0 afaik中可用,但请检查规格


tldr;您应该制作纹理,为其生成mipmap,读取最后一个mip级别,并将其值乘以数据项的数量

谢谢您的回答。我试试看。我想知道哪一种效率更高?Renderscript还是OpenGL ES@Agnu17我想说opengl es可能更高效,因为它可以使用renderscript无法使用的一些硬件。在这种情况下,我不确定mipmap生成(glGenerateMipmap)是由cpu还是gpu完成的。OpenGL允许这两种功能,这取决于驱动程序制造商在其中一种上实现该功能。也就是说,如果驱动程序实现良好,opengl版本可能会更快,因为它可以使用renderscript无法使用的一些硬件。然而,在Renderscript中,您必须手动实现mipmapping功能,这有点困难,但它给了您更多的控制,而且它的速度更可预测。我是gpgpu的新手,现在我想做的是使用OpenGL ES向GPU植入一段代码。我查阅了一些教程,发现需要FBO。但是我不太明白FBO的用法。如果我想在这些FBO之间切换,当我解除绑定FBO时,数据(此FBO中的纹理)会丢失吗?再次感谢您的耐心。:)FBO实际上是一种纹理。通过调用“glBindFramebuffer(int)”可以指定要绘制到的纹理。即使您的屏幕可以被视为FBO,它的id也为0,这就是为什么在完成对帧缓冲区/纹理的绘制后,您必须调用“glBindBuffer(0)”,以将屏幕设置为绘制目标。现在,如果在帧缓冲区之间切换(绑定另一个帧缓冲区),则不会擦除其数据,因此不会丢失。如果要擦除当前绑定的帧缓冲区(无论是屏幕还是FBO)上的数据,必须调用“glClear(…)”;