이 페이지에서

QQuickRhiItem Class

QQuickRhiItem 클래스는 QQuickFramebufferObject 에 대한 이식성 높은 대안으로, OpenGL에 의존하지 않고 Qt Quick 를 통해 QRhi API와 렌더링을 통합할 수 있게 해줍니다. 더 보기...

헤더: #include <QQuickRhiItem>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
다음부터: Qt 6.7
상속: QQuickItem

공개 유형

enum class TextureFormat { RGBA8, RGBA16F, RGBA32F, RGB10A2 }

속성

공개 함수

QQuickRhiItem(QQuickItem *parent = nullptr)
virtual ~QQuickRhiItem() override
bool alphaBlending() const
QQuickRhiItem::TextureFormat colorBufferFormat() const
QSize effectiveColorBufferSize() const
int fixedColorBufferHeight() const
int fixedColorBufferWidth() const
bool isMirrorVerticallyEnabled() const
int sampleCount() const
void setAlphaBlending(bool enable)
void setColorBufferFormat(QQuickRhiItem::TextureFormat format)
void setFixedColorBufferHeight(int height)
void setFixedColorBufferWidth(int width)
void setMirrorVertically(bool enable)
void setSampleCount(int samples)

재구현된 공용 함수

virtual bool isTextureProvider() const override
virtual QSGTextureProvider *textureProvider() const override

신호

보호된 함수

virtual QQuickRhiItemRenderer *createRenderer() = 0
bool isAutoRenderTargetEnabled() const
void setAutoRenderTarget(bool enabled)

재구현된 보호 함수

virtual bool event(QEvent *e) override
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
virtual void releaseResources() override

상세 설명

QQuickRhiItem은 Qt Quick 환경에서 QRhiWidget 의 실질적인 대응 클래스입니다. 이 두 클래스 모두 서브클래스화를 목적으로 하며, 오프스크린 색상 버퍼를 대상으로 하는 QRhi 기반 렌더링을 기록할 수 있게 해줍니다. 결과로 생성된 2D 이미지는 이후 Qt Quick 장면의 나머지 부분과 합성됩니다.

