QSGMaterial Class
QSGMaterial 클래스는 셰이더 프로그램의 렌더링 상태를 캡슐화합니다. 더 보기...
Header: | #include <QSGMaterial> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
에 의해 상속되었습니다: | QSGFlatColorMaterial, QSGOpaqueTextureMaterial, 그리고 QSGVertexColorMaterial |
- 상속된 멤버를 포함한 모든 멤버 목록
- QSGMaterial은 Qt Quick 씬 그래프 머티리얼 클래스의 일부입니다.
퍼블릭 유형
enum | Flag { Blending, RequiresDeterminant, RequiresFullMatrixExceptTranslate, RequiresFullMatrix, NoBatching, CustomCompileStep } |
flags | Flags |
퍼블릭 함수
virtual int | compare(const QSGMaterial *other) const |
virtual QSGMaterialShader * | createShader(QSGRendererInterface::RenderMode renderMode) const = 0 |
QSGMaterial::Flags | flags() const |
void | setFlag(QSGMaterial::Flags flags, bool on = true) |
virtual QSGMaterialType * | type() const = 0 |
(since 6.8) int | viewCount() const |
상세 설명
QSGMaterial과 QSGMaterialShader 서브클래스는 긴밀한 관계를 형성합니다. 하나의 씬 그래프(중첩된 그래프 포함)에는 지오메트리의 평면 컬러링 셰이더와 같이 씬 그래프가 해당 머티리얼을 렌더링하는 데 사용하는 셰이더를 캡슐화하는 고유한 QSGMaterialShader 인스턴스가 하나씩 있습니다. 각 QSGGeometryNode 에는 지오메트리 렌더링에 사용되는 실제 색상과 같이 해당 노드를 그릴 때 셰이더를 구성하는 방법이 포함된 고유한 QSGMaterial이 있을 수 있습니다.
QSGMaterial에는 구현해야 하는 두 개의 가상 함수가 있습니다. type () 함수는 특정 서브클래스의 모든 인스턴스에 대해 고유한 인스턴스를 반환해야 합니다. createShader () 함수는 QSGMaterial의 해당 서브클래스에 특정한 QSGMaterialShader 의 새 인스턴스를 반환해야 합니다.
최소한의 QSGMaterial 구현은 다음과 같습니다:
class Material : public QSGMaterial { public: QSGMaterialType *type() const override { static QSGMaterialType type; return &type; } QSGMaterialShader *createShader(QSGRendererInterface::RenderMode) const override { return new Shader; } };
QSGGeometryNode 및 커스텀 머티리얼로 뒷받침되는 QQuickItem 서브클래스 구현에 대한 소개는 커스텀 머티리얼 예제를 참조하세요.
참고: createShader()는 셰이더 준비와 관련된 중복 작업을 줄이기 위해 QSGMaterialType 당 한 번만 호출됩니다. QSGMaterial이 여러 버텍스 및 조각 셰이더 조합 세트로 지원되는 경우 type()의 구현은 각 셰이더 조합에 대해 서로 다른 고유한 QSGMaterialType 포인터를 반환해야 합니다.
참고: 접두사가 QSG인 모든 클래스는 씬 그래프의 렌더링 스레드에서만 사용해야 합니다. 자세한 내용은 씬 그래프 및 렌더링을 참조하십시오.
또한 QSGMaterialShader, 씬 그래프 - 커스텀 머티리얼, 씬 그래프 - 두 텍스처 제공자 및 씬 그래프 - 그래프를 참조하십시오.
멤버 유형 문서
열거형 QSGMaterial::플래그
플래그 QSGMaterial::플래그
Constant | 값 | 설명 |
---|---|---|
QSGMaterial::Blending | 0x0001 | 머티리얼이 렌더링 도중 블렌딩을 활성화해야 하는 경우 이 플래그를 true로 설정합니다. |
QSGMaterial::RequiresDeterminant | 0x0002 | 머티리얼이 렌더링을 위해 지오메트리 노드 행렬의 행렬식에 의존하는 경우 이 플래그를 true로 설정합니다. |
QSGMaterial::RequiresFullMatrixExceptTranslate | 0x0004 | RequiresDeterminant | 머티리얼이 번역 부분을 제외한 지오메트리 노드의 전체 행렬을 렌더링에 사용하려면 이 플래그를 true로 설정합니다. |
QSGMaterial::RequiresFullMatrix | 0x0008 | RequiresFullMatrixExceptTranslate | 머티리얼이 렌더링에 지오메트리 노드의 전체 행렬을 사용하려면 이 플래그를 true로 설정합니다. |
QSGMaterial::NoBatching | 0x0010 | 머티리얼이 씬 그래프의 배치 메커니즘과 호환되지 않는 셰이더를 사용하는 경우 이 플래그를 true로 설정합니다. 이는 버텍스 셰이더에서 gl_Position.z 을 직접 조작하는 것과 같은 특정 고급 사용법과 관련이 있습니다. 이러한 솔루션은 특정 씬 구조에 묶여 있는 경우가 많으므로 씬의 임의적인 콘텐츠에 사용하기에는 안전하지 않을 수 있습니다. 따라서 이 플래그는 적절한 조사를 거친 후에만 설정해야 하며, 대부분의 머티리얼에는 필요하지 않습니다. 이 플래그를 설정하면 더 많은 드로우 호출을 실행해야 하므로 성능이 저하될 수 있습니다. 이 플래그는 Qt 6.3에 도입되었습니다. |
QSGMaterial::CustomCompileStep | NoBatching | Qt 6에서 이 플래그는 NoBatching과 동일합니다. 대신 NoBatching을 사용하는 것을 권장합니다. |
Flags 유형은 QFlags<Flag>에 대한 typedef입니다. 플래그 값의 OR 조합을 저장합니다.
멤버 함수 문서
[virtual]
int QSGMaterial::compare(const QSGMaterial *other) const
이 머티리얼을 other 과 비교하여 같으면 0을 반환하고, other 보다 먼저 정렬해야 하는 경우 -1, other 보다 먼저 정렬해야 하는 경우 1을 반환합니다.
씬 그래프는 지오메트리 노드를 재정렬하여 상태 변화를 최소화할 수 있습니다. 비교 함수는 정렬 프로세스 중에 호출되어 QSGMaterialShader::updateState()를 호출할 때마다 상태 변경을 최소화하도록 머티리얼을 정렬할 수 있습니다.
이 포인터와 other 는 동일한 type()를 갖도록 보장됩니다.
[pure virtual]
QSGMaterialShader *QSGMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const
이 함수는 QSGMaterial 의 특정 구현에 대한 지오메트리를 렌더링하는 데 사용되는 QSGMaterialShader 구현의 새 인스턴스를 반환합니다.
이 함수는 머티리얼 유형과 renderMode 의 각 조합에 대해 한 번만 호출되며 내부적으로 캐시됩니다.
대부분의 머티리얼의 경우 renderMode 은 무시할 수 있습니다. 일부 머티리얼은 특정 렌더링 모드에 대한 커스텀 처리가 필요할 수 있습니다. 예를 들어 머티리얼이 RenderMode3D를 사용할 때 원근 변환을 고려해야 하는 방식으로 앤티앨리어싱을 구현하는 경우입니다.
QSGMaterial::Flags QSGMaterial::flags() const
머티리얼의 플래그를 반환합니다.
void QSGMaterial::setFlag(QSGMaterial::Flags flags, bool on = true)
on 이 참이면 이 자료에 flags 플래그를 설정하고, 그렇지 않으면 속성을 지웁니다.
[pure virtual]
QSGMaterialType *QSGMaterial::type() const
이 함수는 씬 그래프에서 createShader()로 인스턴스화된 QSGMaterialShader 에 고유한 식별자를 쿼리하기 위해 호출됩니다.
많은 머티리얼의 경우 일반적인 접근 방식은 정적이고 전역적으로 사용 가능한 QSGMaterialType 인스턴스에 대한 포인터를 반환하는 것입니다. QSGMaterialType 은 불투명한 객체입니다. 그 목적은 고유한 머티리얼 식별자를 생성하는 유형 안전하며 간단한 방법으로만 사용됩니다.
QSGMaterialType *type() const override { static QSGMaterialType type; return &type; }
[since 6.8]
int QSGMaterial::viewCount() const
멀티뷰 렌더링에 사용되는 머티리얼의 경우 뷰 수를 반환합니다.
참고: 반환 값은 createShader()에서 호출한 이후에만 유효합니다. 씬 그래프에서 createShader()를 호출하기 전의 값은 반드시 최신일 필요는 없습니다.
일반적으로 반환 값은 1
입니다. 뷰 수가 2보다 크면 멀티뷰 렌더 패스를 의미합니다. 멀티뷰를 지원하는 머티리얼은 createShader() 또는 QSGMaterialShader 생성자에서 viewCount()를 쿼리하여 적절한 셰이더가 선택되었는지 확인해야 합니다. 그런 다음 버텍스 셰이더는 멀티뷰 모드에서 여러 행렬이 있으므로 gl_ViewIndex
을 사용하여 모델뷰-투영 행렬 배열의 인덱싱을 수행해야 합니다. (각 뷰마다 하나씩)
예를 들어 다음의 간단한 버텍스 셰이더를 살펴보겠습니다:
#version 440 layout(location = 0) in vec4 vertexCoord; layout(location = 1) in vec4 vertexColor; layout(location = 0) out vec4 color; layout(std140, binding = 0) uniform buf { mat4 matrix[2]; float opacity; }; void main() { gl_Position = matrix[gl_ViewIndex] * vertexCoord; color = vertexColor * opacity; }
이 셰이더는 2개의 뷰, 2개의 뷰만 처리하도록 준비되어 있습니다. 다른 뷰 수와 호환되지 않습니다. 셰이더를 컨디셔닝할 때 qsb
도구를 --view-count 2
으로 호출하거나 CMake 통합을 사용하는 경우 VIEW_COUNT 2
을 qt_add_shaders()
명령에 지정해야 합니다.
참고: 뷰 수가 2 이상으로 설정될 때마다 #extension GL_EXT_multiview : require
줄이 qsb
에 의해 자동으로 삽입됩니다.
개발자는 자동으로 주입되는 전처리 변수 QSHADER_VIEW_COUNT
를 사용하여 다양한 조회 수를 간단하게 처리하는 것이 좋습니다. 예를 들어 동일한 소스 파일에서 뷰 수가 2인 비멀티뷰와 멀티뷰를 모두 지원해야 하는 경우 다음과 같이 할 수 있습니다:
#version 440 layout(location = 0) in vec4 vertexCoord; layout(location = 1) in vec4 vertexColor; layout(location = 0) out vec4 color; layout(std140, binding = 0) uniform buf { #if QSHADER_VIEW_COUNT >= 2 mat4 matrix[QSHADER_VIEW_COUNT]; #else mat4 matrix; #endif float opacity; }; void main() { #if QSHADER_VIEW_COUNT >= 2 gl_Position = matrix[gl_ViewIndex] * vertexCoord; #else gl_Position = matrix * vertexCoord; #endif color = vertexColor * opacity; }
이제 동일한 소스 파일을 qsb
또는 qt_add_shaders()
을 통해 조회 수를 지정하지 않고 한 번, 조회 수를 2로 설정하여 한 번 두 번 실행할 수 있습니다. 그러면 자료는 런타임에 viewCount()에 따라 적절한 .qsb 파일을 선택할 수 있습니다.
CMake를 사용하면 다음과 비슷하게 보일 수 있습니다. 이 예제에서 해당 QSGMaterialShader 은 viewCount() 값에 따라 :/shaders/example.vert.qsb
과 :/shaders/multiview/example.vert.qsb
중 하나를 선택해야 합니다. (프래그먼트 셰이더도 마찬가지입니다.)
qt_add_shaders(application "application_shaders" PREFIX / FILES shaders/example.vert shaders/example.frag ) qt_add_shaders(application "application_multiview_shaders" GLSL 330,300es HLSL 61 MSL 12 VIEW_COUNT 2 PREFIX / FILES shaders/example.vert shaders/example.frag OUTPUTS shaders/multiview/example.vert shaders/multiview/example.frag )
참고: 이식성을 극대화하기 위해 조각 셰이더 코드에 뷰 수(gl_ViewIndex
)에 대한 종속성을 가질 수 없지만 조각 셰이더는 버텍스 셰이더와 동일한 방식으로 처리해야 합니다. 멀티뷰 세트에 프래그먼트 셰이더도 포함시키는 데에는 두 가지 이유가 있습니다. 하나는 동일한 그래픽 파이프라인 내에서 서로 다른 셰이더 버전을 혼합하면 기본 그래픽 API에 따라 문제가 될 수 있기 때문입니다. 예를 들어 D3D12에서 셰이더 모델 5.0과 6.1용 HLSL 셰이더를 혼합하면 오류가 발생할 수 있습니다. 다른 하나는 조각 셰이더에 QSHADER_VIEW_COUNT
을 정의하면 버텍스와 조각 스테이지 간에 균일한 버퍼 레이아웃을 공유할 때 매우 유용할 수 있다는 것입니다.
참고: OpenGL의 경우 gl_ViewIndex
에 의존하는 버텍스 셰이더의 최소 GLSL 버전은 330
입니다. 이보다 낮은 버전은 빌드 시에는 허용될 수 있지만 OpenGL 구현에 따라 런타임에 오류가 발생할 수 있습니다.
편의를 위해 qt_add_shaders()에 대한 MULTIVIEW
옵션도 있습니다. 먼저 qsb
도구를 정상적으로 실행한 다음 VIEW_COUNT
을 2
으로 재정의하고 GLSL
, HLSL
, MSL
을 적절한 기본값으로 설정한 다음 qsb
을 다시 실행하여 이번에는 접미사를 추가한 .qsb 파일을 출력합니다. 그런 다음 머티리얼 구현은 viewCount
인수를 받는 QSGMaterialShader::setShaderFileName() 오버로드를 사용하여 올바른 .qsb 파일을 자동으로 선택할 수 있습니다.
따라서 다음은 수동으로 관리되는 출력 파일을 지정할 필요가 없다는 점을 제외하면 위의 예제 호출과 거의 동일합니다. 자동으로 선택된 셰이딩 언어 버전이 충분하지 않은 경우가 있을 수 있으며, 이 경우 애플리케이션에서 모든 것을 명시적으로 계속 지정해야 합니다.
qt_add_shaders(application "application_multiview_shaders" MULTIVIEW PREFIX / FILES shaders/example.vert shaders/example.frag )
Qt XML의 멀티뷰 지원에 대한 더 낮은 수준의 자세한 내용은 QRhi::MultiView, QRhiColorAttachment::setMultiViewCount() 및 QRhiGraphicsPipeline::setMultiViewCount()를 참조하십시오. Qt Quick 씬 그래프 렌더러는 QQuickRenderTarget::fromRhiRenderTarget() 또는 arraySize
인수가 1보다 큰 fromVulkanImage()와 같은 3D API 전용 함수를 통해 지정하면 멀티뷰 렌더링 대상을 인식하도록 준비됩니다. 그러면 렌더러는 그래픽 파이프라인과 머티리얼에 뷰 수를 전파합니다.
이 함수는 Qt 6.8에 도입되었습니다.
© 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.