2014-06-06 3 views
0

나는 안드로이드 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);  


} 
+0

픽업 전후에 발생하는 렌더링 루프의 관련 부분을 포함하도록 질문을 편집 할 수 있습니까? – waaitt

+0

내 질문을 편집했지만 솔직히 문제는 터치 핸들러 기능에 있다고 생각합니다. 그리고 다른 곳 :/ – L3M0L

+0

맞습니다. 렌더링 코드가 중요하지 않다고 생각합니다. –

답변

0

다른 모든 OpenGL 호출과 마찬가지로 glReadPixels()은 현재 OpenGL 컨텍스트가있는 경우에만 작동합니다.

Android에서 OpenGL 렌더링은 대부분 GLSurfaceView을 사용하여 렌더링을위한 보조 스레드를 생성하고 OpenGL 컨텍스트를 만들고 보조 구현 스레드에서 해당 컨텍스트를 최신 상태로 유지하면서 GLSurfaceView.Renderer 구현의 메서드를 호출합니다.

onTouchEvent()이 UI 스레드에서 호출되므로 여기에 현재 OpenGL 컨텍스트가 없습니다. glReadPixels()을 사용하려면 GLSurfaceView.queueEvent() 메서드를 사용하여 렌더링 스레드에 요청을 전달한 다음 다음에 Renderer.onDraw() 메서드가 호출 될 때 비동기 적으로 처리 할 수 ​​있습니다.