참고: QQuickRhiItem은 공개 QtAPI이지만 , Qt GUI 모듈의 QRhi 클래스 계열( QShader 및 QShaderDescription 포함)은 제한된 호환성만 보장합니다. 이 클래스들에 대해서는 소스나 바이너리 호환성이 보장되지 않으므로, 해당 API는 애플리케이션이 개발된 시점의 Qt 버전에서만 작동이 보장됩니다. 다만, 소스 비호환성 변경 사항은 최소한으로 유지되도록 노력하며, 마이너 릴리스(6.7, 6.8 등)에서만 이루어질 예정입니다. qquickrhiitem.h 에는 QRhi 관련 헤더 파일이 직접 포함되어 있지 않습니다. QQuickRhiItem 서브클래스를 구현할 때 이러한 클래스를 사용하려면, Qt::GuiPrivate 에 링크하고(CMake를 사용하는 경우), rhi 접두사가 붙은 적절한 헤더를 포함시켜야 합니다(예: #include <rhi/qrhi.h>).

QQuickRhiItem은 구형 QQuickFramebufferObject 클래스를 대체하는 클래스입니다. 후자는 본질적으로 OpenGL/OpenGL ES에 묶여 있는 반면, QQuickRhiItem은 QRhi 클래스와 연동되어 Vulkan, Metal, Direct 3D 11/12 및 OpenGL/OpenGL ES에서 동일한 렌더링 코드를 실행할 수 있게 해줍니다. 개념적, 기능적으로 두 클래스는 매우 유사하며, QQuickFramebufferObject 에서 QQuickRhiItem으로의 마이그레이션은 간단합니다. OpenGL API를 직접 사용하는 기존 애플리케이션 코드의 호환성을 보장하기 위해 QQuickFramebufferObject 은 계속 사용할 수 있습니다.

참고: Qt Quick 장면 그래프의 software 변형을 사용할 경우QQuickRhiItem은 작동하지 않습니다.

대부분의 플랫폼에서 씬 그래프 렌더링, 즉 QQuickRhiItem에 의해 수행되는 렌더링은 전용 스레드에서 이루어집니다. 이러한 이유로 QQuickRhiItem 클래스는 항목 구현( QQuickItem 의 서브클래스)과 실제 렌더링 로직 간의 엄격한 분리를 강제합니다. QML에 노출되는 속성 및 UI 관련 헬퍼 함수와 같은 모든 항목 로직은 QQuickRhiItem 서브클래스에 위치해야 합니다. 렌더링과 관련된 모든 요소는 QQuickRhiItemRenderer 클래스에 위치해야 합니다. 두 스레드 간 경합 조건 및 읽기/쓰기 문제를 방지하기 위해, 렌더러와 항목이 공유 변수를 절대 읽거나 쓰지 않도록 하는 것이 중요합니다. 아이템과 렌더러 간의 통신은 주로 QQuickRhiItem::synchronize() 함수를 통해 이루어져야 합니다. 이 함수는 GUI 스레드가 차단된 상태에서 렌더링 스레드에서 호출됩니다. 아이템과 렌더러 간의 통신에 큐 기반 연결이나 이벤트를 사용하는 것도 가능합니다.

애플리케이션은 QQuickRhiItem과 QQuickRhiItemRenderer 의 하위 클래스를 모두 상속해야 합니다. 순수 가상 함수인 createRenderer()는 QQuickRhiItemRenderer 하위 클래스의 새 인스턴스를 반환하도록 재구현해야 합니다.

QRhiWidget 와 마찬가지로, QQuickRhiItem은 색상 버퍼를 자동으로 관리합니다. 이 버퍼는 일반적으로 2D 텍스처(QRhiTexture)이며, 멀티샘플링이 사용될 때는 QRhiRenderBuffer 입니다. (일부 3D API는 텍스처와 렌더 버퍼를 구분하는 반면, 다른 일부에서는 기본 네이티브 리소스가 동일합니다. 렌더 버퍼는 주로 OpenGL ES 3.0에서 멀티샘플링을 가능하게 하기 위해 사용됩니다)

텍스처의 크기는 기본적으로 항목의 크기에 맞춰 조정됩니다( device pixel ratio 를 고려함). 항목 크기가 변경되면 텍스처는 올바른 크기로 다시 생성됩니다. 고정된 크기를 원할 경우, fixedColorBufferWidth 및 fixedColorBufferHeight 를 0이 아닌 값으로 설정하십시오.

QQuickRhiItem은 텍스처 제공자( texture provider )이며, ShaderEffects 및 텍스처 제공자를 사용하는 다른 클래스에서 직접 사용할 수 있습니다.

주요 사용 사례는 아니지만, QQuickRhiItem을 사용하면 Vulkan, Metal, Direct 3D 또는 OpenGL과 같은 3D 그래픽 API를 직접 사용하는 렌더링 코드를 통합할 수도 있습니다. QRhi 렌더 패스 내에서 네이티브 명령을 기록하는 방법에 대한 자세한 내용은 QRhiCommandBuffer::beginExternal()을 참조하고, 기존 네이티브 텍스처를 래핑한 다음 후속 렌더 패스에서 QRhi 와 함께 사용하는 방법에 대해서는 QRhiTexture::createFrom()을 참조하십시오. 네이티브 3D API 환경(예: 디바이스 확장 기능) 구성에 대해서는 QQuickGraphicsConfiguration 를 참조하십시오. 또한, QWindow::setVulkanInstance()를 충분히 이른 시점에 호출함으로써 QQuickWindow 를 사용자 정의 QVulkanInstance 와 연결할 수 있다는 점에 유의하십시오.

참고: QQuickRhiItem은 항상 QQuickWindow 가 사용하는 것과 동일한 QRhi 인스턴스(그리고 더 나아가 동일한 OpenGL 컨텍스트, Vulkan 장치 등)를 사용합니다. 어떤 기본 3D 그래픽 API를 사용할지 선택하려면, QQuickWindow 에 대해 충분히 이른 시점에 setGraphicsApi()을 호출하십시오. 씬 그래프가 초기화된 후에는 이를 변경할 수 없으며, 씬 내의 모든 QQuickRhiItem 인스턴스는 동일한 3D API를 사용하여 렌더링됩니다.

간단한 예제

다음 QQuickRhiItem의 서브클래스를 살펴보십시오. 여기서는 전체 형태를 보여줍니다. 이 클래스는 원근 투영을 사용하여 단일 삼각형을 렌더링하며, 삼각형은 사용자 정의 항목의 angle 속성에 따라 회전합니다. (즉, QML의 NumberAnimation 와 같은 애니메이션을 통해 제어할 수 있습니다)

class ExampleRhiItemRenderer : public QQuickRhiItemRenderer
{
public:
    void initialize(QRhiCommandBuffer *cb) override;
    void synchronize(QQuickRhiItem *item) override;
    void render(QRhiCommandBuffer *cb) override;

private:
    QRhi *m_rhi = nullptr;
    std::unique_ptr<QRhiBuffer> m_vbuf;
    std::unique_ptr<QRhiBuffer> m_ubuf;
    std::unique_ptr<QRhiShaderResourceBindings> m_srb;
    std::unique_ptr<QRhiGraphicsPipeline> m_pipeline;
    QMatrix4x4 m_viewProjection;
    float m_angle = 0.0f;
};

class ExampleRhiItem : public QQuickRhiItem
{
    Q_OBJECT
    QML_NAMED_ELEMENT(ExampleRhiItem)
    Q_PROPERTY(float angle READ angle WRITE setAngle NOTIFY angleChanged)

public:
    QQuickRhiItemRenderer *createRenderer() override;

    float angle() const { return m_angle; }
    void setAngle(float a);

signals:
    void angleChanged();

private:
    float m_angle = 0.0f;
};

QQuickRhiItemRenderer *ExampleRhiItem::createRenderer()
{
    return new ExampleRhiItemRenderer;
}

void ExampleRhiItem::setAngle(float a)
{
    if (m_angle == a)
        return;

    m_angle = a;
    emit angleChanged();
    update();
}

void ExampleRhiItemRenderer::synchronize(QQuickRhiItem *rhiItem)
{
    ExampleRhiItem *item = static_cast<ExampleRhiItem *>(rhiItem);
    if (item->angle() != m_angle)
        m_angle = item->angle();
}

static QShader getShader(const QString &name)
{
    QFile f(name);
    return f.open(QIODevice::ReadOnly) ? QShader::fromSerialized(f.readAll()) : QShader();
}

static float vertexData[] = {
    0.0f,   0.5f,   1.0f, 0.0f, 0.0f,
    -0.5f,  -0.5f,   0.0f, 1.0f, 0.0f,
    0.5f,  -0.5f,   0.0f, 0.0f, 1.0f,
};

void ExampleRhiItemRenderer::initialize(QRhiCommandBuffer *cb)
{
    if (m_rhi != rhi()) {
        m_pipeline.reset();
        m_rhi = rhi();
    }

    if (!m_pipeline) {
        m_vbuf.reset(m_rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(vertexData)));
        m_vbuf->create();

        m_ubuf.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, 64));
        m_ubuf->create();

        m_srb.reset(m_rhi->newShaderResourceBindings());
        m_srb->setBindings({
            QRhiShaderResourceBinding::uniformBuffer(0, QRhiShaderResourceBinding::VertexStage, m_ubuf.get()),
        });
        m_srb->create();

        m_pipeline.reset(m_rhi->newGraphicsPipeline());
        m_pipeline->setShaderStages({
            { QRhiShaderStage::Vertex, getShader(QLatin1String(":/shaders/color.vert.qsb")) },
            { QRhiShaderStage::Fragment, getShader(QLatin1String(":/shaders/color.frag.qsb")) }
        });
        QRhiVertexInputLayout inputLayout;
        inputLayout.setBindings({
            { 5 * sizeof(float) }
        });
        inputLayout.setAttributes({
            { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
            { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
        });
        m_pipeline->setVertexInputLayout(inputLayout);
        m_pipeline->setShaderResourceBindings(m_srb.get());
        m_pipeline->setRenderPassDescriptor(renderTarget()->renderPassDescriptor());
        m_pipeline->create();

        QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
        resourceUpdates->uploadStaticBuffer(m_vbuf.get(), vertexData);
        cb->resourceUpdate(resourceUpdates);
    }

    const QSize outputSize = renderTarget()->pixelSize();
    m_viewProjection = m_rhi->clipSpaceCorrMatrix();
    m_viewProjection.perspective(45.0f, outputSize.width() / (float) outputSize.height(), 0.01f, 1000.0f);
    m_viewProjection.translate(0, 0, -4);
}

