2017-09-18 1 views
2

내 응용 프로그램에 OpenGL을 사용하여 무언가를 그리는 타사 코드가 포함되어 있습니다. 내가 할 수있는 일은 전체 스크린 표면과 마우스/터치 스크린 이벤트를 제공하는 것뿐입니다. 전체 화면 크기 Item을 만들고 타사 렌더링 용으로 남겨 둘 수 있다고 가정 해 보겠습니다. 렌더는 뷰를 업데이트하기 위해 나를 위해 어떤 신호를 내 보낸다 (어쩌면 임의의 스레드에서 QMetaObject::invokeMethod을 통해). 컨텍스트에 일시적으로 칠하도록 QML을 차단하는 방법?타사 렌더링을 위해 빈 QML 항목의 OpenGL 컨텍스트를 제공하는 방법은 무엇입니까?

이 어떻게 위의 을 구현할 수 있습니다으로 설명? 이러한 워크 플로우를 기술적으로 생성 할 수 있습니까?

원하는 달성하기가 더 현명한 방법입니다. 어쩌면 FBO를 사용하는 것이 더 좋을까요?

나는이 비동기 할 수 있습니까? 나는. 그 렌더링은 별도의 스레드에 자체 메시지를 포함합니다.

+3

에서 [Qt는 빠른 장면 그래프 (http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html)은 문서 페이지 설명 좋은 예 통합을위한 다양한 옵션. 그 질문을보다 구체적으로 만드는 데 도움이 될 것입니다. – Velkan

답변

2

당신은 QQuickFramebufferObject에보고해야한다.

작동 방법 :

당신은 하위 클래스를 생성하고 QML에서 그것을 실체화. 당신은 오버라이드 (override) 할 필요는

Renderer *QQuickFramebufferObject::createRenderer() 

당신은

렌더러 http://doc.qt.io/qt-5/qquickframebufferobject-renderer.html의 자신의 서브 클래스를 만들려면 Renderer::render()이 FBOItem에 영향을 미칠 것 화면에 렌더링의 빈 내부에 넣어 모든 코드입니다. Qt는 귀하의 FBO를 구속 할 책임이 있습니다.

지금 당신은 당신이 void Renderer::update() 전화 UI에 수정을 요청해야하는 경우. 그가 그리는 필요하지만 모든 OpenGL은 방법 (glDrawArrays이 ...)이 렌더러의 렌더링 함수 내에서 작성해야 할 때

귀하의 써드 파티 렌더러는이 메소드를 호출해야합니다. 이 메소드에 액세스하기 전에 FBO를 바인딩하십시오. 어쩌면 QQuickFramebufferObject가 ThirdParty 신호를 청취하고 일부 상태 또는 std :: functions를 통해 렌더러 구성 요소의 render 메서드를 수정하고 업데이트를 호출해야합니다. 여기

http://blog.qt.io/blog/2015/05/11/integrating-custom-opengl-rendering-with-qt-quick-via-qquickframebufferobject/

관련 문제