2011-12-08 8 views
4

OpenGL을 사용하여 Kinect 깊이 맵 입력을 이미지로 처리하는 것을 돕고 있습니다. 현재 우리는 Kinect를 기본 동작 센서로 사용하고 있으며,이 프로그램은 얼마나 많은 사람들이 걸 으면서 새로운 사람을 발견 할 때마다 스크린 샷을 찍는 지 계산합니다.OpenGL 텍스처를 표시하지 않고 파일로 인쇄 하시겠습니까?

문제는이 프로그램을 디스플레이에 액세스하지 않고 실행해야한다는 것입니다. 우리는 SSH를 통해 원격으로 실행하려고하고 있으며 다른 서비스의 네트워크 트래픽은 X11 전달이 너무 좋은 아이디어가 될 것입니다. 프로그램을 실행하는 컴퓨터에 디스플레이를 연결하는 것도 가능하지만, 우리는 에너지 소비의 이유로이를 피하기를 원합니다.

OpenGL을위한 2D 텍스처 객체를 생성하고, 일반적으로 GLUT를 사용하여 픽셀을 읽기 전에 렌더링하고 FreeImage를 사용하여 .PNG 파일로 출력합니다. 내가 겪고있는 문제는 일단 GLUT 함수 호출이 제거되면 .PNG 파일에 인쇄되는 것은 모두 블랙 박스에 불과하다는 것이다.

저는 Kinect 용 OpenNI 및 NITE 드라이버를 사용하고 있습니다. 프로그래밍 언어는 C++이며 대상 장치의 하드웨어 제한으로 인해 Ubuntu 10.04를 사용해야합니다.

OSMesa 또는 FrameBuffer 개체를 사용해 보았지만 OpenGL 초보자이기 때문에 OSMesa를 GLUT 함수 대신 올바르게 렌더링 할 수 없었고 컴파일러에서 OpenGL FrameBuffer를 찾을 수 없었습니다. GL/glext.h 또는 GL/gl.h의 함수.

텍스쳐는 이미지 파일에서 프로그램으로 읽을 수 있으며, 출력하고자하는 것은 모두 단일 2-D 텍스처라는 것을 알고 있습니다. 이 경우 화면 밖 렌더링의 두통을 피하고 OpenGL을 먼저 렌더링하지 않고 이미지 파일에 직접 텍스처를 인쇄 할 수 있습니까?

+0

마지막으로 오프 스크린 렌더링을 관리 했습니까? –

답변

0

glGetTexImage를 사용하여 OpenGL에서 텍스처를 다시 읽을 수 있습니다.

+0

나는 왕복을 피하기 위해 그의 문제가 있다고 생각한다. – datenwolf

+0

팁 주셔서 감사합니다. 나는 내 문제를 해결했지만 나에게 도움이되지 못했다. 다음은 내가 한 일입니다. 2 차원 텍스처 배열을 가져 와서 FreeImage 비트 맵을 설정하여 크기를 맞 춥니 다. 그런 다음 180도 회전해야했습니다. 그런 다음 파일로 보냈습니다. – user1088150

1

우리는 SSH를 통해 원격으로 실행하기를 원하며 다른 서비스의 네트워크 트래픽은 X11 전달이 좋은 아이디어가 되기에는 너무 많을 것입니다.

표시 여부 창문이 경우 앞으로 X11과 그 디스플레이는 OpenGL 컨텍스트를 만들 수는 OpenGL을 트래픽이 네트워크를 통해 상관없이 이동됩니다. 그래서 당신이 실제로해야 할 일은 (GPU 가속화 된 OpenGL을 사용하기 원한다면) 원격 머신에서 X 서버를 시작하고 그것을 활성 VT로 유지하는 것입니다 (즉, X 서버는 디스플레이를 "소유"하는 프로그램이어야합니다)). 그러면 프로그램이 바로이 X 서버에만 연결할 수 있습니다. 그러나 이것은 Xlib를 사용해야합니다. 귀하의 경우 당신은 FBO 또는의 pbuffer에 렌더링한다에서 https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/x11argb_opengl/x11argb_opengl.c

을 : 그것은 FBConfigs을 사용합니다, 당신은 여기를 찾을 수 있도록 전 곰팡이는 최소한의 Xlib를 예를 쓴 일부 시간, 나는 그것을 조금 연장. 보이는 창 프레임 버퍼를 사용하여 저장하지 않을 항목을 렌더링하지 마십시오! 링크 된 코드와 같이 OpenGL 창을 만들면 FBO를 사용합니다. GLX PBuffer를 만드는 것은 GLX 창을 만드는 것과는 다르며, 단지 스크린 밖에있을 것입니다.

트릭은 기본 X 디스플레이 (SSH 전달)를 사용하지 않고 로컬 X 서버에 별도로 연결하는 것입니다. 키는 줄입니다.

Xdisplay = XOpenDisplay(NULL); 

NULL 대신에 로컬 서버에 연결을 전달합니다. 이 작업을하려면 OpenAW 렌더링 서버에서 xauth 항목을 (수동으로) 추가하거나 xauth를 비활성화해야합니다.

3

OSMesa 라이브러리는 GLUT의 드롭 인 대체 기능이 아니며 함께 사용할 수도 있습니다. 상호 작용없이 오프 스크린 렌더링 부분 만 있으면 간단한 이벤트 루프를 직접 구현해야합니다. 예를 들어

:

/* init OSMesa */ 
OSMesaContext  mContext; 
void    *mBuffer; 
size_t    mWidth; 
size_t    mHeight; 

// Create RGBA context and specify Z, stencil, accum sizes 
mContext = OSMesaCreateContextExt(OSMESA_RGBA, 16, 0, 0, NULL); 
OSMesaMakeCurrent(mContext, mBuffer, GL_UNSIGNED_BYTE, mWidth, mHeight); 

이 후에는 정상적인 OpenGL은 렌더링을 호출하고 glFinish() 호출 후에 결과가 mBuffer 포인터를 통해 액세스 할 수 있습니다 사용할 수 있습니다 냈다. 당신이 이벤트 루프에서

당신은 당신의 정상적인 등 onDisplay, ONIDLE, 콜백을 호출 할 수 있습니다.

관련 문제