2013-11-25 2 views
1

OpenGL에서 작업 할 때 JOGL을 사용하며 픽셀 색상을 얻을 수 없습니다. glReadPixels() 메서드는 항상 모두 0의 배열을 반환합니다. 나는 회색 색상으로 창을 작성하고 사용자가 어디서나 창에서 클릭하면 다음 결과를 테스트glReadPixels()은 0의 배열을 반환합니다.

private static GL2 gl; 

static Color getPixel(final int x, final int y) { 
    ByteBuffer buffer = ByteBuffer.allocate(4); 
    gl.glReadBuffer(GL.GL_FRONT); 
    gl.glReadPixels(x, y, 1, 1, GL2.GL_RGB, GL2.GL_UNSIGNED_BYTE, buffer); 
    byte[] rgb = buffer.array(); 

    return new Color(rgb[0], rgb[1], rgb[2]); 
} 

다시 그리기에합니다 (display() 방법) :

@Override 
public void mouseClicked(MouseEvent e) { 
    // On mouse click.. 
    for (int j = 0; j < this.getWidth(); ++j) 
     for (int i = 0; i < this.getHeight(); ++i) { 
      // ..I iterate through all pixels.. 
      Color pxl = Algorithm.getPixel(j, i); //! pxl should be GRAY, but it is BLACK (0,0,0) 
      if (pxl.getRGB() != Color.BLACK.getRGB()) 
       // ..and print to console only if a point color differs from BLACK 
       System.out.println("r:" + pxl.getRed() + " g:" + pxl.getGreen() + " b:" + pxl.getBlue()); 
     } 
} 
내가 그것을 사용하는 방법

그러나 콘솔에는 출력이 없습니다. 필자는 이산 그래픽과 통합 그래픽에서 테스트 해 보았습니다. 결과는 동일했습니다.

내가 뭘 잘못하고 있는지 말해. 우연히 JOGL을 사용하고 glReadPixel() 메소드를 사용하는 프로그램이 있다면 작업 예제를 공유하십시오.

+1

-1 [SSCCE (http://sscce.org/)까지 코드를 끓여 편집 : 예

는,이 방법으로는 OpenGL 컨텍스트를 사용하는 것이보다 정확 질문에. 무작위 Dropboxes 죽으면, 그래서 영원히입니다. – genpfault

+0

@genpfault, 나는 코드를 SSCCE로 단축 한 후에 문제의 원인을 발견했다. 코드를 다시 업로드하고 작동중인 프로젝트로 대체해야합니까? – naXa

+0

좋아요! 그것은 SSCCE가 굉장한 이유 중 하나입니다 :) 질문에 잘못된 SSCCE를 편집 한 다음 수정 된 SSCCE를 대답으로 편집해야합니다. – genpfault

답변

0

문제는 getPixel()을 (즉, 다른 스레드에서)이라고했습니다. OpenGL 컨텍스트는 한 번에 하나의 스레드에서만 활성화 될 수 있습니다. 해결책은 here으로 논의됩니다. ,

/** 
* Called back by the animator to perform per-frame rendering. 
*/ 
@Override 
public void display(GLAutoDrawable glAutoDrawable) { 
    GL2 gl = glAutoDrawable.getGL().getGL2(); // get the OpenGL 2 graphics context 

    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // clear background 
    gl.glLoadIdentity();     // reset the model-view matrix 

    // Rendering code 
    /* There you can fill the whole window with a color, 
     or draw something more beautiful... */ 

    gl.glFlush(); 

    /* Here goes testing cycle from mouseClicked(); and it works! */ 
}