문제

나는있다 MDI Qt. 일부 하위 바람은 포함됩니다 QGLWidgetS, 즉 OpenGL 컨텍스트. 이러한 가장 두드러진 것은 OpenGL 정점 및 조각 셰이더를 사용하여 데이터를 시각화합니다.

물론 볼 수있는 모든 하위 바람을 포함하여 응용 프로그램의 기본 창의 스크린 샷을 프로그래밍 방식으로 캡처해야합니다. 처음에는 쉽게 들립니다 ( "확실히 여러 번 질문을 받았으므로 Google It!")하지만 자세히 살펴본 후 약간 까다로워지는 것 같습니다 ...

이제 지금까지 시도한 내용은 다음과 같습니다.

  1. QPixmap::grabWidget 셰이더 프로그램을 사용하는 하위 바람에 대해서는 작동하지 않습니다. 리디렉션 컨텍스트가 필요한 OpenGL 확장을 지원하지 않기 때문입니다. (렌더링 코드는 관련 컨텍스트가 필요한 확장을 지원하고 그렇지 않은 경우 계속 거부합니다.)
  2. QPixmap::grabWindow 기본 프리미티브 만 사용하는 것조차도 모든 OpenGL 컨텍스트를 비어 놓습니다.
  3. QGLWidget::grabFrameBuffer 작동하지만 특정 하위 바람의 OpenGL 컨텍스트 만 캡처하는 반면 전체 응용 프로그램을 가져오고 싶습니다 (본질적으로 What Alt+PrtScr Windows에서).

또한 첫 번째 #2를 시도한 다음 모든 하위 바람에 대해 #3을 반복하려고 시도했습니다. #3의 결과를 #2에서 이미지의 올바른 위치에 복사했습니다. 이것은 일부 서브 와인더가 겹치게 될 때까지 매우 잘 작동했습니다.이 경우 #3의 이미지는 서브 윈도 프레임 등을 덮어 씁니다. 따라서이 접근법은 모든 불쾌한 코너 케이스를 처리하기 위해 훨씬 더 많은 코드가 필요할 것입니다 ...

몇 가지 추가 배경 : 스크린 샷을 얻으면 비디오를 만들기 위해 스크린 샷을 세분화 할 것입니다. ffmpeg. 그것은이 질문을 일종의 연속으로 만듭니다 (첫 번째 부분) 나의 이전 질문; 앱이 단일 컨텍스트 독립형 OpenGL 프로그램에서 전체 창 및 UI 위젯에 QT를 사용하는 것으로 진화하고 서브 윈도에 그래픽을 포함 시켰습니다.

물론 멋진 QT-ish 크로스 플랫폼 솔루션을 선호하지만 Windows 특이 적 해킹에도 의존하는 것을 기꺼이 고려할 것입니다. (내가 볼 수 있듯이 가능해야합니다. Alt+PrtScr 옳은 일을 아주 많이하고 있습니다.)

그렇다면 어떤 제안이 있습니까?

도움이 되었습니까?

해결책

매우 해킹되지만 창문을 숨기지 않고 데스크탑을 캡처합니다. 이 튜토리얼 그리고 창문을 제외한 모든 것을 자르고 있습니까?

보다 일반적으로, OpenGL 사양이 출력이 전면 버퍼에 배치되어야한다고 요구하는 것도 확실하지 않습니다. 구현은 출력에 비디오 오버레이 (또는 Voodoo2-esque VGA Pass-Strough Shenanigans) 만 사용할 수 있습니다.

다른 팁

내가 오프-핸드를 생각할 수있는 유일한 것은 다음 psuedocode를 수행하는 것입니다.

 for each window
     grab the window into its own pixmap
     grab the GL portions and paste into the windows
 order the window pixmaps by depth of the window (deepest first)
 initialize a common pixmap
 for each window pixmap
     paint the window pixmap into the common pixmap at the appropriate location.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top