GLES20.glReadPixels在android中全部为零

时间:2016-06-21 22:22:55

标签: android opengl-es

大家好〜我希望屏幕可以显示我们触摸的像素的颜色,然后我使用GLES20.glReadPixels如下。如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;
}

1 个答案:

答案 0 :(得分:1)

现在,我知道问题所在!因为我有一个MyRenderer.java,它是当前的OpenGL上下文。并且glReadPixels()仅在存在当前OpenGL上下文时才有效!上面的代码在我的MyGLSurfaceView.java中,它负责一个辅助线程,这就是为什么glReadPixels()什么都不读。

解决方案是使用GLSurfaceView.queueEvent()转发给渲染线程。我们现在可以在Renderer.java中编写glReadPixels(),并从中读取结果。

这是一个提到enter link description here

的例子
 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);
 }
 }