QVulkanWindow Class
QVulkanWindow 클래스는 벌칸 렌더링을 수행하기 위한 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는 벌칸 디바이스, 그래픽 큐, 명령 풀과 버퍼, 뎁스 스텐실 이미지, 이중 버퍼 FIFO 스왑체인을 관리하면서 크기 조정, 그래픽과 프레젠테이션을 모두 지원하는 디바이스 큐가 없는 특수 상황, 디바이스 손실 시나리오, 렌더링된 콘텐츠 읽기 같은 추가 기능에 대한 올바른 동작을 처리하는 Vulkan 지원 QWindow 입니다. 개념적으로는 벌칸 세계의 QOpenGLWindow 에 대응하는 개념입니다.
참고: 고급 사용 사례에서 반드시 충분하지 않을 수 있으므로 QVulkanWindow가 항상 완전한 사용자 정의 QWindow 서브클래스를 구현할 필요성을 없애는 것은 아닙니다.
QWidget::createWindowContainer()을 통해 QWidget-기반 사용자 인터페이스에 QVulkanWindow를 임베드할 수 있습니다. 그러나 이 접근 방식에는 여러 가지 한계가 있습니다. documentation 을 먼저 공부하세요.
QVulkanWindow를 사용하는 일반적인 애플리케이션은 다음과 같습니다:
클래스 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()를 호출하기만 하면 됩니다.
- 기본적인 벌칸 리소스(물리적 장치, 그래픽 큐, 명령 풀, 창의 기본 명령 버퍼, 이미지 형식 등)는 경량 게터 함수를 통해 QVulkanWindow에 노출됩니다. 이 중 일부는 편의상 제공된 것으로, 애플리케이션은 언제든지 Vulkan API를 통해 직접 추가 리소스를 쿼리, 생성 및 관리할 수 있습니다.
- 렌더러는 창 자체와 마찬가지로 GUI/메인 스레드에 존재합니다. 그런 다음 이 스레드는 스왑 간격이 1인 OpenGL의 작동 방식과 유사하게 프레젠테이션 속도에 따라 조절됩니다. 하지만 렌더러 구현은 여러 스레드를 자유롭게 활용할 수 있습니다. vulkanInstance (), currentCommandBuffer() 등과 같은 접근자는 모든 스레드에서 호출할 수 있습니다. 메인 명령 버퍼의 제출, 현재 대기열, 다음 프레임의 작성은 gui/메인 스레드에서 frameReady()가 호출될 때까지 시작되지 않습니다.
- 창이 표시되면 콘텐츠가 자동으로 업데이트됩니다. QWindow::requestUpdate ()를 호출하여 추가 업데이트를 요청할 수 있습니다. 계속 렌더링하려면 frameReady() 뒤에 requestUpdate()를 호출하세요.
문제 해결을 위해 로깅 카테고리 qt.vulkan
를 활성화합니다. 중요한 오류는 qWarning()를 통해 자동으로 인쇄됩니다.
OpenGL과 Vulkan의 좌표계 차이점
두 가지 주목할 만한 차이점이 있습니다: 첫째, Vulkan의 Y축은 클립 공간에서 화면 아래쪽을 가리키지만 OpenGL은 위쪽을 가리키는 Y축을 사용합니다. 둘째, 표준 OpenGL 투영 행렬은 근거리 및 원거리 평면 값을 -1과 1로 가정하는 반면, 벌칸은 0과 1을 선호합니다.
애플리케이션이 버텍스 데이터의 Y 좌표를 뒤집지 않고도 OpenGL 기반 코드에서 마이그레이션할 수 있고, Vulkan 뷰포트의 minDepth 및 maxDepth를 0과 1로 설정한 상태에서 QMatrix4x4::perspective() 같은 QMatrix4x4 함수를 사용할 수 있도록 QVulkanWindow는 clipCorrectionMatrix() 호출로 검색 가능한 보정 행렬을 제공합니다.
멀티샘플링
기본적으로 비활성화되어 있지만 멀티샘플 앤티앨리어싱은 QVulkanWindow에서 완벽하게 지원됩니다. 추가 컬러 버퍼와 스왑체인의 비멀티샘플 버퍼로의 리졸브는 모두 자동으로 관리됩니다.
지원되는 샘플 수를 쿼리하려면 supportedSampleCounts()를 호출하세요. 반환된 집합에 4, 8, ...이 포함된 경우 해당 값 중 하나를 setSampleCount()에 전달하면 멀티샘플 렌더링을 요청합니다.
참고: QSurfaceFormat::setSamples()와 달리 지원되는 샘플 수 목록이 애플리케이션에 미리 노출되며 setSampleCount()에서는 더 낮은 샘플 수로 자동 폴백되지 않습니다. 요청된 값이 지원되지 않는 경우 경고가 표시되고 멀티샘플링이 사용되지 않습니다.
이미지 다시 읽기
supportsGrab()가 참을 반환하면 QVulkanWindow는 컬러 버퍼에서 QImage 로 읽기백을 수행할 수 있습니다. grab()는 느리고 비효율적인 작업이므로 자주 사용하지 않아야 합니다. 그럼에도 불구하고 애플리케이션에서 스크린샷을 찍거나 도구 및 테스트를 통해 GPU 렌더링의 출력을 처리하고 검증할 수 있으므로 유용합니다.
sRGB 지원
많은 애플리케이션이 스왑체인 이미지 형식과 관련하여 QVulkanWindow의 기본 동작으로 괜찮지만, setPreferredColorFormats()를 사용하면 사전 정의된 형식을 요청할 수 있습니다. 이 기능은 특히 sRGB 색 공간에서 작업할 때 유용합니다. VK_FORMAT_B8G8R8A8_SRGB
와 같은 형식을 전달하면 사용 가능한 경우 sRGB 형식이 선택됩니다.
유효성 검사 레이어
애플리케이션 개발 중에 Vulkan 유효성 검사 레이어를 활성화하는 것은 매우 유용할 수 있습니다. QVulkanInstance::setLayers 위의 예제 코드에서 볼 수 있듯이 QVulkanInstance::create() 앞에 QVulkanInstance ()을 호출하면 시스템의 Vulkan 드라이버 스택에 필요한 레이어가 포함되어 있다는 가정 하에 유효성 검사를 활성화할 수 있습니다.
참고: 플랫폼별 차이점에 유의하세요. 데스크톱 플랫폼에서는 일반적으로 Vulkan SDK를 설치하는 것으로 충분합니다. 그러나 예를 들어 Android에서는 애플리케이션과 함께 공유 라이브러리를 추가로 배포해야 하며, 다른 유효성 검사 계층 이름 목록도 필요합니다. 자세한 내용은 Android 벌칸 개발 페이지를 참조하세요.
참고: 이 기능은 벌칸 API 버전 1.0.13부터 더 이상 사용되지 않으므로 QVulkanWindow는 디바이스 레이어를 노출하지 않습니다.
레이어, 디바이스 기능 및 확장
인스턴스 레이어를 활성화하려면 QVulkanInstance 을 생성하기 전에 QVulkanInstance::setLayers()를 호출하고, 사용 가능한 인스턴스 레이어를 쿼리하려면 QVulkanInstance::supportedLayers()를 호출하세요.
기기 확장을 활성화하려면 QVulkanWindow를 설정할 때 setDeviceExtensions()를 호출하세요. 사용 가능한 디바이스 확장을 쿼리하려면 supportedDeviceExtensions()를 호출합니다.
지원되지 않는 레이어 또는 확장을 지정하면 정상적으로 처리됩니다. 인스턴스 또는 디바이스 생성에 실패하지는 않지만 레이어 또는 확장 요청은 무시됩니다.
디바이스 기능의 경우, QVulkanWindow는 vkGetPhysicalDeviceFeatures()에서 지원되는 것으로 보고된 모든 Vulkan 1.0 기능을 활성화합니다. 이 규칙의 예외로 robustBufferAccess
은 활성화되지 않습니다. 해당 기능을 활성화하려면 아래에 설명된 콜백 메커니즘을 사용하세요.
이 기능이 항상 바람직한 것은 아니며 Vulkan 1.1 이상에서는 불충분할 수 있습니다. 따라서 setEnabledFeaturesModifier()에 콜백 함수를 등록하여 디바이스 생성에 사용되는 VkPhysicalDeviceFeatures를 완전히 제어할 수도 있습니다. 이 함수가 설정되면 콜백 함수가 호출되어 VkPhysicalDeviceFeatures 또는 VkPhysicalDeviceFeatures2를 변경할 수 있습니다.
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이 되지만 나머지는 0이 됩니다. 멤버를 참으로 변경하거나 pNext
체인을 적절하게 설정하는 것은 함수의 몫입니다.
참고: pNext
체인을 설정할 때는 QVulkanWindow 서브클래스에 멤버 변수로 저장하는 등 참조된 객체의 수명이 충분히 긴지 확인하세요.
이 typedef는 Qt 6.7에 도입되었습니다.
setEnabledFeaturesModifier()도 참조하십시오 .
QVulkanWindow::EnabledFeaturesModifier
그래픽스 초기화 중에 호출되어 Vulkan 디바이스 오브젝트를 생성할 때 전달되는 VkPhysicalDeviceFeatures를 변경하는 함수입니다.
기본적으로 QVulkanWindow 은 특정 예외를 제외하고 물리적 디바이스가 지원되는 것으로 보고하는 모든 Vulkan 1.0 핵심 기능을 활성화합니다. 특히 robustBufferAccess
은 예기치 않은 성능 저하를 방지하기 위해 항상 비활성화됩니다.
함수가 호출되는 시점에 전달된 VkPhysicalDeviceFeatures 참조는 모두 0이 됩니다. 멤버를 적절하다고 판단되는 대로 변경하는 것은 함수의 몫입니다.
참고: 벌칸 1.1, 1.2 또는 1.3 기능을 제어하려면 EnabledFeatures2Modifier 을 대신 사용하세요.
setEnabledFeaturesModifier()도 참조하세요 .
열거형 QVulkanWindow::Flag
플래그 QVulkanWindow::Flags
이 열거형은 setFlags()에 전달할 수 있는 플래그를 설명합니다.
Constant | 값 | 설명 |
---|---|---|
QVulkanWindow::PersistentResources | 0x01 | 창이 노출되지 않을 때 그래픽 리소스를 해제하지 않도록 합니다. 기본 동작은 모든 것을 해제하고 나중에 다시 표시될 때 다시 초기화하는 것입니다. |
Flags 유형은 QFlags<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과 벌칸의 좌표계 차이를 보정하는 데 사용할 수 있는 QMatrix4x4 을 반환합니다.
투영 행렬에 이 행렬을 미리 곱하면 애플리케이션은 계속해서 Y가 위쪽을 가리키고 있다고 가정하고 뷰포트에서 최소 깊이와 최대 깊이를 각각 0과 1로 설정하여 버텍스 Z 위치를 추가로 수정할 필요 없이 사용할 수 있습니다. 그러면 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를 반환합니다.
프레임버퍼에는 멀티샘플링을 사용하지 않는 경우 2개의 첨부 파일(색상, 깊이 스텐실)이 있고 sampleCountFlagBits()이 VK_SAMPLE_COUNT_1_BIT
보다 큰 경우 3개의 첨부 파일(색상 해상도, 깊이 스텐실, 멀티샘플 색상)이 있습니다. 렌더러는 명확한 값을 제공할 때 등 이 점을 고려해야 합니다.
참고: 애플리케이션이 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()를 통해 노출되는 기본 명령 버퍼에는 필요한 모든 렌더링 명령이 추가되어야 하며, 이 함수는 명령 제출 및 현재 명령의 대기열을 트리거합니다.
참고: 이 함수는 QVulkanWindowRenderer 의 함수가 호출되는 곳이자 QVulkanWindow 인스턴스가 있는 gui/main 스레드에서만 호출해야 합니다.
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
이 창이 스왑체인을 포함한 모든 벌칸 리소스를 성공적으로 초기화하면 true를 반환합니다.
참고: 초기화는 창이 표시된 후 첫 번째 노출 이벤트에서 발생합니다.
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 목록을 설정합니다.
지원되지 않는 확장은 무시됩니다.
스왑체인 확장은 항상 자동으로 추가되므로 이 목록에 포함할 필요가 없습니다.
참고: 이 함수는 창이 표시되기 전 또는 늦어도 QVulkanWindowRenderer::preInitResources()에서 호출해야 하며, 그 이후에 호출하면 효과가 없습니다.
[since 6.7]
void QVulkanWindow::setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)
활성화된 디바이스 기능 수정 기능을 설정합니다 modifier.
참고: 벌칸 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()를 다시 구현하면 원하는 경우 지원되는 형식 목록을 동적으로 검토할 수 있습니다. 여기서 표면은 QVulkanInstace::surfaceForWindow()를 통해 검색할 수 있으며, 이 함수는 초기화 이후 단계에도 안전하게 호출하여 영향을 줄 수 있습니다.
colorFormat()도 참조하세요 .
void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
대기열 생성 정보 수정 기능을 설정합니다 modifier.
QueueCreateInfoModifier도 참조하세요 .
void QVulkanWindow::setSampleCount(int sampleCount)
주어진 sampleCount 으로 멀티샘플 안티앨리어싱을 요청합니다. 유효한 값은 1, 2, 4, 8, ... 물리적 디바이스에서 지원하는 최대 값까지입니다.
샘플 수가 1보다 크면 QVulkanWindow 은 단순히 스왑체인의 이미지를 대상으로 하는 대신 멀티샘플 컬러 버퍼를 생성합니다. 멀티샘플 버퍼의 렌더링은 각 프레임이 끝날 때마다 비멀티샘플 버퍼로 리졸브됩니다.
지원되는 샘플 수 목록을 확인하려면 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
스왑체인이 전송 소스로서 사용을 지원하는 경우, 즉 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()의 최대값보다 큰 상수 값을 유지합니다.
© 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.