QSGMaterialShader Class

QSGMaterialShader 클래스는 그래픽 API 독립 셰이더 프로그램을 나타냅니다. 더 보기...

Header: #include <QSGMaterialShader>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick

퍼블릭 유형

struct GraphicsPipelineState
class RenderState
enum Flag { UpdatesGraphicsPipelineState }
flags Flags

공용 함수

QSGMaterialShader()
(since 6.4) int combinedImageSamplerCount(int binding) const
QSGMaterialShader::Flags flags() const
void setFlag(QSGMaterialShader::Flags flags, bool on = true)
void setFlags(QSGMaterialShader::Flags flags)
virtual bool updateGraphicsPipelineState(QSGMaterialShader::RenderState &state, QSGMaterialShader::GraphicsPipelineState *ps, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
virtual void updateSampledImage(QSGMaterialShader::RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)
virtual bool updateUniformData(QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)

보호 함수

void setShader(QSGMaterialShader::Stage stage, const QShader &shader)
void setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename)
(since 6.8) void setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename, int viewCount)

상세 설명

QSGMaterialShader는 버텍스 및 프래그먼트 셰이더, 그래픽 파이프라인 상태 변화를 정의하는 데이터, 유니폼 버퍼 및 텍스처와 같은 그래픽 리소스를 업데이트하는 로직의 조합을 나타냅니다.

참고: 접두사가 QSG인 모든 클래스는 씬 그래프의 렌더링 스레드에서만 사용해야 합니다. 자세한 내용은 씬 그래프 및 렌더링을 참조하십시오.

QSGMaterial 와 QSGMaterialShader는 긴밀한 관계를 형성합니다. 하나의 씬 그래프(중첩된 그래프 포함)에는 씬 그래프가 해당 머티리얼로 오브젝트를 렌더링하는 데 사용하는 셰이더 및 기타 데이터를 캡슐화하는 고유한 QSGMaterialShader 인스턴스가 하나 있습니다. 각 QSGGeometryNode 에는 노드를 그리는 동안 그래픽스 파이프라인을 구성하는 방법을 정의하는 고유한 QSGMaterial 이 있을 수 있습니다. QSGMaterialShader의 인스턴스는 사용자가 명시적으로 생성하지 않으며, 씬 그래프가 QSGMaterial::createShader()를 통해 필요에 따라 생성합니다. 씬 그래프는 QSGMaterial::createShader() 메서드를 호출하여 각 셰이더 구현의 인스턴스가 하나만 있는지 확인하여 QSGMaterialShader의 인스턴스를 생성합니다.

Qt 5에서는 QSGMaterialShader가 OpenGL에 연결되었습니다. QOpenGLShaderProgram 에서 직접 빌드되었으며 updateState() 과 같은 함수를 통해 임의의 OpenGL 명령을 실행할 수 있었습니다. Qt 6에서는 더 이상 그렇지 않습니다. QSGMaterialShader는 데이터 지향적이지 않으므로 데이터(셰이더 및 원하는 파이프라인 상태 변경)를 균일한 버퍼에서 데이터를 업데이트하는 로직과 함께 제공합니다. 그래픽 API 액세스는 제공되지 않습니다. 즉, QSGMaterialShader는 자체적으로 OpenGL, Vulkan, Metal 또는 Direct 3D 호출을 수행할 수 없습니다. 통합 셰이더 관리와 함께 QSGMaterialShader를 한 번만 작성하면 런타임에 지원되는 모든 그래픽 API에서 작동할 수 있습니다.

보호된 setShaderFileName() 함수를 호출하여 설정한 셰이더는 지오메트리의 버텍스 데이터로 머티리얼이 수행하는 작업과 조각의 셰이딩 방식을 제어합니다. QSGMaterialShader는 일반적으로 구성 중에 버텍스와 프래그먼트 셰이더를 설정합니다. 나중에 셰이더를 변경하면 원하는 효과를 얻지 못할 수 있으므로 피해야 합니다.

