Qt 5 와 Qt 6 의 가장 큰 차이라면 바로 이 QRhi 의 도입일 것이다.
QRhi (Qt Rendering Hardware Interface)는 OpenGL, Vulkan, Metal 및 Direct 3D와 같은 3D API에 대한 Qt의 내부 그래픽 추상화 계층이다.
Qt는 초기 하드웨어 가속 그래픽을 제공하기 위해 OpenGL에만 집중했다. 그것은 QGLWidget이 QWidget 응용프로그램에서 OpenGL을 사용할 때였다. QtQuick의 2세대는 QML로 작성된 장면을 렌더링하기 위해 OpenGL 장면 그래프를 기반으로 구축되었다.
그러나 OpenGL은 Windows에서 한계가 있었다. Microsoft는 Direct3D를 적극적으로 개발하고있으며 Apple은 OpenGL을 더 이상 사용하지 않는 동시에 운영 체제에서 그래픽 장면을 렌더링하는 표준 방법으로 Metal을 도입했다. 또한 OpenGL을 담당하는 Khronos 컨소시엄은 2016년에 Vulkan을 공개했다.
모든 새로운 그래픽 API는 오버헤드를 크게 줄여 GPU 활용을 보다 효과적으로 최적화한다는 공통점이 있다.
따라서 Qt 6의 주요 목표 중 하나는 Qt가 직접적인 OpenGL 사용에서 벗어나 적절한 추상화를 통해 더 다양한 그래픽(Vulkan , Metal 및 Direct3D 와 같은 API)에서 작동할 수 있도록 하는 것이었다.
다음은 Qt 6.0 그래픽 스택의 주요 레이어를 시각화한 것이다.
다양한 그래픽 API에는 자체 셰이더 언어가 있다. Direct3D는 HLSL을 사용하고 Metal은 MSL을 사용하며 OpenGL을 사용할 때는 셰이더를 GLSL로 작성한다.
Qt 6에서는 더 이상 OpenGL 호환 GLSL 셰이더를 직접 사용하지 않는다. 셰이더는 모두 Vulkan 스타일의 GLSL로 작성된 다음 이를 SPIR-V라는 중간 형식으로 컴파일한 후 다양한 백엔드에 적합한 최종 결과로 변환한다. 다행스럽게도 Qt에는 qsb(Qt Shader Baker)라는 도구가 함께 제공되어 작업을 수행하고 모든 다양한 API 백엔드에 대한 결과를 단일 파일에 포함한다.
Qt Quick을 사용하는 QML 애플리케이션에서 ShaderEffect 밑 QSGMaterialShader를 사용 할 때마다 애플리케이션은 .qsb 파일 형식으로 된 셰이더 팩을 제공해야한다. 개발자가 새로운 도구를 직접 다루어야한다는 의미는 아니다. 이것은 qsb 도구에 의해 생성된다.
OpenGL을 어떤 방식으로든 직접 사용하고 다른 그래픽 API와 함께 작동하는 데 관심이없는 애플리케이션을 개발한다면? 예를 들어 QQuickFramebufferObject
를 사용하거나 QQuickWindow::beforeRendering()
과 같은 시그널에 연결하여 Qt Quick 장면 아래 또는 위에 자체 OpenGL 렌더링을 첨부하는 응용 프로그램들이다. 이것을 위해 setGraphicsApi()
함수가 있다. 응용 프로그램이 항상 OpenGL (또는 Vulkan, Metal 또는 D3D) 만 원하고 다른 것은 원치 않을 수 있다. 이렇게하면 Qt Quick이 해당 QRhi 백엔드를 사용할 것임을 보장하므로 (그렇지 않으면 초기화에 실패 할 것임), Qt Quick도 OpenGL을 통해 렌더링되기 때문에 애플리케이션은 OpenGL로 직접 사용하는 것으로 가정 할 수 있다. 하지만 이것이 응용 프로그램이 다른 유형의 이식 단계를 수행하지 않아도된다는 것은 아니다. 예를 들어 ShaderEffect를 추가로 사용하거나 자체 사용자 지정 머트리얼을 만드는 경우에도 셰이더 및 머트리얼을 처리하는 새로운 방법으로 마이그레이션해야한다.
QRhi는 Qt5 후반부터 옵트인 기능으로 사용 가능했으며 Qt 6.6부터 공개적으로 액세스할 수 있게 되었다. RHI는 매우 낮은 수준이므로 하나의 삼각형처럼 간단한 것을 그리는 것에도 어느 정도의 코드가 필요하다. QtQuick 프로그램에 단순한 조명에 셰이더를 추가하고 3D 개체를 표시하려는 경우 상위 수준의 다른 솔루션(예: QtQuick의 ShaderEffect 또는 3D 장면의 Qt 3D)을 고려하는게 편할 수 있다.
만약 이것을 직접 사용해 완벽한 크로스플랫폼 3D UI를 개발해 보고 싶다면 다음과 같은 QRhi 예제가 좋은 시작점이 될 수 있다.
https://doc.qt.io/qt-6/qtgui-rhiwindow-example.html
https://doc.qt.io/qt-6/qtquick-scenegraph-rhiunderqml-example.html