2011-11-30 1 views
3

사용자가 클릭 할 때 JOGL에서 픽셀의 색상을 가져 오려고합니다. 디스플레이 메서드 (GLEventListener에서 오는)에 다음 코드를 삽입하면 올바르게 작동합니다. 나는의 mousePressed 방법에 내 코드를 삽입하면 성공과 검은 색의 반환을 검사 할 때mousePressed의 glReadPixels

FloatBuffer buffer = FloatBuffer.allocate(4); 

gl.glReadBuffer(GL3.GL_FRONT); 
gl.glReadPixels(10, 10, 1, 1, GL3.GL_RGBA, GL3.GL_FLOAT, buffer); 
float[] pixels = new float[3]; 
pixels = buffer.array(); 
float red = pixels[0]; 
float green = pixels[1]; 
float blue = pixels[2]; 
System.out.println(red + ", " + green + ", " + blue); 

그러나, 내가 잘못된 연산 오류 (0, 0, 0).

내 mousePressed 메서드에서이 작업을 수행하는 방법이 있습니까? 또는 선택 픽셀을 저장해야합니다 (선택하면 모든 프레임에 glReadPixels가 호출되지 않습니다). 표시 방법에서 선택 하시겠습니까?

p.s. (x, y) 좌표 = (10,10)은 선택이 실제로 내 창 안에 있는지 확인하는 것입니다 (픽셀 색상이 표시 방법에서 올바르게 나오기 때문에).

답변

2

OpenGL 컨텍스트는 한 번에 하나의 스레드에서만 활성화 될 수 있습니다. 마우스 프레스에 대한 이벤트 처리가 다른 스레드에서 발생하면 해당 시점에 OpenGL에서 정보를 올바르게 쿼리 할 수 ​​없습니다. 일반적으로 디스플레이 기능에서 픽셀 값을 읽는 편이 잘못되었습니다. 매 프레임마다 픽셀을 읽지 않으려면 마지막으로 읽은 위치를 추적하고 읽을 위치가 변경된 경우 glReadPixels 만 호출하면됩니다.

datenwolf에서 언급했듯이 필요한 경우 다중 스레드에서 액세스하기 위해 컨텍스트를 비활성화하고 활성화 할 수 있습니다.

+1

사실 OpenGL은 여러 스레드에서 호출 할 수 있습니다. 그러나 OpenGL 컨텍스트는 한 번에 하나의 스레드에서만 활성화 될 수 있습니다. 그러나 한 스레드에서 컨텍스트를 비활성화 한 다음 다른 스레드에서 활성화 할 수 있습니다. 물론 이것은 약간의 성능 저하를 가져옵니다. – datenwolf

+0

오른쪽, 예, 참, 수정합니다. – nonVirtualThunk

관련 문제