나는 안드로이드 OpenGL ES에서 GLES20.glReadPixels 함수를 사용하여 색상 따기를 구현하려고합니다. 문제는이 함수가 항상 올바른 색상 값이 아닌 0,0,0,0을 색상으로 반환한다는 것입니다. 왜 그런가? 내 코드는 다음과 같이 보입니다 :OpenGL ES 2.0 안드로이드 - 색상 따기
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입니다. 이유를 모르겠다 :/내가 뭘 잘못하고 있니? 등대 튜토리얼을 참조로 사용했습니다 : http://www.lighthouse3d.com/opengl/picking/index.php3?color2 그리고 저는이 시점에서 실제로 실수를 볼 수 없습니다./ 아, 내 장면에 완전히 파란색 인 3D 큐브가 포함되어 있으므로 결과물이 있어야한다는 것을 잊어 버렸습니다. 0,0,1,0 것처럼 그것을 클릭하지만하지 :(
EDIT 경우 : 큐브 (그것의 Y 축 회전을 arround)를 렌더링하는 렌더러에서 코드
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);
}
픽업 전후에 발생하는 렌더링 루프의 관련 부분을 포함하도록 질문을 편집 할 수 있습니까? – waaitt
내 질문을 편집했지만 솔직히 문제는 터치 핸들러 기능에 있다고 생각합니다. 그리고 다른 곳 :/ – L3M0L
맞습니다. 렌더링 코드가 중요하지 않다고 생각합니다. –