OpenGL ES 2.0 Android-颜色拾取
我试图在android OpenGL ES中使用GLES20.glReadPixels函数实现颜色拾取。问题是该函数总是返回0,0,0,0作为颜色,而不是正确的颜色值。知道为什么吗?我的代码如下所示:OpenGL ES 2.0 Android-颜色拾取,android,opengl-es,color-picker,glreadpixels,Android,Opengl Es,Color Picker,Glreadpixels,我试图在android OpenGL ES中使用GLES20.glReadPixels函数实现颜色拾取。问题是该函数总是返回0,0,0,0作为颜色,而不是正确的颜色值。知道为什么吗?我的代码如下所示: public boolean onTouchEvent(MotionEvent event) { if (event != null) { float x = event.getX(); float y = e
public boolean onTouchEvent(MotionEvent event)
{
if (event != null)
{
float x = event.getX();
float y = event.getY();
if (event.getAction() == MotionEvent.ACTION_UP)
{
int newX = (int)x;
int newY = (int)y;
ByteBuffer pixel = ByteBuffer.allocate(4);
pixel.order(ByteOrder.nativeOrder());
pixel.position(0);
GLES20.glReadPixels(newX, (int)mRenderer.viewport[3] - newY, 1, 1,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pixel);
}
return true;
}
else
{
return super.onTouchEvent(event);
}
就像我之前说的。。。像素阵列的结果始终为0,0,0,0。不知道为什么:/我做错了什么?我使用灯塔教程作为参考:
在这一点上我真的看不出错误:/
哦,我忘了告诉你,我的场景包含一个完全蓝色的3D立方体,所以当我点击它时,结果应该是0,0,1,0,但它不是:(
编辑:
绘制立方体的渲染器中的代码(立方体绕其y轴旋转)
与所有其他OpenGL调用一样,
glReadPixels()
仅在存在当前OpenGL上下文时有效
在Android中,OpenGL渲染主要使用GLSurfaceView
完成,它负责生成用于渲染的辅助线程,创建OpenGL上下文,并在调用GLSurfaceView.Renderer
实现中的方法时使该上下文在辅助渲染线程中成为当前上下文
在UI线程中调用了
onTouchEvent()
,因此此处没有当前的OpenGL上下文。要使用glReadPixels()
,可以使用GLSurfaceView.queueEvent()
方法将请求转发到渲染线程,然后在下次渲染器.onDraw()时异步处理该请求
方法被调用。您是否可以编辑您的问题,以包括拾取前后发生的渲染循环的相关部分。我编辑了我的问题,但老实说,我认为问题出在触摸处理程序函数中……没有其他地方:/n对,我认为渲染代码无关紧要。
public void onDrawFrame(GL10 unused) {
float[] scratch = new float[16];
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3.0f, 0f, -0.3f, 0.0f, 0.0f, 1.0f, 0.0f);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
float[] mModelMatrix = new float[16];
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, 0, 0, -0.5f);
Matrix.setIdentityM(mRotationMatrix, 0);
Matrix.rotateM(mRotationMatrix, 0, mDeltaX, 0, 1.0f, 0);
Matrix.rotateM(mRotationMatrix, 0, -mDeltaY, 1.0f, 0, 0);
mDeltaX = 0.2f;
mDeltaY = 0.2f;
float[] mTempMatrix = new float[16];
Matrix.multiplyMM(mTempMatrix, 0, mRotationMatrix, 0, mAccumulatedRotation, 0);
System.arraycopy(mTempMatrix, 0, mAccumulatedRotation, 0, 16);
float[] temp = new float[16];
Matrix.multiplyMM(temp, 0, mModelMatrix, 0 , mAccumulatedRotation, 0);
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, temp, 0);
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, 0, 0, 0.5f);
float[] temp2 = new float[16];
Matrix.multiplyMM(temp2, 0, scratch, 0, mModelMatrix, 0);
mCube.drawCube(temp2);
}