void ExampleRhiItemRenderer::render(QRhiCommandBuffer *cb)
{
    QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
    QMatrix4x4 modelViewProjection = m_viewProjection;
    modelViewProjection.rotate(m_angle, 0, 1, 0);
    resourceUpdates->updateDynamicBuffer(m_ubuf.get(), 0, 64, modelViewProjection.constData());

    const QColor clearColor = QColor::fromRgbF(0.4f, 0.7f, 0.0f, 1.0f);
    cb->beginPass(renderTarget(), clearColor, { 1.0f, 0 }, resourceUpdates);

    cb->setGraphicsPipeline(m_pipeline.get());
    const QSize outputSize = renderTarget()->pixelSize();
    cb->setViewport(QRhiViewport(0, 0, outputSize.width(), outputSize.height()));
    cb->setShaderResources();
    const QRhiCommandBuffer::VertexInput vbufBinding(m_vbuf.get(), 0);
    cb->setVertexInput(0, 1, &vbufBinding);
    cb->draw(3);

    cb->endPass();
}

이 간단한 클래스가 ‘ QRhiWidget ’ 소개에 제시된 코드와 거의 정확히 동일하다는 점이 주목할 만합니다. 버텍스 셰이더와 프래그먼트 셰이더도 동일합니다. 이들은 Vulkan 스타일의 GLSL 소스 코드로 제공되며, 먼저 Qt 셰이더 인프라를 통해 처리되어야 합니다. 이는 qsb 명령줄 도구를 수동으로 실행하거나, CMake의 qt_add_shaders() 함수를 사용하여 수행할 수 있습니다. QQuickRhiItem은 애플리케이션과 함께 제공되는 이러한 사전 처리된 .qsb 파일을 로드합니다. Qt의 셰이더 변환 인프라에 대한 자세한 내용은 Qt Shader Tools 를 참조하십시오.

