OpenGL ES 2在Android API23上无法运行。

6

我在我的应用程序中进行了一些图像像素操作。

我的代码基于这个示例。

我唯一做的更改是将FRAGMENT_SHADER更改为灰度,并且它看起来像这样:

private static final String FRAGMENT_SHADER =
        "#extension GL_OES_EGL_image_external : require\n" +
        "precision mediump float;\n" +      // highp here doesn't seem to matter
        "varying vec2 vTextureCoord;\n" +
        "uniform samplerExternalOES sTexture;\n" +
        "void main() {\n" +
        "    vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
        "    gl_FragColor.r = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "    gl_FragColor.g = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "    gl_FragColor.b = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "}\n";

问题: 我从Galaxy S7设备录制了一段视频,录制后,我从两个不同的设备(Galaxy S7和Galaxy S3)中读取了第一个帧,我发现这些设备之间的像素值完全不同。
有人知道为什么会发生这种情况吗?我应该怎么做才能解决这个问题,因为我的算法因为这种差异而失败?
更新: 这是我得到的差异示例。
Gaaxy S3: 矩阵的一部分 213, 214, 212, 214, 216, 214, 213, 212, 212, 212, 213, 214, 214, 214, 213, 213, 214, 214, 214, 214, 212, 213, 212, 213, 212, 214, 214, 212, 212, 210, 211, 210, 211, 210, 211, 211, 214, 211, 214, 213, 213, 214, 214, 216, 216, 216, 215, 215, 216, 212, 213, 213, 214, 213, 213, 212, 211, 209, 209, 207, 208, 208, 210, 211, 209, 207, 209, 210, 217, 219, 216, 209, 209, 210, 210, 210, 211, 209, 207, 205, 205, 206, 210, 210, 220, 211, 202, 210, 211, 206, 206, 209, 210, 211, 213, 219, 222, 216, 217, 217
非零像素的数量: 1632816
所有像素的总和: 3.1834445E8

Galaxy S7: 与Galaxy 3相同的矩阵部分 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164

非零像素的数量:1063680

所有像素的和:1.6593408E8

更新2:

我发现收到的图像完全被破坏了,但录制的视频很好。 这是来自Galaxy S3的好图像: enter image description here

而这是我从Galaxy S7获得的图像(相同帧#): enter image description here

我完全不知道这里发生了什么,但我知道最后一张图对于所有Marshmallow设备(Galaxy S6、S7和华为)都是相同的。


请您详细说明一下这两个设备之间的像素值差异,如果能添加一张显示差异的截图会更有帮助。 - Gil Moshayof
我会更新它,谢谢。 - user2235615
另外,请告诉我们更多关于您如何录制视频的信息? - codetiger
我正在使用MediaRecorder来录制视频。 - user2235615
可以分享更多你的程序吗?要得到那种水平条纹,这更像是一个输入数据问题,而不是着色器问题。 - solidpixel
我使用的代码与我链接的示例代码非常接近,因为我是基于这个示例编写的。 - user2235615
1个回答

1

好的,在一周的努力寻找解决方案后,问题被找到了!

正如我所说的,我基于bigflake的示例进行了修改,在这个示例中有一个选项可以反转框架,在这个示例中就是这样做的。

通过将反转设置为false,问题得到了解决。

如果有人能够解释一下为什么需要对框架进行反转,并且为什么默认情况下将其设置为“true”,我会非常感激。

感谢您的所有帮助!

这是我所做的更改,如果不清楚,可以参考以下内容:

outputSurface.drawImage(false);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接