씬 그래프 - QML 아래에서 Vulkan
Qt Quick 씬에서 Vulkan으로 직접 렌더링하는 방법을 보여줍니다.
참고: 이 예제를 컴파일하려면 SDK가 필요합니다. 설치해야 하는 항목에 대한 자세한 내용은 벌칸 통합을 참조하세요.
개요
이 예제에서는 QQuickWindow::beforeRendering() 및 QQuickWindow::beforeRenderPassRecording() 신호를 사용하여 Qt Quick 씬 아래에 커스텀 Vulkan 콘텐츠를 그립니다. QML은 위에 텍스트 레이블을 렌더링하는 데 사용됩니다.
이 예제는 대부분의 경우 QML의 OpenGL, QML의 Direct3D 11 및 Metal 예제와 동일하며, 네이티브 API만 다를 뿐 모두 동일한 커스텀 콘텐츠를 렌더링합니다.
이 문서에서는 커스텀 벌칸 렌더링에 대한 자세한 내용은 다루지 않고 QML 활용에 대한 구체적인 내용을 다룹니다.
QML에서 벌칸 렌더링에 영향 주기
이 예제는 QML에 노출된 값을 사용하여 벌칸 렌더링을 제어하는 방법을 보여줍니다.
임계값 t
을 QML에 노출하려면 VulkanSquircle
의 정의에서 Q_OBJECT, Q_PROPERTY, QML_ELEMENT 매크로를 다음과 같이 사용합니다:
class VulkanSquircle : public QQuickItem { Q_OBJECT Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged) QML_ELEMENT
그런 다음 공개 및 비공개 항목을 선언합니다:
public: VulkanSquircle(); qreal t() const { return m_t; } void setT(qreal t); signals: void tChanged(); public slots: void sync(); void cleanup(); private slots: void handleWindowChanged(QQuickWindow *win); private: void releaseResources() override; qreal m_t = 0; SquircleRenderer *m_renderer = nullptr;
그런 다음 main.qml
에서 NumberAnimation 을 사용하여 임계값에 애니메이션을 적용합니다.
VulkanSquircle { SequentialAnimation on t { NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad } NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad } loops: Animation.Infinite
t
변수는 최종적으로 동그라미를 그리는 SPIR-V 셰이더 프로그램에서 사용됩니다.
신호를 사용하여 커스텀 Vulkan 콘텐츠 렌더링하기
QQuickWindow::beforeRendering() 및 QQuickWindow::beforeRenderPassRecording() 신호가 사용됩니다.
QQuickWindow::beforeRendering() 신호는 씬 그래프가 렌더링을 시작하기 전에 모든 프레임이 시작될 때 방출됩니다. 즉, 이 신호에 대한 응답으로 수행되는 모든 Vulkan 드로우 호출은 Qt Quick 항목 아래에 스택됩니다. 커스텀 벌칸 명령은 씬 그래프에서 사용하는 것과 동일한 명령 버퍼에 기록되기 때문에 두 개의 신호가 있습니다.
이전 렌더링() 함수만으로는 충분하지 않은데, 그 이유는 이 함수가 프레임이 시작될 때 방출되고, vkCmdBeginRenderPass를 사용하여 renderpass
인스턴스의 시작을 기록하기 전에 방출되기 때문입니다.
해결책: beforeRenderPassRecording()에 연결하면 애플리케이션의 자체 명령과 씬 그래프의 스캐폴딩이 올바른 순서로 끝납니다.
신호 연결은 sync()
함수를 통해 이루어집니다:
void VulkanSquircle::sync() { if (!m_renderer) { m_renderer = new SquircleRenderer; // Initializing resources is done before starting to record the // renderpass, regardless of wanting an underlay or overlay. connect(window(), &QQuickWindow::beforeRendering, m_renderer, &SquircleRenderer::frameStart, Qt::DirectConnection); // Here we want an underlay and therefore connect to // beforeRenderPassRecording. Changing to afterRenderPassRecording // would render the squircle on top (overlay). connect(window(), &QQuickWindow::beforeRenderPassRecording, m_renderer, &SquircleRenderer::mainPassRecordingStart, Qt::DirectConnection); } m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio()); m_renderer->setT(m_t);
QQuickWindow::afterRendering() 및 QQuickWindow::afterRenderPassRecording() 신호에 연결하여 Qt Quick 씬 위에 Vulkan 콘텐츠를 렌더링하는 또 다른 방법도 있습니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.