Qt 6의 기본 접근 방식은 일반적으로 리소스 시스템을 통해 임베드되고 setShaderFileName() 호출 시 참조되는 .qsb 파일을 애플리케이션과 함께 전송하는 것입니다. .qsb 파일은 오프라인으로, 또는 늦어도 애플리케이션 빌드 시점에 Qt Shader Tools 모듈의 qsb 도구를 사용하여 Vulkan 스타일 GLSL 소스 코드에서 생성됩니다.

재정의할 수 있는 가상은 세 가지가 있습니다. 이들은 균일한 버퍼, 텍스처 및 파이프라인 상태 변경을 위한 데이터 또는 데이터를 생성하는 로직을 제공합니다.

updateUniformData()는 서브클래스에서 가장 일반적으로 재구현되는 함수입니다. 이 함수는 셰이더에 균일 버퍼로 노출될 QByteArray 의 내용을 업데이트할 것으로 예상됩니다. 버텍스 또는 프래그먼트 셰이더에 균일 블록이 있는 모든 QSGMaterialShader는 updateUniformData()를 다시 구현해야 합니다.

updateSampledImage()는 셰이더 코드가 텍스처를 샘플링할 때 관련이 있습니다. 이 함수는 각 샘플러(또는 관련 API의 경우 결합된 이미지 샘플러)에 대해 호출되어 셰이더에 노출할 QSGTexture 을 지정할 수 있는 옵션을 제공합니다.

셰이더 파이프라인 상태 변경은 덜 자주 사용됩니다. 한 가지 사용 사례는 특정 블렌드 모드를 사용하고자 하는 머티리얼입니다. 관련 함수는 updateGraphicsPipelineState()입니다. 이 함수는 QSGMaterialShader가 UpdatesGraphicsPipelineState 플래그를 설정하여 옵트인하지 않으면 호출되지 않습니다. 이 함수의 작업은 전달된 GraphicsPipelineState 구조체 인스턴스를 원하는 변경 사항으로 업데이트하는 것입니다. 현재 블렌딩 및 컬링 관련 기능만 사용할 수 있으며, 다른 상태는 머티리얼로 제어할 수 없습니다.

텍스처 지원도 포함된 최소한의 예시는 다음과 같습니다. 여기서는 머티리얼이 createShader()에 셰이더 인스턴스를 생성하는 QSGMaterial 이며, 조각 셰이더에서 샘플링하려는 QSGTexture 을 보유하고 있다고 가정합니다. 버텍스 셰이더는 모델뷰 투영 매트릭스에만 의존합니다.

class Shader : public QSGMaterialShader
{
public:
    Shader()
    {
        setShaderFileName(VertexStage, QLatin1String(":/materialshader.vert.qsb"));
        setShaderFileName(FragmentStage, QLatin1String(":/materialshader.frag.qsb"));
    }

    bool updateUniformData(RenderState &state, QSGMaterial *, QSGMaterial *)
    {
        bool changed = false;
        QByteArray *buf = state.uniformData();
        if (state.isMatrixDirty()) {
            const QMatrix4x4 m = state.combinedMatrix();
            memcpy(buf->data(), m.constData(), 64);
            changed = true;
        }
        return changed;
    }

    void updateSampledImage(RenderState &, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *)
    {
        Material *mat = static_cast<Material *>(newMaterial);
        if (binding == 1)
            *texture = mat->texture();
    }
};

셰이더에 대한 벌칸 스타일의 GLSL 소스 코드는 다음과 같습니다. 이는 qsb 툴을 사용하여 오프라인에서 사전 처리되어야 하며, 이 툴은 Shader() 생성자에서 참조되는 .qsb 파일을 생성합니다.

#version 440
layout(location = 0) in vec4 aVertex;
layout(location = 1) in vec2 aTexCoord;
layout(location = 0) out vec2 vTexCoord;
layout(std140, binding = 0) uniform buf {
    mat4 qt_Matrix;
} ubuf;
out gl_PerVertex { vec4 gl_Position; };
void main() {
    gl_Position = ubuf.qt_Matrix * aVertex;
    vTexCoord = aTexCoord;
}
#version 440
layout(location = 0) in vec2 vTexCoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 1) uniform sampler2D srcTex;
void main() {
    vec4 c = texture(srcTex, vTexCoord);
    fragColor = vec4(c.rgb * 0.5, 1.0);
}

