이 페이지에서

QCanvasRhiPaintDriver Class

QCanvasRhiPaintDriver 클래스는 ` QCanvasPainter` 기반의 렌더링에서 ` QRhi ` 렌더 타깃 및 오프스크린 캔버스와 관련된 저수준 측면을 관리합니다. 더 보기...

헤더: #include <QCanvasRhiPaintDriver>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
다음부터: Qt 6.11부터

공개 유형

enum class BeginPaintFlag { DepthTest }
flags BeginPaintFlags
enum class EndPaintFlag { DoNotRecordRenderPass }
flags EndPaintFlags

공개 함수

void beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
void beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
void beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, QColor fillColor = Qt::black, QSize logicalSize = QSize(), qreal dpr = 1.0, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
void endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {})
void grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)
void renderPaint()
void resetForNewFrame()

상세 설명

QCanvasPainter 를 사용하여 QRhiTexture 와 같은 QRhi 기반 렌더 타깃이나 QRhiSwapChain 의 컬러 버퍼에 렌더링하려는 애플리케이션은 QCanvasPainterFactory 를 사용하여 QRhi 와 관련된 QCanvasPainter 및 QCanvasRhiPaintDriver를 초기화하고 가져옵니다. 그리기 API는 QCanvasPainter 에서 제공되며, 렌더링의 저수준 측면(렌더 타겟이 무엇인지, 명령 버퍼가 무엇인지 등)은 QCanvasRhiPaintDriver에 의해 제어됩니다.

참고: 이 클래스는 QCanvasPainterWidget 이나 QCanvasPainterItem 과 같은 편의 클래스를 사용하지 않고 QCanvasPainter 을 다룰 때만 관련이 있습니다. 이러한 편의 클래스는 애플리케이션에 QCanvasPainter 인스턴스를 제공하고 렌더링을 암시적으로 관리하기 때문입니다.

애플리케이션은 QCanvasRhiPaintDriver의 인스턴스를 직접 생성하지 않습니다. 대신, paintDriver()를 호출하여 성공적으로 initialized 된 QCanvasPainterFactory 에서 이를 가져옵니다.

다음은 QRhiTexture 내에 원을 그리고, 결과를 다시 읽어와 PNG 파일로 저장하는 거의 완성된 독립형 콘솔 애플리케이션입니다:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    // std::unique_ptr<QRhi> rhi(QRhi::create(...));

    std::unique_ptr<QRhiTexture> tex(rhi->newTexture(QRhiTexture::RGBA8, QSize(1280, 720), 1,
                                     QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource));
    tex->create();
    std::unique_ptr<QRhiRenderBuffer> ds(rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, QSize(1280, 720)));
    ds->create();
    QRhiTextureRenderTargetDescription rtDesc;
    rtDesc.setColorAttachments({ tex.get() });
    rtDesc.setDepthStencilBuffer(ds.get());
    std::unique_ptr<QRhiTextureRenderTarget> rt(rhi->newTextureRenderTarget(rtDesc));
    std::unique_ptr<QRhiRenderPassDescriptor> rp(rt->newCompatibleRenderPassDescriptor());
    rt->setRenderPassDescriptor(rp.get());
    rt->create();

    std::unique_ptr<QCanvasPainterFactory> factory(new QCanvasPainterFactory);
    QCanvasPainter *painter = factory->create(rhi.get());
    QCanvasRhiPaintDriver *pd = factory->paintDriver();

    QRhiCommandBuffer *cb;
    QRhiReadbackResult readbackResult;

    rhi->beginOffscreenFrame(&cb);
    pd->resetForNewFrame();

    {
        pd->beginPaint(cb, rt.get());

        painter->beginPath();
        painter->circle(640, 360, 180);
        painter->setFillStyle(Qt::red);
        painter->fill();

        pd->endPaint();

        QRhiResourceUpdateBatch *u = rhi->nextResourceUpdateBatch();
        u->readBackTexture({ tex.get() }, &readbackResult);
        cb->resourceUpdate(u);
    }

    rhi->endOffscreenFrame();

    QImage image(reinterpret_cast<const uchar *>(readbackResult.data.constData()),
                    readbackResult.pixelSize.width(),
                    readbackResult.pixelSize.height(),
                    QImage::Format_RGBA8888);
    if (rhi->isYUpInFramebuffer())
        image.flip();

    image.save("result.png");

    return 0;
}

멤버 유형 문서

enum class QCanvasRhiPaintDriver::BeginPaintFlag
flags QCanvasRhiPaintDriver::BeginPaintFlags

beginPaint() 함수의 플래그를 지정합니다.

상수값설명
QCanvasRhiPaintDriver::BeginPaintFlag::DepthTest0x01렌더링 시 깊이 테스트를 활성화해야 함을 나타냅니다. 일반적으로 QCanvasPainter 는 깊이 버퍼를 쓰거나 테스트하지 않습니다. 다른 렌더러가 쓴 값과 비교 테스트가 필요한 경우 이 플래그를 설정하십시오. 사용되는 깊이 비교 함수는 Less 입니다.

