2015-01-02 4 views
4

Qt 5.4, QtQuick 2.4를 사용하고 있습니다.원시 OpenGL을 QtQuick 응용 프로그램으로 렌더링하려고하면 QQuickWindow :: setClearBeforeRendering이 작동하지 않는 것 같습니다.

기본적으로 원시 OpenGL을 QtQuick/QML로 작성된 응용 프로그램으로 렌더링하고 싶습니다. QQmlApplicationEngine을 사용하는 동안 기본적으로 OpenGL을 렌더링하고 싶습니다.

내가 완료 한 주요 튜토리얼은 (겉으로보기에는) 꽤 표준적인 것으로, here입니다.

그러나이 자습서에서는 QQmlApplicationEngine 대신 QQuickView을 사용하여 QML UI를로드합니다. QQmlApplicationEngine을 사용하도록 코드를 변경하면 GL 렌더링이 더 이상 작동하지 않으며 실제로 이유를 이해할 수 없습니다.

this GitHub의 저장소의 코드가 QQmlApplicationEngine를 사용하여 QtQuick 응용 프로그램에 원시의 OpenGL을 그릴 약속, 심지어는이 약속을 유지하기 위해 관리하지만 QQuickWindow::afterRendering에 접선에 의해 그렇게 (squircle.cpp 라인 79 참조). 이 신호/슬롯 연결이 QQuickQindow::beforeRendering에 후크하도록 변경되면 장면의 GL 부분이 다시 렌더링되지 않은 것으로 나타납니다. IMO는 내가 가지고있는 문제를 재현하는 가장 단순한 예입니다 (일부 상용구를 제외하고).

QQuickWindow::clearBeforeRendering (올바르게) false (동일한 파일의 86 행)로 설정됩니다.

내가 누락 된 항목이 있습니까?

+0

GitHub의 샘플이 제대로 작동하지 않습니다. 'Hello OpenGL'레이블이 표시되지 않습니다. –

답변

2

Qt 5.4에서 Window.contentItem 속성이 도입되어 ApplicationWindow 내용 영역의 그림이 변경되었습니다. 나는 QQuickFramebufferObject에서 파생 된 사용자 정의 항목을 사용하여 수정했습니다. 예를 들어 GitHub에서 찾을 수 있습니다.

예를 들어 FBO__ 매크로가 정의되어 있지 않으면 QtQuick Scenegraph OpenGL-under-Qml 예제의 코드가 사용됩니다. 그리고 setClearBeforeRendering(false)이 더 이상 작동하지 않습니다. 나는 ApplicationWindow이 GUI 렌더링이 발생할 때 전체 창 배경을 지운다 고 나는 믿는다. 백그라운드 이벤트 지우기를 어떻게 든 (flags 속성 및 이벤트 처리기로) 가로 채지 만 아직 수행하지 못했습니다. QQuickFramebufferObject을 기반으로하는 사용자 정의 항목은 정상적으로 작동하지만 그림과 비교할 때 메모리 오버 헤드가 QQuickQindow::beforeRendering() 인 것 같습니다.

3

Qt 5.4로 업그레이드 할 때도 이와 동일한 문제가있었습니다. 내가 발견 한 해결 방법은 기본 QML ApplicationWindow 항목의 배경색을 변경하는 것입니다. 색상 속성에 "흰색"이외의 다른 퍼팅

Main.qml ...

ApplicationWindow 
{ 
    id: mainWindow 
    width: 800 
    height: 600 
    color: "black" 

나를 위해 작동합니다. 어떤 이유로 배경을 흰색으로 만드는 것은 beforeRendering() 신호를 사용하여 QQuickItem에서 OpenGL로 그릴 때 setClearBeforeRendering (false)을 재정의합니다.

어쨌든 사용자 지정 OpenGL 코드에서 glClear를 사용하여 배경을 지워야하고 드로잉이 완료되었을 때 나타나는 색이 될 수 있기 때문에 사용하는 색은 중요하지 않습니다.

그냥 흰색을 사용하지 마십시오!

다른 사람이 달리 알리기 전까지는 이것이 버그라고 가정합니다.

+0

누군가가 버그 보고서를 작성해야합니다. 이 빠른 수정 주셔서 감사합니다 :) –