참고: 접두사가 QSG인 모든 클래스는 씬 그래프의 렌더링 스레드에서만 사용해야 합니다. 자세한 내용은 씬 그래프 및 렌더링을 참조하십시오.

또한 QSGMaterial, 씬 그래프 - 커스텀 머티리얼, 씬 그래프 - 두 텍스처 공급자씬 그래프 - 그래프를 참조하십시오.

멤버 유형 문서

열거형 QSGMaterialShader::플래그
플래그 QSGMaterialShader::플래그

특수 머티리얼 프로퍼티를 나타내는 플래그 값입니다.

Constant설명
QSGMaterialShader::UpdatesGraphicsPipelineState0x0001이 플래그를 설정하면 updateGraphicsPipelineState() 호출이 활성화됩니다.

Flags 유형은 QFlags<Flag>에 대한 typedef입니다. 플래그 값의 OR 조합을 저장합니다.

멤버 함수 문서

QSGMaterialShader::QSGMaterialShader()

새로운 QSGMaterialShader 를 생성합니다.

[since 6.4] int QSGMaterialShader::combinedImageSamplerCount(int binding) const

결합된 이미지 샘플러 변수의 요소 수를 binding 에서 반환합니다. 이 값은 셰이더 코드에서 인트로스펙티브됩니다. 변수는 배열일 수 있으며 둘 이상의 차원을 가질 수 있습니다.

카운트는 변수에 결합된 이미지 샘플러 항목의 총 개수를 반영합니다. 다음 예제에서 srcA 의 개수는 1, srcB 은 4, srcC 은 6입니다.

layout (binding = 0) uniform sampler2D srcA;
layout (binding = 1) uniform sampler2D srcB[4];
layout (binding = 2) uniform sampler2D srcC[2][3];

이 카운트는 QSGMaterialShader::updateSampledImage 의 텍스처 파라미터에 있는 QSGTexture 포인터의 수입니다.

이 함수는 Qt 6.4에 도입되었습니다.

QSGMaterialShader::updateSampledImage도 참조하십시오 .

QSGMaterialShader::Flags QSGMaterialShader::flags() const

이 머티리얼 셰이더에 현재 설정된 플래그를 반환합니다.

setFlags()도 참조하십시오 .

void QSGMaterialShader::setFlag(QSGMaterialShader::Flags flags, bool on = true)

on 이 참이면 이 머티리얼 셰이더에 flags 을 설정하고, 그렇지 않으면 지정된 플래그를 지웁니다.

void QSGMaterialShader::setFlags(QSGMaterialShader::Flags flags)

이 머티리얼 셰이더에 flags 을 설정합니다.

flags()도 참조하십시오 .

[protected] void QSGMaterialShader::setShader(QSGMaterialShader::Stage stage, const QShader &shader)

지정된 stage 에 대해 shader 을 설정합니다.

[protected] void QSGMaterialShader::setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename)

지정된 stage 에 대한 셰이더의 filename 를 설정합니다.

파일은 직렬화된 QShader 을 포함할 것으로 예상됩니다.

[protected, since 6.8] void QSGMaterialShader::setShaderFileName(QSGMaterialShader::Stage stage, const QString &filename, int viewCount)

지정된 stage 에 대한 셰이더의 filename 를 설정합니다.

파일은 직렬화된 QShader 을 포함할 것으로 예상됩니다.

이 오버로드는 multiview 렌더링을 활성화할 때, 특히 빌드 시스템의 멀티뷰 편의 옵션을 사용할 때 사용됩니다.

viewCount 는 2, 3 또는 4여야 합니다. filename 은 이에 따라 자동으로 조정됩니다.

이 기능은 Qt 6.8에 도입되었습니다.

[virtual] bool QSGMaterialShader::updateGraphicsPipelineState(QSGMaterialShader::RenderState &state, QSGMaterialShader::GraphicsPipelineState *ps, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)

이 함수는 씬 그래프에서 호출되어 머티리얼이 사용자 지정 그래픽 상태 세트를 제공할 수 있도록 합니다. 머티리얼별로 사용자 지정할 수 있는 상태 세트는 블렌딩 및 관련 설정으로 제한됩니다.