BeginPaintFlags 유형은 QFlags<BeginPaintFlag>에 대한 typedef입니다. 이 유형은 BeginPaintFlag 값들의 OR 조합을 저장합니다.

enum class QCanvasRhiPaintDriver::EndPaintFlag
flags QCanvasRhiPaintDriver::EndPaintFlags

endPaint() 함수의 플래그를 지정합니다.

상수값설명
QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass0x01이후에 renderPaint()를 명시적으로 호출할 예정이므로, QCanvasPainter 가 생성한 명령을 플러시하거나 QRhi 렌더 패스를 기록하지 않음을 나타냅니다.

EndPaintFlags 유형은 QFlags<EndPaintFlag>에 대한 typedef입니다. 이 유형은 EndPaintFlag 값들의 OR 조합을 저장합니다.

멤버 함수 문서

void QCanvasRhiPaintDriver::beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})

지정된 오프스크린 canvas 에 페인팅을 시작하며, 렌더링 명령을 명령 버퍼 cb 에 기록합니다.

참고: beginPaint() 호출 뒤에는 반드시 endPaint()이 따라와야 합니다. 현재 중첩은 지원되지 않습니다.

QCanvasOffscreenCanvas::Flag::PreserveContents 플래그가 설정된 경우를 제외하고는 fill color set on the canvas 를 통해 지워집니다. 플래그가 설정된 경우 지워지지 않고 캔버스 내용이 보존됩니다(기본 GPU 아키텍처에 따라 성능에 영향을 미칠 수 있음).

참고: 관련 QRhi 는 프레임을 기록 중이어야 합니다(QRhi::beginFrame() 또는 QRhi::beginOffscreenFrame()가 호출되었어야 함). 단, 이 함수가 호출될 때 렌더 패스 기록 상태에 있어서는 안 됩니다.

flags 렌더링을 제어하는 선택적 플래그를 지정합니다.

이 함수는 오버로드된 함수입니다.

void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})

렌더 타겟 rt 에 페인팅을 시작하고, 렌더링 명령을 명령 버퍼 cb 에 기록합니다.

이 오버로드는 정점 변환에 사용되는 사용자 정의 matrix 를 인수로 받습니다. 이 행렬은 좌표가 픽셀 단위로 지정된 정점을 처리할 수 있어야 합니다. 일반적인 사용 사례로는 QSGRenderNode 의 하위 클래스 내에서 QCanvasPainter 기반 렌더링을 구현할 때 Qt Quick 의 모델-뷰-투영 행렬을 전달하는 것입니다.

뷰포트 크기와 장치 픽셀 비율은 렌더 타깃에서 가져옵니다.

이 오버로드는 채우기 색상을 받지 않습니다. 실제로는 EndPaintFlag::DoNotRecordRenderPass 플래그가 설정된 endPaint() 호출이 뒤따를 것으로 예상되기 때문입니다.

참고: 사용자 정의 행렬을 사용할 경우 클리핑지원이 제한됩니다. 행렬이 추가적인 크기 조정이나 회전 없이 정사영 투영을 지정할 때만 직사각형의 변환되지 않은 클립이 지원됩니다. 일반적으로 이 모드에서는 클리핑에 의존하는 그리기를 피하는 것이 좋습니다.

참고: beginPaint() 호출 후에는 반드시 endPaint()이 이어져야 합니다. 현재 중첩은 지원되지 않습니다.

참고: ` rt `에는 색상 및 깊이-스텐실 어태치먼트가 모두 있어야 합니다. 색상 어태치먼트가 여러 개인 경우, 어태치먼트 0에 해당하는 색상 버퍼만 기록됩니다. ` QCanvasPainter `를 사용하려면 깊이-스텐실 버퍼가 있어야 합니다. 현재는 스텐실만 사용되며, 깊이 테스트 및 기록은 항상 비활성화되어 있습니다.

참고: 관련 QRhi 는 프레임을 기록 중이어야 합니다(QRhi::beginFrame() 또는 QRhi::beginOffscreenFrame()가 호출되었어야 함). 그러나 이 함수가 호출될 때 렌더 패스 기록 상태에 있어서는 안 됩니다.

flags 렌더링을 제어하는 선택적 플래그를 지정합니다.

이 함수는 오버로드된 함수입니다.

void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, QColor fillColor = Qt::black, QSize logicalSize = QSize(), qreal dpr = 1.0, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})

렌더 타겟 rt 에 그리기를 시작하며, 렌더링 명령을 명령 버퍼 cb 에 기록합니다.

fillColor 컬러 버퍼를 지우는 데 사용되는 색상을 지정합니다. endPaint()의 플래그에 EndPaintFlag::DoNotRecordRenderPass 가 포함되어 있는 경우 이 값은 무시됩니다.

참고: beginPaint() 호출 후에는 반드시 endPaint()이 뒤따라야 합니다. 현재 중첩은 지원되지 않습니다.