color.vert

#version 440
layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 v_color;
layout(std140, binding = 0) uniform buf {
    mat4 mvp;
};

void main()
{
    v_color = color;
    gl_Position = mvp * position;
}

color.frag

#version 440
layout(location = 0) in vec3 v_color;
layout(location = 0) out vec4 fragColor;

void main()
{
    fragColor = vec4(v_color, 1.0);
}

QML( QML_NAMED_ELEMENT 참조)에 노출되면, 사용자 정의 항목을 어떤 씬에서든 인스턴스화할 수 있습니다. (CMake 프로젝트에서 qt_add_qml_module() 에 지정된 적절한 URI 파일을 임포트한 후)

ExampleRhiItem {
    anchors.fill: parent
    anchors.margins: 10
    NumberAnimation on angle { from: 0; to: 360; duration: 5000; loops: Animation.Infinite }
}

더 복잡한 예제는 ‘씬 그래프 - RHI 텍스처 항목’을 참조하십시오.

QQuickRhiItemRenderer, ‘씬 그래프 - RHI 텍스처 아이템’, QRhi 및 ‘씬 그래프와 렌더링’도 참조하십시오 .

멤버 유형 문서

enum class QQuickRhiItem::TextureFormat

QQuickRhiItem 가 렌더링할 백킹 텍스처의 형식을 지정합니다.

상수값설명
QQuickRhiItem::TextureFormat::RGBA80QRhiTexture::RGBA8 를 참조하십시오. 이것이 기본값입니다.
QQuickRhiItem::TextureFormat::RGBA16F1QRhiTexture::RGBA16F 를 참조하십시오.
QQuickRhiItem::TextureFormat::RGBA32F2QRhiTexture::RGBA32F 를 참조하십시오.
QQuickRhiItem::TextureFormat::RGB10A23QRhiTexture::RGB10A2 를 참조하십시오.

QRhiTexture도 참조하십시오 .

속성 설명서

alphaBlending : bool

QQuickRhiItem 와 해당 렌더러에서 생성된 콘텐츠로 텍스처가 적용된 사각형을 그릴 때 블렌딩이 항상 활성화되도록 할지 여부를 제어합니다.