참고: 이 함수는 setFlags()를 통해 UpdatesGraphicsPipelineState 플래그가 활성화된 경우에만 호출됩니다. 기본적으로 이 플래그는 설정되어 있지 않으므로 이 함수는 호출되지 않습니다.

반환 값은 ps 의 멤버가 변경될 때마다 true 여야 합니다.

참고: ps 의 내용은 이 함수의 호출 간에 지속적이지 않습니다.

현재 렌더링 state 은 씬 그래프에서 전달됩니다.

서브클래스별 상태는 newMaterial 에서 추출할 수 있습니다. oldMaterial 이 null인 경우 이 셰이더는 방금 활성화된 것입니다.

[virtual] void QSGMaterialShader::updateSampledImage(QSGMaterialShader::RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)

이 함수는 셰이더에서 샘플링된 이미지를 사용할 준비를 하기 위해 씬 그래프에서 호출되며, 일반적으로 이미지 샘플러를 결합하는 형태로 사용됩니다.

binding 는 샘플러의 바인딩 번호입니다. 이 함수는 셰이더 코드에서 결합된 이미지 샘플러 변수 각각에 대해 QSGMaterialShader.

textureQSGTexture 포인터의 배열입니다. 배열의 요소 수는 셰이더 코드에 지정된 이미지 샘플러 변수의 요소 수와 일치합니다. 이 변수는 배열일 수 있으며 둘 이상의 차원을 가질 수 있습니다. 배열의 요소 수는 다음을 통해 확인할 수 있습니다. QSGMaterialShader::combinedImageSamplerCount

texture 의 요소가 null인 경우 반환하기 전에 유효한 QSGTexture 포인터로 설정해야 합니다. null이 아닌 경우, 새로운 QSGTexture * 을 저장할지 아니면 이미 알려진 QSGTexture 의 일부 매개변수를 업데이트할지는 머티리얼에 따라 결정됩니다. QSGTexture 의 소유권은 이전되지 않습니다.

현재 렌더링 state 은 씬 그래프에서 전달됩니다. 해당되는 경우 QSGTexture::commitTextureOperations()를 통해 텍스처 데이터 업로드 대기열을 트리거하는 것은 머티리얼에 달려 있습니다.

서브클래스별 상태는 newMaterial 에서 추출할 수 있습니다.

oldMaterial 를 사용하여 변경 사항을 최소화할 수 있습니다. oldMaterial 가 null이면 이 셰이더가 방금 활성화된 것입니다.

QSGMaterialShader::combinedImageSamplerCount참조하세요 .

[virtual] bool QSGMaterialShader::updateUniformData(QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial)

이 함수는 셰이더 프로그램의 균일 버퍼의 내용을 업데이트하기 위해 씬 그래프에서 호출됩니다. 이 구현은 실제 그래픽 연산을 수행하지 않고 RenderState::uniformData()에서 반환된 QByteArray 에 데이터를 복사하는 역할만 수행합니다. 씬 그래프는 셰이더에서 해당 버퍼를 표시하는 작업을 처리합니다.

현재 렌더링 state 은 씬 그래프에서 전달됩니다. 상태가 관련 상태가 더티임을 나타내는 경우, 구현은 RenderState::uniformData()를 통해 액세스할 수 있는 버퍼 데이터의 적절한 영역을 업데이트해야 합니다. 매트릭스나 불투명도와 같은 상태가 더럽지 않은 경우 데이터가 영구적이므로 해당 영역을 건드릴 필요가 없습니다.

유니폼 데이터가 변경될 때마다 반환 값은 true 이어야 합니다.

단색 머티리얼의 색상과 같은 서브클래스별 상태는 newMaterial 에서 추출하여 버퍼의 관련 영역을 적절히 업데이트해야 합니다.

oldMaterial 는 머티리얼 상태를 업데이트할 때 버퍼 변경(일반적으로 memcpy 호출)을 최소화하는 데 사용할 수 있습니다. oldMaterial 가 null이면 이 셰이더가 방금 활성화된 것입니다.

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