QVulkanWindow Class
QVulkanWindow 클래스는 Vulkan 렌더링을 수행하기 위한 QWindow 의 편의 하위 클래스입니다. 더 보기...
| 헤더: | #include <QVulkanWindow> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
| 상속: | QWindow |
공개 유형
(since 6.7) | EnabledFeatures2Modifier |
| EnabledFeaturesModifier | |
| enum | Flag { PersistentResources } |
| flags | Flags |
| QueueCreateInfoModifier |
공개 함수
| QVulkanWindow(QWindow *parent = nullptr) | |
| virtual | ~QVulkanWindow() |
| QList<VkPhysicalDeviceProperties> | availablePhysicalDevices() |
| QMatrix4x4 | clipCorrectionMatrix() |
| VkFormat | colorFormat() const |
| int | concurrentFrameCount() const |
| virtual QVulkanWindowRenderer * | createRenderer() |
| VkCommandBuffer | currentCommandBuffer() const |
| int | currentFrame() const |
| VkFramebuffer | currentFramebuffer() const |
| int | currentSwapChainImageIndex() const |
| VkRenderPass | defaultRenderPass() const |
| VkFormat | depthStencilFormat() const |
| VkImage | depthStencilImage() const |
| VkImageView | depthStencilImageView() const |
| VkDevice | device() const |
| uint32_t | deviceLocalMemoryIndex() const |
| QVulkanWindow::Flags | flags() const |
| void | frameReady() |
| QImage | grab() |
| VkCommandPool | graphicsCommandPool() const |
| VkQueue | graphicsQueue() const |
| uint32_t | graphicsQueueFamilyIndex() const |
| uint32_t | hostVisibleMemoryIndex() const |
| bool | isValid() const |
| VkImage | msaaColorImage(int idx) const |
| VkImageView | msaaColorImageView(int idx) const |
| VkPhysicalDevice | physicalDevice() const |
| const VkPhysicalDeviceProperties * | physicalDeviceProperties() const |
| VkSampleCountFlagBits | sampleCountFlagBits() const |
| void | setDeviceExtensions(const QByteArrayList &extensions) |
(since 6.7) void | setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier) |
(since 6.7) void | setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier) |
| void | setFlags(QVulkanWindow::Flags flags) |
| void | setPhysicalDeviceIndex(int idx) |
| void | setPreferredColorFormats(const QList<VkFormat> &formats) |
| void | setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier) |
| void | setSampleCount(int sampleCount) |
| QVulkanInfoVector<QVulkanExtension> | supportedDeviceExtensions() |
| QList<int> | supportedSampleCounts() |
| bool | supportsGrab() const |
| VkImage | swapChainImage(int idx) const |
| int | swapChainImageCount() const |
| QSize | swapChainImageSize() const |
| VkImageView | swapChainImageView(int idx) const |
신호
| void | frameGrabbed(const QImage &image) |
정적 공용 멤버
| const int | MAX_CONCURRENT_FRAME_COUNT |
상세 설명
QVulkanWindow는 Vulkan을 지원하는 ` QWindow `로, Vulkan 디바이스, 그래픽 큐, 명령 풀 및 버퍼, 깊이-스텐실 이미지, 더블 버퍼링된 FIFO 스왑체인을 관리하며, 크기 조정과 같은 이벤트나 그래픽 및 프레젠테이션을 모두 지원하는 디바이스 큐가 없는 특수한 상황, 장치 손실 시나리오, 렌더링된 콘텐츠를 다시 읽어오는 등의 추가 기능에 대해서도 올바른 동작을 보장합니다. 개념적으로 이는 Vulkan 세계에서 QOpenGLWindow 에 상응하는 객체입니다.
참고: QVulkanWindow를 사용한다고 해서 항상 완전히 사용자 정의된 ` QWindow ` 서브클래스를 구현할 필요가 없어지는 것은 아닙니다. 고급 사용 사례에서는 QVulkanWindow만으로는 충분하지 않을 수 있기 때문입니다.
QVulkanWindow는 QWidget::createWindowContainer()을 통해 ` QWidget` 기반 사용자 인터페이스에 임베드될 수 있습니다. 그러나 이 접근 방식에는 몇 가지 제한 사항이 있습니다. 먼저 documentation 를 꼼꼼히 검토하시기 바랍니다.
QVulkanWindow를 사용하는 일반적인 애플리케이션은 다음과 같을 수 있습니다:
class VulkanRenderer : public QVulkanWindowRenderer
{
public:
VulkanRenderer(QVulkanWindow*w): m_window(w), m_devFuncs(nullptr) { }
void initResources() override
{
m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device());
// ..
}
void initSwapChainResources() override { /* ... */ }
void releaseSwapChainResources() override { /* ... */ }
void releaseResources() override { /* ... */ }
void startNextFrame() override
{
VkCommandBuffer cmdBuf = m_window->currentCommandBuffer();
// ...
m_devFuncs->vkCmdBeginRenderPass(commandBuffer, renderPassBegin, contents);
// ...
m_window->frameReady();
}
private:
QVulkanWindow*m_window;
QVulkanDeviceFunctions*m_devFuncs;
};
class VulkanWindow : public QVulkanWindow
{
public:
QVulkanWindowRenderer*createRenderer() override {
return new VulkanRenderer(this);
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
// 사용 가능한 경우 표준 유효성 검사 레이어를 활성화합니다.
inst.setLayers({ "VK_LAYER_KHRONOS_validation" });
if (!inst.create())
qFatal("Failed to create Vulkan instance: %d", inst.errorCode());
VulkanWindow w;
w.setVulkanInstance(&inst);
w.showMaximized();
return app.exec();
}예제에서 볼 수 있듯이, QVulkanWindow 사용의 주요 패턴은 다음과 같습니다:
- QVulkanInstance 는 QWindow::setVulkanInstance()를 통해 연결됩니다. 이후 QWindow::vulkanInstance()를 통해 어디서나, 어떤 스레드에서든 이 객체를 불러올 수 있습니다.
- QVulkanInstance 와 마찬가지로, 실제 초기화 전에 supportedDeviceExtensions()을 통해 디바이스 확장 기능을 조회할 수 있습니다. 확장 기능 활성화를 요청하려면 setDeviceExtensions()을 사용합니다. 이러한 호출은 창이 표시되기 전, 즉 show() 또는 이와 유사한 함수를 호출하기 전에 수행되어야 합니다. 지원되지 않는 확장 기능 요청은 문제없이 무시됩니다.
- 렌더러는 ` QVulkanWindowRenderer `의 서브클래스로 구현되며, 그 인스턴스는 ` createRenderer()` 팩토리 함수에서 생성됩니다.
- 핵심 Vulkan 명령은 QVulkanFunctions 객체를 통해 노출되며, QVulkanInstance::functions()를 호출하여 이 객체를 가져올 수 있습니다. 장치 수준 함수는 QVulkanInstance::deviceFunctions()를 호출하여 VkDevice를 생성한 후에 사용할 수 있습니다.
- 다음 프레임에 대한 드로우 호출 생성은 QVulkanWindowRenderer::startNextFrame()에서 이루어집니다. 구현에서는 currentCommandBuffer()에서 반환된 명령 버퍼에 명령을 추가해야 합니다. 함수에서 반환된다고 해서 명령이 제출 준비가 된 것은 아닙니다. 오히려 frameReady()을 명시적으로 호출해야 합니다. 이를 통해 여러 스레드에서 명령을 비동기적으로 생성할 수 있습니다. 간단한 구현에서는 QVulkanWindowRenderer::startNextFrame() 함수가 종료될 때 frameReady()를 호출하기만 하면 됩니다.
- 기본적인 Vulkan 리소스(물리적 장치, 그래픽 큐, 명령 풀, 창의 메인 명령 버퍼, 이미지 형식 등)는 경량 게터 함수를 통해 QVulkanWindow에 노출됩니다. 이들 중 일부는 편의상 제공되는 것이며, 애플리케이션은 언제든지 Vulkan API를 통해 추가 리소스를 직접 조회, 생성 및 관리할 수 있습니다.
- 렌더러는 창 자체와 마찬가지로 GUI/메인 스레드에서 실행됩니다. 이 스레드는 OpenGL에서 스왑 간격이 1일 때와 유사하게 프레젠테이션 속도로 제한됩니다. 그러나 렌더러 구현체는 필요하다고 판단되는 방식으로 여러 스레드를 자유롭게 활용할 수 있습니다. vulkanInstance(), currentCommandBuffer() 등과 같은 액세서 함수는 어떤 스레드에서든 호출할 수 있습니다. 메인 명령 버퍼의 제출, present 호출의 큐 등록, 다음 프레임의 생성은 GUI/메인 스레드에서 frameReady()가 호출될 때까지 시작되지 않습니다.
- 창이 표시되면 콘텐츠가 자동으로 업데이트됩니다. 추가 업데이트는 QWindow::requestUpdate()를 호출하여 요청할 수 있습니다. 지속적으로 렌더링하려면 frameReady() 호출 후 requestUpdate()를 호출하십시오.
문제 해결을 위해 qt.vulkan 로깅 범주를 활성화하십시오. 중대한 오류는 qWarning()을 통해 자동으로 출력됩니다.
OpenGL과 Vulkan 간의 좌표계 차이
주의해야 할 두 가지 주요 차이점이 있습니다. 첫째, 클립 공간에서 Vulkan의 Y축은 화면 아래쪽을 가리키는 반면, OpenGL은 위쪽을 가리키는 Y축을 사용합니다. 둘째, 표준 OpenGL 투영 행렬은 근면과 원면의 값을 각각 -1과 1로 가정하는 반면, Vulkan은 0과 1을 선호합니다.
애플리케이션이 정점 데이터의 Y 좌표를 뒤집지 않고도 OpenGL 기반 코드에서 마이그레이션할 수 있도록 돕고, Vulkan 뷰포트의 minDepth와 maxDepth를 0과 1로 유지한 상태에서 QMatrix4x4::perspective()와 같은 QMatrix4x4 함수를 사용할 수 있도록 하기 위해, QVulkanWindow는 clipCorrectionMatrix()를 호출하여 가져올 수 있는 보정 행렬을 제공합니다.
멀티샘플링
기본적으로 비활성화되어 있지만, QVulkanWindow는 멀티샘플 앤티앨리어싱을 완벽하게 지원합니다. 추가 색상 버퍼 및 스왑체인(swapchain)의 비멀티샘플 버퍼로의 변환은 모두 자동으로 관리됩니다.
지원되는 샘플 수를 조회하려면 ` supportedSampleCounts()`를 호출하십시오. 반환된 집합에 4, 8, ...이 포함되어 있을 경우, 해당 값 중 하나를 ` setSampleCount()`에 전달하면 멀티샘플 렌더링이 요청됩니다.
참고: QSurfaceFormat::setSamples()과 달리 , 지원되는 샘플 수 목록은 애플리케이션에 사전에 공개되며, setSampleCount()에서는 더 낮은 샘플 수로 자동 폴백되지 않습니다. 요청된 값이 지원되지 않는 경우 경고가 표시되고 멀티샘플링이 적용되지 않습니다.
이미지 다시 읽기
supportsGrab()가 true를 반환하면, QVulkanWindow는 컬러 버퍼에서 QImage 로 이미지를 다시 읽어올 수 있습니다. grab()는 속도가 느리고 비효율적인 작업이므로 빈번한 사용은 피해야 합니다. 그럼에도 불구하고, 애플리케이션이 스크린샷을 찍거나, 도구 및 테스트에서 GPU 렌더링 출력을 처리하고 검증할 수 있게 해주기 때문에 유용한 기능입니다.
sRGB 지원
스왑체인 이미지 형식과 관련하여 많은 애플리케이션은 QVulkanWindow의 기본 동작으로도 충분하지만, ` setPreferredColorFormats()`을 사용하면 미리 정의된 형식을 요청할 수 있습니다. 이는 특히 sRGB 색 공간에서 작업할 때 유용합니다. ` VK_FORMAT_B8G8R8A8_SRGB `과 같은 형식을 전달하면, 가능한 경우 sRGB 형식이 선택됩니다.
검증 레이어
애플리케이션 개발 중에는 Vulkan 유효성 검사 레이어를 활성화해 두는 것이 매우 유용할 수 있습니다. 위의 예제 코드에서 볼 수 있듯이, 시스템의 Vulkan 드라이버 스택에 필요한 레이어가 포함되어 있다고 가정할 때, QVulkanInstance::create()를 호출하기 전에 QVulkanInstance 에 대해 QVulkanInstance::setLayers()를 호출하면 유효성 검사가 활성화됩니다.
참고: 플랫폼별 차이점을유의하십시오 . 데스크톱 플랫폼의 경우 일반적으로 Vulkan SDK를 설치하는 것만으로도 충분합니다. 그러나 예를 들어 Android의 경우 애플리케이션과 함께 추가 공유 라이브러리를 배포해야 하며, 다른 검증 레이어 이름 목록을 사용해야 합니다. 자세한 내용은 Android Vulkan 개발 페이지를 참조하십시오.
참고: QVulkanWindow는 Vulkan API 버전 1.0.13부터 이 기능이 더 이상 사용되지 않게 되었기 때문에 디바이스 레이어를 노출하지 않습니다.
레이어, 디바이스 기능 및 확장 기능
인스턴스 레이어를 활성화하려면, ` QVulkanInstance`을 생성하기 전에 ` QVulkanInstance::setLayers()`를 호출하십시오. 사용 가능한 인스턴스 레이어를 조회하려면 ` QVulkanInstance::supportedLayers()`를 호출하십시오.
디바이스 확장을 활성화하려면, QVulkanWindow를 설정하는 초기 단계에서 setDeviceExtensions()를 호출하십시오. 사용 가능한 디바이스 확장을 조회하려면, supportedDeviceExtensions()를 호출하십시오.
지원되지 않는 레이어나 확장을 지정하더라도 오류 없이 처리됩니다. 즉, 인스턴스나 장치 생성이 실패하지는 않으며, 해당 레이어나 확장 요청은 무시됩니다.
디바이스 기능과 관련하여, QVulkanWindow는 vkGetPhysicalDeviceFeatures()에서 지원되는 것으로 보고된 모든 Vulkan 1.0 기능을 활성화합니다. 이 규칙의 예외로, robustBufferAccess 는 절대 활성화되지 않습니다. 해당 기능을 활성화하려면 아래에 설명된 콜백 메커니즘을 사용하십시오.
이는 항상 바람직한 것은 아니며, Vulkan 1.1 이상에서는 불충분할 수 있습니다. 따라서 setEnabledFeaturesModifier()에 콜백 함수를 등록함으로써, 장치 생성에 사용되는 VkPhysicalDeviceFeatures를 완전히 제어하는 것도 가능합니다. 이 함수가 설정되면 콜백 함수가 호출되어 VkPhysicalDeviceFeatures 또는 VkPhysicalDeviceFeatures2를 변경할 수 있게 됩니다.
보안 고려 사항
QVulkanWindow가 사용하는 모든 데이터는 신뢰할 수 있는 콘텐츠여야 합니다. 여기에는 setDeviceExtensions()에 전달된 디바이스 확장 이름, setEnabledFeaturesModifier() 및 setQueueCreateInfoModifier()를 통해 등록된 콜백에 의해 작성된 디바이스 생성 매개변수, 그리고 QVulkanWindowRenderer 구현에 의해 생성된 모든 렌더링 콘텐츠 및 Vulkan 명령 매개변수가 포함됩니다. Vulkan 구현체 자체는 신뢰할 수 있는 인-프로세스 플랫폼 종속성입니다. 자세한 내용은 QVulkanInstance 를 참조하십시오.
경고: 애플리케이션 개발자는 애플리케이션의 일부가 아니며 개발자의 통제 범위를 벗어난 사용자 제공 콘텐츠의 투입을 허용하기 전에, 그로 인해 발생할 수 있는 잠재적 영향을 신중하게 고려해야 합니다.
QVulkanInstance 및 QWindow도 참조하십시오 .
멤버 유형 문서
[since 6.7] QVulkanWindow::EnabledFeatures2Modifier
그래픽 초기화 중에 호출되어 VkDeviceCreateInfo로 전달되는 VkPhysicalDeviceFeatures2를 수정하는 함수입니다.
기본적으로 ` QVulkanWindow `는 물리적 장치가 지원한다고 보고하는 모든 Vulkan 1.0 핵심 기능을 활성화하지만, 일부 예외가 있습니다. 특히, 예기치 않은 성능 저하를 방지하기 위해 ` robustBufferAccess `는 항상 비활성화됩니다.
그러나 Vulkan 1.1, 1.2 또는 1.3 기능 및 확장을 사용할 때는 이 조치만으로는 항상 충분하지 않을 수 있습니다. 따라서 이 콜백 메커니즘이 제공됩니다. 런타임에 Vulkan 1.0만 관련된다면, 대신 ` setEnabledFeaturesModifier()`를 사용하십시오.
sType 가 설정된 상태로 콜백 함수에 전달되는 VkPhysicalDeviceFeatures2 참조는 나머지 멤버가 모두 0으로 초기화되어 있습니다. 멤버를 true로 변경하거나, 필요에 따라 pNext 체인을 설정하는 것은 함수의 몫입니다.
참고: pNext 체인을 설정할때는 , 예를 들어 QVulkanWindow 하위 클래스의 멤버 변수로 저장하는 등의 방법을 통해 참조되는 객체의 수명이 충분히 길도록 해야 합니다.
이 typedef는 Qt 6.7에서 도입되었습니다.
setEnabledFeaturesModifier()도 참조하십시오 .
QVulkanWindow::EnabledFeaturesModifier
그래픽 초기화 과정에서 호출되어, Vulkan 장치 객체를 생성할 때 전달된 VkPhysicalDeviceFeatures를 변경하는 함수입니다.
기본적으로 ` QVulkanWindow `는 물리적 장치가 지원한다고 보고하는 모든 Vulkan 1.0 핵심 기능을 활성화하지만, 몇 가지 예외가 있습니다. 특히, 예기치 않은 성능 저하를 방지하기 위해 ` robustBufferAccess `는 항상 비활성화됩니다.
전달된 VkPhysicalDeviceFeatures 참조는 함수가 호출되는 시점에 모든 값이 0으로 초기화됩니다. 멤버를 적절히 변경하는 것은 함수의 몫입니다.
참고: Vulkan 1.1, 1.2 또는 1.3 기능을제어하려면 대신 ` EnabledFeatures2Modifier `를 사용하십시오.
setEnabledFeaturesModifier()도 참조하십시오 .
enum QVulkanWindow::Flag
flags QVulkanWindow::Flags
이 열거형은 ` setFlags()` 함수에 전달할 수 있는 플래그를 설명합니다.
| 상수 | 상수명 | 설명 |
|---|---|---|
QVulkanWindow::PersistentResources | 0x01 | 창이 비가시 상태가 되었을 때 그래픽 리소스가 해제되지 않도록 보장합니다. 기본 동작은 모든 리소스를 해제하고, 나중에 다시 가시 상태가 되었을 때 재초기화하는 것입니다. |
Flags 유형은 QFlags<Flag>에 대한 typedef입니다. 이 유형은 Flag 값들의 OR 조합을 저장합니다.
QVulkanWindow::QueueCreateInfoModifier
그래픽 초기화 중에 호출되어 생성해야 할 추가 큐를 추가하는 함수입니다.
렌더러가 기본 그래픽 큐 외에 추가 큐(예: 전송 큐)가 필요한 경우 이 함수를 설정합니다. 제공된 큐 패밀리 속성을 사용하여 추가 큐의 인덱스를 선택할 수 있습니다. 렌더러는 이후 initResources()에서 실제 큐를 요청할 수 있습니다.
참고: 추가 그래픽 큐를 요청할때 , Qt 자체는 항상 그래픽 큐를 요청합니다. 추가 큐를 얻으려면 queueCreateInfo에서 적절한 항목을 찾아 이를 조작해야 합니다.
setQueueCreateInfoModifier()도 참조하십시오 .
멤버 함수 문서
[explicit] QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
지정된 ` parent`를 사용하여 새로운 `QVulkanWindow`를 생성합니다.
표면 유형은 ` QSurface::VulkanSurface`로 설정됩니다.
[virtual noexcept] QVulkanWindow::~QVulkanWindow()
소멸자.
QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()
시스템에서 지원되는 물리적 장치의 속성 목록을 반환합니다.
참고: 이 함수는 창을 표시하기 전에 호출할 수 있습니다.
QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()
OpenGL과 Vulkan 간의 좌표계 차이를 보정하는 데 사용할 수 있는 투영 매트릭스( QMatrix4x4 )를 반환합니다.
투영 행렬에 이 행렬을 미리 곱해 주면, 애플리케이션은 Y축이 위쪽을 가리킨다고 계속 가정할 수 있으며, 정점 Z 위치에 대한 추가 보정 없이도 뷰포트의 minDepth와 maxDepth를 각각 0과 1로 설정할 수 있습니다. 이렇게 하면 OpenGL 애플리케이션의 지오메트리를 OpenGL 컬링 및 전면면 설정과 일치하는 래스터화 상태를 가정하여 있는 그대로 사용할 수 있습니다.
VkFormat QVulkanWindow::colorFormat() const
스왑체인에서 사용하는 색상 버퍼 형식을 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::initResources() 호출 시점부터 QVulkanWindowRenderer::releaseResources() 호출 시점까지만호출할 수 있습니다.
setPreferredColorFormats()도 참조하십시오 .
int QVulkanWindow::concurrentFrameCount() const
동시에 활성 상태가 될 수 있는 프레임의 수를 반환합니다.
참고: 이 값은 QVulkanWindow 의 전체 수명 동안 일정합니다.
class Renderer {
void startNextFrame();
// ...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
QVulkanWindow *m_window = nullptr;
};
void Renderer::startNextFrame()
{
const int count = m_window->concurrentFrameCount();
// for (int i = 0; i < count; ++i)
// m_uniformBufInfo[i] = ...
// ...
}참조: currentFrame()
[virtual] QVulkanWindowRenderer *QVulkanWindow::createRenderer()
QVulkanWindowRenderer 의 새로운 인스턴스를 반환합니다.
이 가상 함수는 창의 수명 주기 동안, 창이 처음 표시된 후 어느 시점에서 한 번 호출됩니다.
기본 구현은 null을 반환하므로, 버퍼를 지우는 것 외에는 렌더링이 수행되지 않습니다.
창은 반환된 렌더러 객체에 대한 소유권을 갖습니다.
VkCommandBuffer QVulkanWindow::currentCommandBuffer() const
현재 스왑 체인 프레임에 대한 활성 명령 버퍼를 반환합니다. ` QVulkanWindowRenderer::startNextFrame()`의 구현체는 이 명령 버퍼에 명령을 추가해야 합니다.
참고: 이 함수는 startNextFrame() 내부에서만 호출되어야 하며, 비동기 명령어 생성의 경우 frameReady() 호출 전까지만 호출되어야 합니다.
int QVulkanWindow::currentFrame() const
[0, concurrentFrameCount() - 1] 범위 내의 현재 프레임 인덱스를 반환합니다.
렌더러 구현체는 프레임 N이 여전히 활성 상태인 프레임 N - 1, N - 2, ... N - concurrentFrameCount() + 1에서 사용하는 데이터를 변경하지 못하도록, 유니폼 데이터 및 기타 동적 리소스가 여러 복사본으로 존재하도록 보장해야 합니다.
동적 배열 크기에 의존하지 않으려면, 애플리케이션은 배열을 선언할 때 ` MAX_CONCURRENT_FRAME_COUNT `를 사용할 수 있습니다. 이 값은 ` concurrentFrameCount()`에서 반환된 값과 항상 같거나 더 크다는 것이 보장됩니다. 그런 다음 이러한 배열은 이 함수에서 반환된 값을 사용하여 인덱싱할 수 있습니다.
class Renderer {
void startNextFrame();
// ...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
QVulkanWindow *m_window = nullptr;
};
void Renderer::startNextFrame()
{
VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
// ...
}참고: 이 함수는 startNextFrame() 내부에서만 호출되어야 하며, 비동기 명령어 생성의 경우 frameReady() 호출 전까지만 호출되어야 합니다.
concurrentFrameCount()도 참조하십시오 .
VkFramebuffer QVulkanWindow::currentFramebuffer() const
기본 렌더 패스를 사용하여 현재 스왑체인 이미지에 대한 VkFramebuffer를 반환합니다.
멀티샘플링이 사용되지 않을 경우 이 프레임버퍼에는 두 개의 어태치먼트(색상, 깊이-스텐실)가 있으며, ` sampleCountFlagBits()`가 ` VK_SAMPLE_COUNT_1_BIT`보다 클 경우 세 개의 어태치먼트(색상 해상도, 깊이-스텐실, 멀티샘플 색상)가 있습니다. 렌더러는 예를 들어 클리어 값을 제공할 때 이를 고려해야 합니다.
참고: 애플리케이션이 defaultRenderPass()에서 반환된 렌더 패스를 사용하는 대신 자체 렌더 패스를 제공하는 경우, 이 프레임버퍼를 사용할 의무는 없습니다.
참고: 이 함수는 startNextFrame() 내부에서만 호출되어야 하며, 비동기 명령어 생성 시에는 frameReady() 호출 전까지만 호출되어야 합니다.
defaultRenderPass()도 참조하십시오 .
int QVulkanWindow::currentSwapChainImageIndex() const
[0, swapChainImageCount() - 1] 범위 내의 현재 스왑 체인 이미지 인덱스를 반환합니다.
참고: 이 함수는 startNextFrame() 내부에서만 호출되어야 하며, 비동기 명령어 생성 시에는 frameReady() 호출 전까지만 호출되어야 합니다.
VkRenderPass QVulkanWindow::defaultRenderPass() const
하나의 서브 패스가 포함된 일반적인 렌더 패스를 반환합니다.
참고: 애플리케이션은 이 렌더 패스를 반드시 사용해야 하는 것은 아닙니다. 그러나 이 경우, 애플리케이션은 자체 정의한 렌더 패스나 다른 방법을 통해 현재 스왑 체인과 깊이-스텐실 이미지가 VK_IMAGE_LAYOUT_UNDEFINED 에서 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 및 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL 로 전환되도록 보장해야 합니다.
참고: 이 렌더 패스에서는스텐실 읽기/쓰기가 활성화되어 있지 않습니다.
참고: 이 함수의호출은 QVulkanWindowRenderer::initResources()이 호출된 시점부터 QVulkanWindowRenderer::releaseResources()이 호출되기 전까지만 유효합니다.
currentFramebuffer()도 참조하십시오 .
VkFormat QVulkanWindow::depthStencilFormat() const
깊이-스텐실 버퍼에서 사용하는 형식을 반환합니다.
참고: 이 함수를호출할 수 있는 범위는 ` QVulkanWindowRenderer::initResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseResources()` 호출 시점까지입니다.
VkImage QVulkanWindow::depthStencilImage() const
뎁스-스텐실 이미지를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::initSwapChainResources() 호출 시점부터 QVulkanWindowRenderer::releaseSwapChainResources() 호출 시점까지만호출할 수 있습니다.
VkImageView QVulkanWindow::depthStencilImageView() const
깊이-스텐실 이미지 뷰를 반환합니다.
참고: 이 함수는 ` QVulkanWindowRenderer::initSwapChainResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseSwapChainResources()` 호출 시점까지만호출할 수 있습니다.
VkDevice QVulkanWindow::device() const
활성 논리 장치를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::initResources()호출 시점부터 QVulkanWindowRenderer::releaseResources()호출 시점까지만 유효합니다.
uint32_t QVulkanWindow::deviceLocalMemoryIndex() const
일반적인 용도에 적합한 장치 로컬 메모리 유형 인덱스를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::initResources()호출 시점부터 QVulkanWindowRenderer::releaseResources()호출 시점까지만 유효합니다.
참고: 이 메모리 유형이 항상 적합한것은 아닙니다 . 특히 장치 로컬 이미지의 경우, 구현 간 호환성을보장하는 올바른 해결책은 vkGetImageMemoryRequirements 에서 반환된 마스크를 확인한 후 수동으로 메모리 유형을 선택하는 것입니다.
QVulkanWindow::Flags QVulkanWindow::flags() const
요청된 플래그를 반환합니다.
setFlags()도 참조하십시오 .
[signal] void QVulkanWindow::frameGrabbed(const QImage &image)
image 가 준비 상태가 되면 이 신호가 전송됩니다.
void QVulkanWindow::frameReady()
이 함수는 QVulkanWindowRenderer::startNextFrame() 구현이 호출될 때마다 정확히 한 번씩 호출되어야 합니다. 이 호출 시점에는 currentCommandBuffer()을 통해 노출된 메인 명령 버퍼에 필요한 모든 렌더링 명령이 추가되어 있어야 합니다. 이 함수는 명령을 제출하고 현재 명령을 큐에 추가하는 작업을 트리거하기 때문입니다.
참고: 이 함수는 gui/main 스레드에서만 호출되어야 합니다. 이 스레드는 QVulkanWindowRenderer 의 함수가 호출되는 곳이자 QVulkanWindow 인스턴스가 존재하는 곳입니다.
QVulkanWindowRenderer::startNextFrame()도 참조하십시오 .
QImage QVulkanWindow::grab()
다음 프레임을 생성하고 렌더링하되 화면에 표시하지 않은 다음, 이미지 콘텐츠에 대한 차단형 리드백을 수행합니다.
렌더러의 ` startNextFrame()` 구현이 ` frameReady()`를 직접 호출하는 경우 이미지를 반환합니다. 그렇지 않은 경우, 크기는 맞지만 아직 내용이 채워지지 않은 불완전한 이미지를 반환합니다. 후자의 경우, 내용은 ` frameGrabbed()` 신호를 통해 전달됩니다.
반환되는 ` QImage `는 항상 ` QImage::Format_RGBA8888` 형식을 갖습니다. ` colorFormat()`가 ` VK_FORMAT_B8G8R8A8_UNORM`인 경우, 이 형식은 스왑체인 색상 버퍼의 기본 선택으로 흔히 사용되므로 빨간색과 파란색 채널이 자동으로 바뀝니다. 다른 색상 버퍼 형식의 경우, 이 함수는 변환을 수행하지 않습니다.
참고: 프레임이 진행 중인 경우(즉, 애플리케이션에서 frameReady()에 대한 콜백이 아직 호출되지 않은 경우)에는이 함수를 호출해서는 안 됩니다.
참고: 이 함수는 추가적인 차단형 리드백으로 인해 처리 비용이 높을 수 있습니다.
참고: 이 함수는 현재 스왑 체인이 전송 소스(VK_IMAGE_USAGE_TRANSFER_SRC_BIT)로 사용될 수 있도록 지원해야 하며, 그렇지 않으면 실패합니다.
VkCommandPool QVulkanWindow::graphicsCommandPool() const
활성 그래픽 명령 풀을 반환합니다.
참고: 이 함수는 ` QVulkanWindowRenderer::initResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseResources()` 호출 시점까지만호출할 수 있습니다.
VkQueue QVulkanWindow::graphicsQueue() const
활성 그래픽 큐를 반환합니다.
참고: 이 함수는 ` QVulkanWindowRenderer::initResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseResources()` 호출 시점까지만호출할 수 있습니다.
uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const
활성 그래픽 큐의 패밀리 인덱스를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::initResources() 호출 시점부터 QVulkanWindowRenderer::releaseResources() 호출 시점까지만호출할 수 있습니다. QVulkanWindowRenderer::updateQueueCreateInfo()의 구현체에서도 이 함수를 호출할 수 있습니다.
uint32_t QVulkanWindow::hostVisibleMemoryIndex() const
일반적인 용도에 적합한 호스트 가시 메모리 유형 인덱스를 반환합니다.
반환되는 메모리 유형은 호스트 가시적이며 일관성을 갖습니다. 또한, 가능한 경우 캐시됩니다.
참고: 이 함수의호출은 ` QVulkanWindowRenderer::initResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseResources()` 호출 시점까지만 유효합니다.
bool QVulkanWindow::isValid() const
이 창이 스왑체인(swapchain)을 포함한 모든 Vulkan 리소스를 성공적으로 초기화한 경우 true를 반환합니다.
참고: 초기화는 창이 표시된 후 발생하는 첫 번째 expose 이벤트 시점에 수행됩니다.
VkImage QVulkanWindow::msaaColorImage(int idx) const
지정된 멀티샘플 컬러 이미지를 반환하며, 멀티샘플링이 사용되지 않는 경우에는 VK_NULL_HANDLE 를 반환합니다.
idx 값은 [0, swapChainImageCount() - 1] 범위 내에 있어야 합니다.
참고: 이 함수는 QVulkanWindowRenderer::initSwapChainResources() 호출 시점부터 QVulkanWindowRenderer::releaseSwapChainResources() 호출 시점까지만호출할 수 있습니다.
VkImageView QVulkanWindow::msaaColorImageView(int idx) const
지정된 멀티샘플 컬러 이미지 뷰를 반환하거나, 멀티샘플링이 사용되지 않는 경우 VK_NULL_HANDLE 를 반환합니다.
idx 값은 [0, swapChainImageCount() - 1] 범위 내에 있어야 합니다.
참고: 이 함수는 QVulkanWindowRenderer::initSwapChainResources() 호출 시점부터 QVulkanWindowRenderer::releaseSwapChainResources() 호출 시점까지만호출할 수 있습니다.
VkPhysicalDevice QVulkanWindow::physicalDevice() const
활성 상태인 물리적 장치를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::preInitResources() 호출 시점부터 QVulkanWindowRenderer::releaseResources() 호출 시점까지만호출할 수 있습니다.
const VkPhysicalDeviceProperties *QVulkanWindow::physicalDeviceProperties() const
활성 물리적 장치의 속성에 대한 포인터를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::preInitResources() 호출 시점부터 QVulkanWindowRenderer::releaseResources() 호출 시점까지만호출할 수 있습니다.
VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const
현재 샘플 수를 ‘ VkSampleCountFlagBits ’ 값으로 반환합니다.
기본 렌더 타겟을 대상으로 할 경우, ` VkPipelineMultisampleStateCreateInfo `의 ` rasterizationSamples ` 필드를 이 값으로 설정해야 합니다.
setSampleCount() 및 supportedSampleCounts()도 참조하십시오 .
void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)
활성화할 장치 extensions 목록을 설정합니다.
지원되지 않는 확장 기능은 무시됩니다.
스왑체인(swapchain) 확장 기능은 항상 자동으로 추가되므로 이 목록에 포함시킬 필요가 없습니다.
참고: 이 함수는 창이 표시되기 전이나 늦어도 ` QVulkanWindowRenderer::preInitResources()` 호출 시점에 호출되어야 하며, 그 이후에 호출하면 아무런 효과가 없습니다.
[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)
활성화된 장치 기능 수정 함수 ` modifier`를 설정합니다.
참고: Vulkan 1.1, 1.2 또는 1.3 기능을제어하려면 대신 EnabledFeatures2Modifier 를 인수로 받는 오버로드를 사용하십시오.
참고: modifier 는 모든 멤버가 false로 설정된 상태로 콜백 함수에 전달됩니다. 멤버를 적절하게 변경하는 것은 함수의 몫입니다.
이 함수는 Qt 6.7에서 도입되었습니다.
EnabledFeaturesModifier도 참조하십시오 .
[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)
활성화된 장치 기능 수정 함수 modifier 를 설정합니다.
이 함수는 오버로드된 함수입니다.
이 함수는 Qt 6.7에서 도입되었습니다.
EnabledFeatures2Modifier도 참조하십시오 .
void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)
지정된 ` flags`에 따라 동작을 설정합니다.
참고: 이 함수는 창이 표시되기 전이나 늦어도 QVulkanWindowRenderer::preInitResources() 내에서 호출되어야 하며, 그 이후에 호출하면 아무런 효과가 없습니다.
flags()도 참조하십시오 .
void QVulkanWindow::setPhysicalDeviceIndex(int idx)
인덱스가 idx 인 물리적 장치의 사용을 요청합니다. 이 인덱스는 availablePhysicalDevices()에서 반환된 목록에 해당합니다.
기본적으로 첫 번째 물리적 장치가 사용됩니다.
참고: 이 함수는 창이 표시되기 전이나 늦어도 QVulkanWindowRenderer::preInitResources() 내에서 호출되어야 하며, 그 이후에 호출될 경우 아무런 효과가 없습니다.
void QVulkanWindow::setPreferredColorFormats(const QList<VkFormat> &formats)
스왑 체인의 선호하는 formats 를 설정합니다.
기본적으로 애플리케이션이 선호하는 형식은 설정되어 있지 않습니다. 이 경우 서페이스의 선호 형식이 사용되며, 해당 형식이 없는 경우에는 ` VK_FORMAT_B8G8R8A8_UNORM`가 사용됩니다.
formats 내의 목록은 정렬되어 있습니다. 첫 번째 형식이 지원되지 않으면 두 번째 형식이 고려되며, 이 과정이 순차적으로 진행됩니다. 목록에 있는 형식 중 지원되는 것이 없을 경우, 동작은 기본 경우와 동일합니다.
초기화 후 실제 형식을 조회하려면 ` colorFormat()`를 호출하십시오.
참고: 이 함수는 창이 표시되기 전이나 늦어도 QVulkanWindowRenderer::preInitResources() 내에서 호출되어야 하며, 그 이후에 호출하면 아무런 효과가 없습니다.
참고: 필요한 경우 QVulkanWindowRenderer::preInitResources()을 재구현하여 지원되는 형식 목록을 동적으로 확인할 수 있습니다. 이때 QVulkanInstance::surfaceForWindow()를 통해 서페이스를 가져올 수 있으며, 이 함수는 초기화의 후속 단계에 영향을 주기 위해 여전히 안전하게 호출할 수 있습니다.
colorFormat()도 참조하십시오 .
void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
큐 생성 정보 수정 함수 modifier 를 설정합니다.
QueueCreateInfoModifier도 참조하십시오 .
void QVulkanWindow::setSampleCount(int sampleCount)
지정된 ` sampleCount` 값을 사용하여 멀티샘플 앤티앨리어싱을 요청합니다. 유효한 값은 1, 2, 4, 8, …이며, 물리적 장치가 지원하는 최대 값까지 가능합니다.
샘플 수가 1보다 클 경우, ` QVulkanWindow `는 단순히 스왑체인(swapchain)의 이미지를 대상으로 하는 대신 멀티샘플 컬러 버퍼를 생성합니다. 멀티샘플 버퍼에서의 렌더링 결과는 각 프레임이 끝날 때마다 비멀티샘플 버퍼로 변환됩니다.
지원되는 샘플 수 목록을 확인하려면 supportedSampleCounts()를 호출하십시오.
렌더링 파이프라인을 설정할 때, sampleCountFlagBits()를 호출하여 활성 샘플 수를 VkSampleCountFlagBits 값으로 조회하십시오.
참고: 이 함수는 창이 표시되기 전이나 늦어도 QVulkanWindowRenderer::preInitResources()에서 호출되어야 하며, 그 이후에 호출하면 아무런 효과가 없습니다.
supportedSampleCounts() 및 sampleCountFlagBits()도 참조하십시오 .
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
setPhysicalDeviceIndex() 함수로 선택한 물리적 장치에서 생성된 논리 장치가 지원하는 확장 기능 목록을 반환합니다.
참고: 이 함수는 창을 표시하기 전에 호출할 수 있습니다.
QList<int> QVulkanWindow::supportedSampleCounts()
setPhysicalDeviceIndex() 함수로 선택된 물리적 장치를 사용할 때 지원되는 샘플 수 집합을 정렬된 목록 형태로 반환합니다.
기본적으로 ` QVulkanWindow ()`는 샘플 수 1을 사용합니다. 이 함수가 반환한 집합과 다른 값(2, 4, 8, ...)을 사용하여 ` setSampleCount()`를 호출하면, 다중 샘플 앤티앨리어싱을 요청할 수 있습니다.
참고: 이 함수는 창을 표시하기 전에 호출할 수 있습니다.
참조: setSampleCount().
bool QVulkanWindow::supportsGrab() const
스왑체인(swapchain)이 전송 소스로서의 사용을 지원하는 경우, 즉 ` grab()`가 정상적으로 작동하는 경우 true를 반환합니다.
참고: 이 함수는 QVulkanWindowRenderer::initSwapChainResources() 호출 시점부터 QVulkanWindowRenderer::releaseSwapChainResources() 호출 시점까지만호출할 수 있습니다.
VkImage QVulkanWindow::swapChainImage(int idx) const
지정된 스왑 체인 이미지를 반환합니다.
idx 값은 [0, swapChainImageCount() - 1] 범위 내에 있어야 합니다.
참고: 이 함수는 QVulkanWindowRenderer::initSwapChainResources() 호출 시점부터 QVulkanWindowRenderer::releaseSwapChainResources() 호출 시점까지만호출할 수 있습니다.
int QVulkanWindow::swapChainImageCount() const
스왑 체인에 포함된 이미지 수를 반환합니다.
참고: 사용자 정의 렌더 패스 및 프레임버퍼를 제공할 때 이 함수를호출해야 합니다. 프레임버퍼는 현재 스왑 체인 이미지에 특화되어 있으므로, 애플리케이션은 여러 개의 프레임버퍼를 제공해야 합니다.
참고: 이 함수는 ` QVulkanWindowRenderer::initSwapChainResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseSwapChainResources()` 호출 시점까지만호출할 수 있습니다.
QSize QVulkanWindow::swapChainImageSize() const
스왑체인의 이미지 크기를 반환합니다.
이는 일반적으로 창의 크기와 일치하지만, vkGetPhysicalDeviceSurfaceCapabilitiesKHR 가 고정 크기를 보고하는 경우에는 다를 수도 있습니다.
또한 일부 플랫폼에서는 높은 DPI 스케일링이 활성화된 상태에서 Vulkan이 보고하는 표면 크기가 다른 것으로 관찰되었는데, 이는 QWindow 가 보고하는 size() 값에 devicePixelRatio() 값을 곱한 결과가 여기에서 반환된 값과 비교했을 때 1픽셀 정도 차이가 나는 것을 의미하며, 이는 아마도 반올림 차이로 인한 것으로 보입니다. 렌더링 코드는 이 점을 유의해야 하며, 관련 렌더링 로직은 반드시 여기서 반환된 값을 기반으로 해야 하며, 절대로 QWindow 에서 보고된 크기를 기준으로 해서는 안 됩니다. 이론적으로 어떤 픽셀 크기가 정확하든 상관없이, Vulkan 렌더링은 오직 Vulkan API에서 보고된 표면 크기만을 신뢰해야 합니다. 그렇지 않으면, 예를 들어 뷰포트를 설정할 때, 애플리케이션에서 제공한 값이 Vulkan의 관점에서 범위를 벗어날 수 있으므로 유효성 검사 오류가 발생할 수 있습니다.
참고: 이 함수호출은 ` QVulkanWindowRenderer::initSwapChainResources()` 호출 시점부터 ` QVulkanWindowRenderer::releaseSwapChainResources()` 호출 시점까지만 유효합니다.
VkImageView QVulkanWindow::swapChainImageView(int idx) const
지정된 스왑 체인 이미지 뷰를 반환합니다.
idx 값은 [0, swapChainImageCount() - 1] 범위 내에 있어야 합니다.
참고: 이 함수는 QVulkanWindowRenderer::initSwapChainResources() 호출 시점부터 QVulkanWindowRenderer::releaseSwapChainResources() 호출 시점까지만호출할 수 있습니다.
멤버 변수 설명서
const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT
이 변수는 ` concurrentFrameCount()`의 최대값과 같거나 그보다 큰 상수 값을 저장합니다.
© 2026 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.