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