기본값은 ` false`입니다. 이는 성능상의 이유 때문입니다. 반투명도가 적용되지 않는 경우, ` QQuickRhiItemRenderer `는 불투명한 색상으로 지우고 알파 값이 1보다 작은 프래그먼트를 절대 렌더링하지 않으므로 블렌딩을 활성화할 필요가 없습니다.

QQuickRhiItemRenderer 의 서브클래스가 반투명도를 포함하여 렌더링하는 경우, 이 속성을 true로 설정하십시오.

참고: 특정조건에서는 이 속성의 값과 관계없이 블렌딩이 여전히 발생합니다. 예를 들어, 아이템의 opacity (더 정확하게는 부모 체인에서 상속받은 합산 불투명도)가 1보다 작다면, 이 속성이 false로 설정되어 있어도 블렌딩이 자동으로 활성화됩니다.

참고: Qt Quick 장면그래프는 사전 곱셈된 알파(pre-multiplied alpha)를 전제로 하며 이를 기대합니다. 예를 들어, 렌더러에서 배경을 알파 값 0.5로 지우려는 경우, 빨강, 녹색, 파랑 지우기 색상 값에도 0.5를 곱해야 합니다. 그렇지 않으면 블렌딩 결과가 부정확해집니다.

액세스 함수:

bool alphaBlending() const
void setAlphaBlending(bool enable)

Notifier 시그널:

void alphaBlendingChanged()

colorBufferFormat : TextureFormat

이 속성은 색상 버퍼로 사용되는 텍스처의 텍스처 형식을 제어합니다. 기본값은 ` TextureFormat::RGBA8`입니다. ` QQuickRhiItem `는 ` QRhiTexture`에서 지원하는 형식의 일부로만 렌더링을 지원합니다. ` QRhi::isTextureFormatSupported()`에서 지원되는 것으로 보고된 형식만 지정해야 하며, 그렇지 않으면 렌더링이 작동하지 않습니다.

참고: 항목과 해당 렌더러가 이미 초기화되어 렌더링이 완료된 상태에서 새로운 형식을설정하면 , 텍스처 형식의 차이로 인해 연관된 QRhiRenderPassDescriptor 가 호환되지 않게 될 경우 렌더러가 생성한 모든 QRhiGraphicsPipeline 객체가 사용할 수 없게 될 수 있습니다. sampleCount 를 동적으로 변경하는 경우와 마찬가지로, 이는 initialize() 또는 render() 구현에서 기존 파이프라인을 해제하고 새로운 파이프라인을 생성해야 함을 의미합니다.

액세스 함수:

QQuickRhiItem::TextureFormat colorBufferFormat() const
void setColorBufferFormat(QQuickRhiItem::TextureFormat format)

Notifier 신호:

void colorBufferFormatChanged()

[read-only] effectiveColorBufferSize : QSize

이 속성은 기본 색상 버퍼( QRhiTexture 또는 QRhiRenderBuffer)의 크기를 픽셀 단위로 반환합니다. 이 속성은 GUI(메인) 스레드, QML 바인딩 또는 자바스크립트에서 사용하기 위해 제공됩니다.

참고: 씬 그래프 렌더 스레드에서 작동하는QQuickRhiItemRenderer 구현체는 이 속성을 사용해서는 안 됩니다. 대신 render target 에서 크기를 조회해야 합니다.

참고: 메인 스레드의 관점에서 볼 때,이 값은 렌더 스레드에서 렌더링이 수행될 때 변경된다는 점에서 비동기적으로 사용 가능해집니다. 즉, 이 속성은 주로 QML 바인딩에서 유용합니다. 애플리케이션 코드는 QQuickRhiItem 객체가 생성될 때 이미 값이 최신 상태라고 가정해서는 안 됩니다.

이 속성은 읽기 전용입니다.

액세스 함수:

QSize effectiveColorBufferSize() const

Notifier 신호:

void effectiveColorBufferSizeChanged()

fixedColorBufferHeight : int

아이템에 연결된 텍스처의 고정 높이(픽셀 단위). 이 항목의 크기에 영향을 받지 않는 고정된 텍스처 크기를 원할 때 적용됩니다. 이 크기는 항목의 지오메트리(씬 내에서의 크기와 배치)에는 영향을 미치지 않으므로, 텍스처의 내용이 항목 영역에 맞춰 늘어나거나(확대) 축소되어 표시됩니다.

