2011-10-25 1 views
2

여기 내 따기 코드를 혼란에 대해 죄송가 glReadPixel는 0과 1 오류 1282 (안드로이드)를 반환

public static void pick(GL11 gl){ 
     int[] viewport = new int[4]; 
     ByteBuffer pixel = ByteBuffer.allocateDirect(3).order(ByteOrder.nativeOrder()); 

     mColourR = BaseObject.getColourR(); 
     mColourG = BaseObject.getColourG(); 
     mColourB = BaseObject.getColourB(); 

     x = MGLSurfaceView.X(); 
     y = MGLSurfaceView.Y(); 

     gl.glGetIntegerv(GL11.GL_VIEWPORT,viewport,0); 

     gl.glReadPixels((int)x, (int)(viewport[3] - y), 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixel); 
     Log.d(TAG, String.valueOf(gl.glGetError())); 
     R = pixel.get(0); 
     G = pixel.get(1); 
     B = pixel.get(2); 
     Log.d(TAG, "Colour:" + pixel.get(0) + " " + pixel.get(1) + " " + pixel.get(2)); 
     if (R == mColourR && G == mColourG && B == mColourB){ 
      match = true; 

     }else{ 
      match = false; 
     } 
     Log.d(TAG, String.valueOf(match)); 
     Log.d(TAG, String.valueOf(viewport[0]) + "," + String.valueOf(viewport[1]) + "," + String.valueOf(viewport[2]) + "," + String.valueOf(viewport[3])); 

} 

입니다. 어쨌든이 코드는 내가 클릭 한 위치에 상관없이 항상 (0, 0, 0)을 반환하는 것처럼 보입니다. 나는 광장 붉은 광장, 녹색 및 테스트 목적으로 파란색 배경을 가지고 있고이 방법은 사각형 중 하나가 그려 때마다 호출되는 더이 비록 화면이 너무

BaseObject.newColour(); 
    mColourR = BaseObject.getColourR(); 
    mColourG = BaseObject.getColourG(); 
    mColourB = BaseObject.getColourB(); 
    gl.glPushMatrix(); 
    gl.glColor4f(mColourR, mColourG, mColourB, 0.0f); 
    gl.glTranslatef(x1, y1, 0); 
    square.draw(gl); 
    gl.glPopMatrix(); 
    ColourPicking.pick((GL11)gl); 
    match = ColourPicking.getMatch(); 
    if (match == true){ 
     x1 = (float) Math.floor(Math.random()*9); 
      y1 = (float) Math.floor(Math.random()*7); 
     match = false; 
    } 

처럼 눌러지지하고있다 화면의 검은 색 공간 나는 항상 검은 색 값을 얻었으므로 정밀도 문제 만은 아닙니다. 뷰포트 값을 반환하는 로그 태그가 있고 괜찮습니다. 또한 x y 좌표를 검사했는데 합법적 인 것으로 보이는 유일한 것은 1282 오류 코드입니다.

누구에게 어떤 생각이 있습니까?

편집 :

오른쪽 우리는 내가 전에 함수 후 glGetError의()를 넣어이 확장 didn를 제거하기 다시

Before: 0 
After: 1282 

왔기 때문에 문제가 읽기 픽셀 기능에서 오는 것을 알고있다 그다지 도움이되지 않았지만 그게 장거리였습니다

저는 Buffer를 FloatBuffer로 변경했습니다. 이제는 (0, 0, 0) 대신에 (0, 0, 0) 알아. 나는 또한 오류가 이제 1280 (GL_INVALID_ENUM) 인 것으로 나타났습니다. 이것이 전진하는 단계인지 나는 모른다. 아무도 오류가 아니라면이 오류를 수정하는 방법을 알고 있나요 1282

+0

또한 'glReadPixels' 바로 전에'glGetError'를 호출하여 오류 플래그를 지우고 오류가 실제로 발생하는 곳이 아닌지와 200 함수 호출 이전인지 확인하십시오. –

+0

그래, 그 전에 반환 태그 0과 그 후 하나를 반환했습니다 1282 – Jack

+0

@ 크리스티안 Rau 미안하지만 내 마지막 코멘트에 당신을 태그하지 않았어 그래서 만약 당신이 그것을 가지고있어 – Jack

답변

9

GL_INVALID_ENUM을 받고 있는데, 그 이유는 glReadPixels에 형식 매개 변수로 GL_RGB를 전달하기 때문일 수 있습니다.

  • GL_RGBA (형식) 및 GL_UNSIGNED_BYTE (A 타입) 및 GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES GL_IMPLEMENTATION_COLOR_READ_TYPE_OES의
  • 숫자 다음 Khronos documentation for glReadPixels에 따르면, 포맷 및 유형의 값의 2 쌍 수있다. glGetIntegerv를 사용하여 이들을 조회 할 수 있습니다.

최근에 같은 문제가 발생하여 GL_RGBA를 사용하여 해결했습니다.