如何使用基于Android上GLES30的glreadpixels从特定缓冲区读取数据

时间:2016-09-15 08:33:03

标签: android opengl-es

据我所知,从GLES30开始,不再有items.computeIfAbsent(key, k -> new SimpleStringProperty()) 缓冲区(我看到它HERE

由于我无法阅读"特殊变量",我怎样才能阅读" out"缓冲

这是我的代码:

gl_FragColor

这里我尝试读取数据:

private static final String FRAGMENT_SHADER =
        "#version 300 es\n"+
        "#extension GL_OES_EGL_image_external_essl3 : require\n" +
        "precision mediump float;\n" +      // highp here doesn't seem to matter
        "in vec2 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "out vec4 fragColor ;\n" +
        "void main() {\n" +
        "    vec4 tc = texture(sTexture, vTextureCoord);\n" +
        "    fragColor.r = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "    fragColor.g = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "    fragColor.b = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
        "}\n";

代码中没有gl错误。

输出 ByteBuffer mPixelBuf = ByteBuffer.allocateDirect(mWidth * mHeight * 4); mPixelBuf.order(ByteOrder.LITTLE_ENDIAN); GLES30.glReadPixels(startX, startY, frameWidth, frameHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, mPixelBuf); 仅为零。

如何确保mPixelBuf正在阅读?

由于

Update1-完整纹理渲染代码:

fragColor

2 个答案:

答案 0 :(得分:0)

您的着色器代码与glReadPixels读取的内容完全无关,它与特殊变量名称无关。它从当前绑定的读取帧缓冲区读取; ES 3.0中的glReadPixels的工作方式与ES 2.0中的工作方式完全相同。

唯一的例外是多个渲染目标支持,但在这种情况下不相关。

  

如何确保fragColor正在阅读?

glClearColor(some interesting color)
glClear(COLOR_BUFFER_BIT)
glReadPixels()
assert color == some interesting color

答案 1 :(得分:0)

我学到的是你的GLES30.glReadPixels调用需要在eglSwapBuffers之前完成,因为根据{{1}的文档glReadBuffer在双缓冲配置中最初设置为GL_BACK }。一旦glReadBuffer调用eglSwapBuffers,就不会将任何内容读回主内存。

相关问题