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

How to do calculation using OpenGL ES 2.0/3.0?

我在想一个问题,是否可以在移动设备中使用 OpenGL ES 进行一些数组计算。例如,我使用 glTexImage2D 向着色器传递一个浮点数组(其中包含一些 0.0 和 1.0,例如 {0.0, 1.0, 1.0, 0.0, 0.0...}),我想知道有多少“1”通过着色器语言存在于此数组中。最后return结果为CPU。这可能吗?我该怎么做?

嗯,你可以试试 renderscript(假设你在 android)。

如果不可行,你可以这样尝试:

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

注意:如果数据不能完全适合纹理(例如您有奇数个数据),请用 0 填充未使用的纹素。

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

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