GLES20.GLREADPIXEL在Android中获得所有零



你好,大家好〜我希望屏幕可以显示我们触摸的像素的颜色,然后我使用GLES20.GLREAD像素如下。如LogCat上所示,无论我在何处,它总是读取0 0 0 0。我还根据屏幕的宽度和高度更改了索引,但仍然获得所有零。我知道这样做应该很容易,但是我真的不知道如何解决它。有人可以帮我吗?非常感谢!

public String getFace(float angleX, float angleY, float positionX, float positionY){
    String toast = "other";
    int tempX = Math.round(positionX);
    int tempY = Math.round(positionY);
    ByteBuffer ss = ByteBuffer.allocate(4);
    ss.order(ByteOrder.nativeOrder());
    GLES20.glFlush();
    //Get Screen's width and height
    DisplayMetrics displaymetrics = new DisplayMetrics();
    ((Activity) getContext()).getWindowManager()
            .getDefaultDisplay()
            .getMetrics(displaymetrics);
    int height = displaymetrics.heightPixels;
    int width = displaymetrics.widthPixels;
    int X = tempX;
    int Y = height-tempY;
  //Here it's
    GLES20.glReadPixels(X, Y, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ss);
    byte b[] = new byte[4];
    ss.get(b);
    String key = "" + b[0] + " " + b[1] + " " + b[2] + " " + b[3];
    Log.d("Color: ", key);
    ss.rewind();
    Log.d("DEBUG", "X:"+ X + " Y:" + Y);
    Log.d("DEBUG", "w:"+ width + " h:" + height);
        if (key = ' 1 0 0 1') {
            toast = "Face Red";
        } else {
            toast = "other";
        }
    return toast;
}

现在,我知道问题在哪里!由于我有一个myrenderer.java,它是当前的openGL上下文。GlreadPixels()仅在有当前的OpenGL上下文时起作用!上面的代码位于我的myglsurfaceview.java中,该java负责辅助线程,因此这就是为什么GlreadPixels()什么都没读。

解决方案是使用glsurfaceview.queueevent()向前呈现线程的glsurfaceview.queueevent()。我们现在可以在renderer.java中编写glreadpixels(),然后读取结果。

这是一个示例,引用了在此处输入链接描述

 class MyGLSurfaceView extends GLSurfaceView {
 private MyRenderer mMyRenderer;
 public void start() {
     mMyRenderer = ...;
     setRenderer(mMyRenderer);
 }
 public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
         queueEvent(new Runnable() {
             // This method will be called on the rendering
             // thread:
             public void run() {
                 mMyRenderer.handleDpadCenter();
             }});
         return true;
     }
     return super.onKeyDown(keyCode, event);
 }
 }

最新更新