QQuickRhiItemRenderer Class
QQuickRhiItemRenderer는 QQuickRhiItem 의 렌더링 로직을 구현합니다... .
헤더: | #include <QQuickRhiItemRenderer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
이후: | Qt 6.7 |
상태: | 예비 |
이 클래스는 개발 중이며 변경될 수 있습니다.
공용 함수
QQuickRhiItemRenderer() | |
virtual | ~QQuickRhiItemRenderer() |
보호된 함수
QRhiTexture * | colorTexture() const |
QRhiRenderBuffer * | depthStencilBuffer() const |
virtual void | initialize(QRhiCommandBuffer *cb) = 0 |
QRhiRenderBuffer * | msaaColorBuffer() const |
virtual void | render(QRhiCommandBuffer *cb) = 0 |
QRhiRenderTarget * | renderTarget() const |
QRhiTexture * | resolveTexture() const |
QRhi * | rhi() const |
virtual void | synchronize(QQuickRhiItem *item) = 0 |
void | update() |
상세 설명
참고: QQuickRhiItem 및 QQuickRhiItemRenderer는 Qt 6.7에서 기술 프리뷰 버전입니다. API는 개발 중이며 변경될 수 있습니다.
QQuickRhiItem 및 QRhi 을참조하세요 .
멤버 함수 문서
QQuickRhiItemRenderer::QQuickRhiItemRenderer()
새 렌더러를 생성합니다.
이 함수는 GUI 스레드가 차단된 경우 씬 그래프 동기화 단계에서 렌더링 스레드에서 호출됩니다.
QQuickRhiItem::createRenderer()도 참조하십시오 .
[virtual noexcept]
QQuickRhiItemRenderer::~QQuickRhiItemRenderer()
QQuickRhiItem 항목에 대한 씬 그래프 리소스가 정리되면 렌더러가 자동으로 삭제됩니다.
이 함수는 렌더링 스레드에서 호출됩니다.
특정 조건에서는 렌더러 객체가 소멸된 후 다시 생성되는 것이 정상이며 예상되는 현상입니다. 렌더러의 수명이 기본 씬 그래프 노드를 효과적으로 따르기 때문입니다. 예를 들어 QQuickRhiItem 오브젝트의 부모를 변경하여 다른 QQuickWindow 에 속하도록 변경하는 경우 창 변경으로 인해 씬 그래프 노드가 모두 삭제되고 다시 생성됩니다. 여기에는 QQuickRhiItemRenderer 을 삭제하고 새로 만드는 작업도 포함됩니다.
QRhiWidget 과 달리 QQuickRhiItemRenderer 에서는 QRhi 을 통해 생성된 그래픽 리소스를 릴리스(또는 조기 릴리스)하기 위한 추가 코드 경로를 구현할 필요가 없습니다. 소멸자에서 모든 것을 해제하거나 스마트 포인터에 의존하는 것으로 충분합니다.
[protected]
QRhiTexture *QQuickRhiItemRenderer::colorTexture() const
항목의 색상 버퍼 역할을 하는 텍스처를 반환합니다.
initialize() 및 render()에서만 호출해야 합니다.
뎁스 스텐실 버퍼 및 QRhiRenderTarget 와 달리 이 텍스처는 항상 사용 가능하며 isAutoRenderTargetEnabled 의 값과 관계없이 QQuickRhiItem 에서 관리합니다.
참고: sampleCount 이 1보다 커서 다중 샘플 앤티앨리어싱이 활성화된 경우 반환 값은 nullptr
입니다. 대신 msaaColorBuffer()를 호출하여 QRhiRenderBuffer 을 쿼리합니다.
참고: renderTarget()에서 반환된 QRhiRenderTarget 을 통해서도 백킹 텍스처 크기와 샘플 수를 쿼리할 수 있습니다. 이는 멀티샘플링 사용 여부와 관계없이 작동하므로 QRhiTexture 또는 QRhiRenderBuffer 에서 쿼리하는 것보다 더 편리하고 간결할 수 있습니다.
msaaColorBuffer(), depthStencilBuffer(), renderTarget() 및 resolveTexture()도 참조하세요 .
[protected]
QRhiRenderBuffer *QQuickRhiItemRenderer::depthStencilBuffer() const
아이템의 렌더링에 사용된 뎁스 스텐실 버퍼를 반환합니다.
initialize() 및 render()에서만 호출해야 합니다.
isAutoRenderTargetEnabled 가 true
일 때만 사용할 수 있습니다. 그렇지 않으면 반환되는 값은 nullptr
이며 initialize()를 다시 구현하여 깊이 스텐실 버퍼와 QRhiTextureRenderTarget 를 생성하고 관리해야 합니다.
colorTexture() 및 renderTarget()도 참조하세요 .
[pure virtual protected]
void QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb)
항목이 처음 초기화될 때, 연결된 텍스처의 크기, 형식 또는 샘플 수가 변경될 때, 또는 QRhi 또는 텍스처가 어떤 이유로든 변경될 때 호출됩니다. 이 함수는 render()의 렌더링 코드에서 사용하는 그래픽 리소스를 유지(아직 생성되지 않은 경우 생성, 크기가 변경된 경우 조정 및 다시 빌드)해야 합니다.
QRhi, QRhiTexture 및 기타 관련 객체를 쿼리하려면 rhi(), colorTexture(), depthStencilBuffer() 및 renderTarget()를 호출하세요.
항목 크기가 변경되면 QRhi 객체, 색상 버퍼 텍스처 및 깊이 스텐실 버퍼 객체는 모두 이전과 동일한 인스턴스(따라서 게터는 동일한 포인터를 반환)이지만 색상 및 깊이/스텐실 버퍼는 다시 빌드되었을 가능성이 있으므로 size 및 기본 네이티브 텍스처 리소스가 마지막 호출과 다를 수 있습니다.
또한 이 함수를 호출할 때마다 QRhi 객체와 색상 버퍼 텍스처가 변경될 수 있으므로 재구현을 준비해야 합니다. 예를 들어, 항목이 새로운 QQuickWindow 에 속하도록 부모가 변경된 경우 QRhi 및 QQuickRhiItem 에서 관리하는 모든 관련 리소스는 이 함수에 대한 후속 호출에서 이전과 다른 인스턴스가 될 것입니다. 그러면 하위 클래스에서 이전에 생성된 모든 기존 QRhi 리소스는 더 이상 사용해서는 안 되는 이전 QRhi 에 속하기 때문에 소멸됩니다.
isAutoRenderTargetEnabled 가 기본값인 true
인 경우, colorTexture() (또는 msaaColorBuffer()) 및 깊이 스텐실 버퍼와 연결된 QRhiRenderBuffer 및 QRhiTextureRenderTarget 가 자동으로 생성되고 관리됩니다. 초기화() 및 render()의 재구현은 depthStencilBuffer() 및 renderTarget()를 통해 해당 객체를 쿼리할 수 있습니다. isAutoRenderTargetEnabled 가 false
로 설정되면 이러한 객체는 더 이상 자동으로 생성 및 관리되지 않습니다. 대신 초기화() 구현에서 버퍼를 생성하고 렌더링 대상을 적절하게 설정해야 합니다. 렌더링 대상에 대한 추가 색상 또는 깊이 스텐실 첨부 파일을 수동으로 관리할 때 크기와 샘플 수는 항상 colorTexture() (또는 msaaColorBuffer())의 크기와 샘플 수를 따라야 하며, 그렇지 않으면 렌더링 또는 3D API 유효성 검사 오류가 발생할 수 있습니다.
서브클래스에서 생성된 그래픽 리소스는 서브클래스의 디스트럭터 구현에서 해제될 것으로 예상됩니다.
cb 는 현재 프레임의 QRhiCommandBuffer 입니다. 이 함수는 프레임이 기록되고 있지만 활성 렌더 패스가 없는 상태에서 호출됩니다. 명령 버퍼는 주로 render()로 지연하지 않고 resource updates 을 큐에 넣을 수 있도록 하기 위해 제공됩니다.
이 함수는 렌더 스레드가 있는 경우 렌더 스레드에서 호출됩니다.
render()도 참조하세요 .
[protected]
QRhiRenderBuffer *QQuickRhiItemRenderer::msaaColorBuffer() const
항목의 멀티샘플 컬러 버퍼 역할을 하는 렌더버퍼를 반환합니다.
initialize() 및 render()에서만 호출해야 합니다.
sampleCount 이 1보다 커서 멀티샘플 안티앨리어싱이 활성화된 경우 반환된 QRhiRenderBuffer 은 샘플 수가 일치하며 컬러 버퍼로 사용됩니다. 이 버퍼로 렌더링하는 데 사용되는 그래픽 파이프라인은 동일한 샘플 수로 생성되어야 하며 깊이 스텐실 버퍼의 샘플 수 역시 일치해야 합니다. 멀티 샘플 콘텐츠는 resolveTexture()에서 반환된 텍스처로 리졸브될 것으로 예상됩니다. isAutoRenderTargetEnabled 가 true
인 경우 renderTarget()는 이를 위해 자동으로 설정되며, msaaColorBuffer()를 색상 첨부 0의 renderbuffer 로 설정하고 resolveTexture()를 해당 resolveTexture 로 설정하여 이를 수행합니다.
MSAA를 사용하지 않는 경우 반환 값은 nullptr
입니다. 대신 colorTexture()를 사용하십시오.
기본 3D 그래픽 API에 따라 샘플 수가 1보다 큰 멀티샘플 텍스처와 컬러 렌더버퍼 간에 실질적인 차이가 없을 수 있습니다(QRhi 는 둘 다 동일한 기본 리소스 유형에 매핑할 수 있습니다). 그러나 일부 구형 API는 텍스처와 렌더버퍼를 구분할 수 있습니다. 멀티샘플 렌더버퍼는 사용할 수 있지만 멀티샘플 텍스처는 사용할 수 없는 OpenGL ES 3.0을 지원하기 위해 QQuickRhiItem 에서는 항상 멀티샘플 QRhiRenderBuffer 을 색상 어태치먼트로 사용하여 MSAA를 수행합니다(멀티샘플 QRhiTexture 은 사용하지 않음).
참고: 백킹 텍스처 크기와 샘플 수는 renderTarget()에서 반환된 QRhiRenderTarget 을 통해서도 쿼리할 수 있습니다. 이는 멀티샘플링 사용 여부와 관계없이 작동하므로 QRhiTexture 또는 QRhiRenderBuffer 에서 쿼리하는 것보다 더 편리하고 간결할 수 있습니다.
colorTexture(), depthStencilBuffer(), renderTarget() 및 resolveTexture()도 참조하세요 .
[pure virtual protected]
void QQuickRhiItemRenderer::render(QRhiCommandBuffer *cb)
백킹 컬러 버퍼의 콘텐츠를 업데이트해야 할 때 호출됩니다.
이 함수가 호출되기 전에 항상 initialize()를 한 번 이상 호출합니다.
업데이트를 요청하려면 QML 또는 메인/GUI 스레드의 C++ 코드(예: 속성 세터에서)에서 호출할 때는 QQuickItem::update(), QQuickRhiItemRenderer 콜백 내에서 호출할 때는 update()을 호출하세요. 렌더() 내에서 QQuickRhiItemRenderer 의 update()을 호출하면 업데이트를 계속 트리거하게 됩니다.
cb 는 현재 프레임의 QRhiCommandBuffer 입니다. 이 함수는 프레임이 기록되고 있지만 활성 렌더 패스가 없는 상태에서 호출됩니다.
이 함수는 렌더 스레드가 있는 경우 렌더 스레드에서 호출됩니다.
initialize() 및 synchronize()도 참조하세요 .
[protected]
QRhiRenderTarget *QQuickRhiItemRenderer::renderTarget() const
render()의 재구현에서 QRhiCommandBuffer::beginPass()와 함께 사용해야 하는 렌더링 대상 객체를 반환합니다.
initialize() 및 render()에서만 호출해야 합니다.
isAutoRenderTargetEnabled 가 true
일 때만 사용할 수 있습니다. 그렇지 않으면 반환되는 값은 nullptr
이며 initialize()의 재구현에 따라 깊이 스텐실 버퍼와 QRhiTextureRenderTarget 를 생성하고 관리합니다.
graphics pipelines 을 생성할 때는 QRhiRenderPassDescriptor 이 필요합니다. 이는 renderPassDescriptor()을 호출하여 반환된 QRhiTextureRenderTarget 에서 쿼리할 수 있습니다.
참고: 반환된 QRhiTextureRenderTarget 은 항상 1
의 devicePixelRatio()을 반환합니다. 이는 스왑체인과 관련 창에만 텍스처가 아닌 디바이스 픽셀 비율의 개념이 있고 여기서 렌더 타깃은 항상 텍스처를 참조하기 때문입니다. 온스크린 배율이 렌더링과 관련이 있는 경우 synchronize()에서 항목의 window()->effectiveDevicePixelRatio()
을 통해 쿼리하여 저장합니다. 이 경우 항상 기본 클래스의 devicePixelRatio()보다 effectiveDevicePixelRatio()를 사용하는 것을 선호합니다.
colorTexture(), depthStencilBuffer() 및 QQuickWindow::effectiveDevicePixelRatio()도 참조하세요 .
[protected]
QRhiTexture *QQuickRhiItemRenderer::resolveTexture() const
멀티샘플 콘텐츠가 해결되는 비멀티샘플 텍스처를 반환합니다.
멀티샘플 앤티앨리어싱이 활성화되지 않은 경우 결과는 nullptr
입니다.
initialize() 및 render()에서만 호출해야 합니다.
MSAA를 활성화하면 Qt Quick 의 메인 렌더 패스에서 쿼드를 텍스처링할 때 아이템의 기본 씬 그래프 노드가 사용하는 텍스처입니다. 그러나 QQuickRhiItemRenderer 의 렌더링은 msaaColorBuffer()에서 반환된 (멀티 샘플) QRhiRenderBuffer 을 대상으로 해야 합니다. isAutoRenderTargetEnabled 가 true
인 경우 이는 renderTarget()에서 반환된 QRhiRenderTarget 에 의해 처리됩니다. 그렇지 않으면 서브클래스 코드가 컬러 버퍼와 리졸브 텍스처를 모두 사용하여 렌더링 대상 객체를 올바르게 구성해야 합니다.
colorTexture()도 참조하세요 .
[protected]
QRhi *QQuickRhiItemRenderer::rhi() const
현재 QRhi 객체를 반환합니다.
initialize() 및 render()에서만 호출해야 합니다.
[pure virtual protected]
void QQuickRhiItemRenderer::synchronize(QQuickRhiItem *item)
이 함수는 메인/GUI 스레드가 차단된 상태에서 렌더 스레드가 있는 경우 렌더 스레드에서 호출됩니다. 이 함수는 the item's synchronize step에서 호출되며 메인 및 렌더 스레드에 속한 데이터를 읽고 쓸 수 있습니다. 일반적으로 QQuickRhiItem 에 저장된 속성 값은 QQuickRhiItemRenderer 에 복사되어 나중에 렌더링 스레드와 메인 스레드가 계속 병렬로 작동할 때 render()에서 안전하게 읽을 수 있습니다.
initialize() 및 render()도 참조하세요 .
[protected]
void QQuickRhiItemRenderer::update()
오프스크린 컬러 버퍼의 콘텐츠를 업데이트해야 할 때 이 함수를 호출합니다. (즉, render()를 다시 호출하도록 요청하는 경우, 호출은 나중에 이루어지며 업데이트는 일반적으로 프레젠테이션 속도에 맞춰 조절된다는 점에 유의하세요.)
이 함수는 render()에서 호출하여 업데이트를 예약할 수 있습니다.
참고: 이 함수는 렌더러 내부에서 사용해야 합니다. GUI 스레드에서 항목을 업데이트하려면 QQuickRhiItem::update()를 사용합니다.
© 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.