참고: ` rt `에는 색상 및 깊이-스텐실 어태치먼트가 모두 있어야 합니다. 색상 어태치먼트가 여러 개인 경우, 어태치먼트 0에 해당하는 색상 버퍼만 기록됩니다. ` QCanvasPainter `을 사용하려면 깊이-스텐실 버퍼가 반드시 존재해야 합니다. 현재는 스텐실만 사용되며, 깊이 테스트 및 기록은 항상 비활성화되어 있습니다.

logicalSize 는 선택 사항입니다. 비어 있지 않을 경우, 논리 단위로 뷰포트 크기를 지정합니다. 이 경우 dpr 는 logicalSize 가 내부적으로 픽셀로 변환될 수 있도록 스케일 계수(디바이스 픽셀 비율)를 지정해야 합니다. 실제로는 렌더 타겟의 크기가 기본적으로 자동으로 사용되므로 이 옵션이 필요한 경우는 거의 없습니다.

참고: 관련 QRhi 는 프레임을 기록 중이어야 합니다(QRhi::beginFrame() 또는 QRhi::beginOffscreenFrame()가 호출되었어야 함). 하지만 이 함수가 호출될 때는 렌더 패스 기록 상태에 있어서는 안 됩니다.

flags 렌더링을 제어하는 선택적 플래그를 지정합니다.

이 함수는 오버로드된 함수입니다.

void QCanvasRhiPaintDriver::endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {})

QCanvasPainter 렌더링 명령어로 생성된 모든 QRhi 렌더링을 플러시하고 기록합니다.

기본적으로 이 함수는 전체 렌더링 패스를 기록하며, 이는 내부적으로 ` QRhiCommandBuffer::beginPass()` 및 ` QRhiCommandBuffer::endPass()`를 호출함을 의미합니다. 클리어 색상은 ` beginPaint()`의 `fillColor` 인자 또는 오프스크린 캔버스의 채우기 색상으로 지정됩니다.

flags endPaint()가 beginPass() - endPass() 시퀀스 전체를 실행하도록 하는 것이 바람직하지 않은 경우가 있으므로, 이 함수를 사용하여 렌더 패스 기록을 제어할 수 있습니다.

다음 두 코드 조각은 결과 면에서는 동일하지만, 애플리케이션이 동일한 렌더 패스 내에서 더 많은 작업을 수행하고자 하는 경우 두 번째 코드가 더 큰 유연성을 제공합니다:

pd->beginPaint(cb, rt, Qt::black);
// painter->...
pd->endPaint();
pd->beginPaint(cb, rt);
// painter->...
pd->endPaint(QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass);

cb->beginPass(rt, Qt::black, { 1.0f, 0 });
pd->renderPaint();
cb->endPass();

beginPaint() 및 renderPaint()도 참조하십시오 .

template <typename Functor> void QCanvasRhiPaintDriver::grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)

canvas 에 대한 텍스처 리드백 요청을 발행하며, 이를 context 와 연결합니다.

callback 이 함수는 기본이 되는 ` QRhi ` 및 3D API 구현에 따라, 함수가 반환되기 전이나 그 이후에 호출됩니다. 텍스처 내용을 다시 읽는 과정에는 GPU 아키텍처에 따라 GPU→CPU 복사가 포함될 수 있습니다. 이 함수는 단일 ` const QImage & ` 인자를 받으며, 이동 전용(move-only) 함수를 포함하여 어떤 펑터(functor)라도 사용할 수 있습니다.

읽기 작업이 완료되기 전에 context 가 소멸되면, 그랩이 취소되고 callback 는 호출되지 않습니다. 따라서 콜백 함수에서 진행 중인 읽기 작업이 완료되기 전에 소멸될 수 있는 객체를 참조해도 안전합니다.

이 함수는 ` beginPaint()` - ` endPaint()` 블록 내부와 외부 모두에서 호출될 수 있습니다. 외부에서 호출될 경우, 내부적으로 ` QRhi::beginOffscreenFrame()` 등을 호출하여 언제든지 그랩을 수행할 수 있게 합니다.

예를 들어, 다음 코드는 화면 밖 캔버스의 내용을 PNG 파일로 저장합니다:

grabCanvas(offscreenCanvas, qGuiApp, [](const QImage &image) {
    image.save("result.png");
});

void QCanvasRhiPaintDriver::renderPaint()

QCanvasPainter 드로잉 명령어로 생성된 모든 QRhi 렌더링을 기록합니다. 이 함수는 endPaint()이 DoNotRecordRenderPass 로 호출된 경우에만 호출해야 합니다. 그 외의 경우에는 절대로 호출해서는 안 됩니다.

이 함수가 호출될 때, 관련 QRhi 는 렌더링 패스를 기록 중이어야 합니다.

endPaint()도 참조하십시오 .

void QCanvasRhiPaintDriver::resetForNewFrame()

페인터 엔진 상태를 초기화합니다. 이 함수는 완전히 새로운 프레임을 시작할 때, 일반적으로 ` QRhi::beginFrame()` 또는 ` QRhi::beginOffscreenFrame()` 호출 후에 한 번 호출되어야 합니다.

© 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.