기본값은 0 입니다. 값이 0이면 텍스처 크기가 아이템의 크기를 따릅니다. (texture size = item size * device pixel ratio).

고정 너비와 높이를 설정하는 사용 사례에 대한 자세한 내용은 fixedColorBufferWidth 를 참조하십시오.

액세스 함수:

int fixedColorBufferHeight() const
void setFixedColorBufferHeight(int height)

Notifier 신호:

void fixedColorBufferHeightChanged()

fixedColorBufferWidth : int

항목에 연결된 텍스처 또는 렌더 버퍼의 고정 너비(픽셀 단위). 이 항목의 크기에 의존하지 않는 고정된 컬러 버퍼 크기를 원할 때 관련이 있습니다. 이 크기는 항목의 지오메트리(씬 내에서의 크기와 배치)에는 영향을 미치지 않으므로, 텍스처의 내용이 항목 영역에 늘어나 보이거나(확대) 축소되어 표시됩니다.

예를 들어, 아이템의 (픽셀) 크기의 정확히 두 배에 해당하는 크기를 설정하면 사실상 2배의 슈퍼샘플링이 수행됩니다(해상도를 두 배로 높여 렌더링한 다음, 씬에서 아이템에 해당하는 쿼드에 텍스처를 적용할 때 암시적으로 축소하는 방식). 반면, 아이템의 픽셀 크기의 절반에 해당하는 크기를 설정하면 사실상 절반 해상도로 렌더링한 후 결과를 확대하는 효과가 나타납니다.

기본값은 0 입니다. 값이 0이면 텍스처의 크기가 아이템의 크기를 따릅니다. (texture size = item size * device pixel ratio).

참고: 장치 픽셀비율 (시스템 컴포지터의 스케일 계수)은 성능에 큰 영향을 미칠 수 있습니다. 스케일 계수가 2 (200%)는 해상도를 두 배로 렌더링하는 것을 의미하므로, 개발자와 UI 디자이너가 인식하는 항목 크기의 두 배로 렌더링한 다음, 장치 픽셀 비율이 1인 시스템에서 이 속성을 항목의 픽셀 크기의 두 배로 설정했을 때와 마찬가지로 콘텐츠를 효과적으로 다운스케일하게 됩니다. 따라서, 시스템에서 어차피 1보다 큰 장치 픽셀 비율을 사용하는 경우, 많은 최신 데스크톱 시스템에는 이를 위한 필요성도 없고 성능 여유도 없기 때문에, 이 속성은 항목의 픽셀 크기보다 큰 크기로는 거의 사용되지 않을 것으로 예상됩니다. 대신, 이 속성의 주요 사용 사례는 항목(및 창)의 기하학적 크기가 아무리 크더라도 이를 무턱대고 따르기보다는, 합리적으로 더 작은 해상도로 렌더링하기 위해 더 작은 크기를 설정하는 것입니다.

액세스 함수:

int fixedColorBufferWidth() const
void setFixedColorBufferWidth(int width)

알림 신호:

void fixedColorBufferWidthChanged()

mirrorVertically : bool

이 속성은 텍스처가 적용된 사각형을 렌더링할 때 텍스처 UV가 반전되는지 여부를 제어합니다. 이 속성은 오프스크린 컬러 버퍼의 내용이나 ` QQuickRhiItemRenderer`에 의해 구현된 렌더링에는 영향을 미치지 않습니다.

기본값은 false 입니다.

액세스 함수:

bool isMirrorVerticallyEnabled() const
void setMirrorVertically(bool enable)

알림 신호:

void mirrorVerticallyChanged()

sampleCount : int

이 속성은 멀티샘플 앤티앨리어싱(MSAA)의 샘플 수를 제어합니다. 기본적으로 값은 1 이며, 이는 MSAA가 비활성화되었음을 의미합니다.

유효한 값은 1, 4, 8이며, 경우에 따라 16 및 32도 포함됩니다. QRhi::supportedSampleCounts()를 사용하여 런타임에 지원되는 샘플 수를 조회할 수 있지만, 일반적으로 애플리케이션은 1(MSAA 없음), 4x(일반 MSAA) 또는 8x(고해상도 MSAA)를 요청해야 합니다.

참고: 새 값을설정하면 , 그 시점부터 렌더러가 생성하는 모든 QRhiGraphicsPipeline 객체는 동일한 샘플 수를 사용해야 합니다. 다른 샘플 수로 생성된 기존 QRhiGraphicsPipeline 객체는 더 이상 사용해서는 안 됩니다. 값이 변경되면 모든 색상 및 깊이-스텐실 버퍼가 자동으로 파기되고 재 생성되며, ` initialize()`가 다시 호출됩니다. 그러나 ` isAutoRenderTargetEnabled()`가 ` false`로 설정된 경우, 깊이-스텐실 버퍼나 추가 색상 버퍼와 관련하여 이를 관리하는 것은 애플리케이션의 몫입니다.

샘플 수를 기본값인 1에서 더 큰 값으로 변경하면 colorTexture()이 nullptr 가 되고, msaaColorBuffer()은 유효한 객체를 반환하기 시작합니다. 다시 1(또는 0)으로 전환하면 그 반대의 결과가 나타납니다. 즉, 다음 initialize() 호출 시 msaaColorBuffer()는 nullptr 를 반환하는 반면, colorTexture()는 다시 유효해집니다. 또한, resolveTexture()는 샘플 수가 1보다 클 때(즉, MSAA가 사용 중일 때) 유효한(비멀티샘플) QRhiTexture 를 반환합니다.

액세스 함수:

int sampleCount() const
void setSampleCount(int samples)

알림 신호:

void sampleCountChanged()

QQuickRhiItemRenderer::msaaColorBuffer() 및 QQuickRhiItemRenderer::resolveTexture()도 참조하십시오 .

멤버 함수 문서

[explicit] QQuickRhiItem::QQuickRhiItem(QQuickItem *parent = nullptr)

지정된 ` parent`를 사용하여 새로운 `QQuickRhiItem`을 생성합니다.

[override virtual noexcept] QQuickRhiItem::~QQuickRhiItem()

소멸자.

[pure virtual protected] QQuickRhiItemRenderer *QQuickRhiItem::createRenderer()

QQuickRhiItemRenderer 의 하위 클래스인 새로운 인스턴스를 생성하여 반환하도록 이 함수를 재구현하십시오.

이 함수는 GUI 스레드가 차단된 상태에서 렌더링 스레드에서 호출됩니다.

[override virtual protected] bool QQuickRhiItem::event(QEvent *e)

QQuickItem::event(QEvent *ev)를 재구현합니다.

[override virtual protected] void QQuickRhiItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)

QQuickItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)를 재구현합니다.

[protected] bool QQuickRhiItem::isAutoRenderTargetEnabled() const

현재의 자동 깊이-스텐실 버퍼 및 렌더 타겟 관리 설정을 반환합니다.

기본적으로 이 값은 ` true`입니다.

setAutoRenderTarget()도 참조하십시오 .

[override virtual] bool QQuickRhiItem::isTextureProvider() const

QQuickItem::isTextureProvider() const를 재구현합니다.

[override virtual protected] void QQuickRhiItem::releaseResources()

QQuickItem::releaseResources()을 재구현합니다.

[protected] void QQuickRhiItem::setAutoRenderTarget(bool enabled)

해당 항목에 의해 뎁스-스텐실 QRhiRenderBuffer 과 QRhiTextureRenderTarget 가 자동으로 생성 및 유지 관리되는지 여부를 제어합니다. 기본값은 ` true`입니다. 이 기능을 비활성화하려면, 예를 들어 파생 클래스의 생성자에서 이 함수를 조기에 호출하고 ` enabled `을 ` false `로 설정하십시오.

자동 모드에서는 깊이-스텐실 버퍼의 크기와 샘플 수가 컬러 버퍼 텍스처의 설정을 따릅니다. 비자동 모드에서는 renderTarget() 및 depthStencilBuffer()가 항상 nullptr 를 반환하며, 이 경우 해당 객체의 설정 및 관리는 애플리케이션의 initialize() 구현에서 처리해야 합니다.

[override virtual] QSGTextureProvider *QQuickRhiItem::textureProvider() const

QQuickItem::textureProvider() const를 재구현합니다.

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