Qt Quick 3D Architecture

Qt Quick 3DQt Quick 을 확장하여 3D 콘텐츠 렌더링을 지원합니다. 여기에는 몇 가지 새로운 공개 QML 임포트와 새로운 내부 씬 그래프 및 렌더러를 포함한 광범위한 기능이 추가되었습니다. 이 문서에서는 공개 API부터 렌더링 파이프라인의 작동 방식에 대한 세부 사항까지 Qt Quick 3D 의 아키텍처에 대해 설명합니다.

모듈 개요

Qt Quick 3D 는 추가 3D API를 노출하는 여러 모듈과 플러그인, 기존 3D 에셋의 컨디셔닝 및 임포트를 위한 유틸리티로 구성되어 있습니다.

QML 임포트

  • QtQuick3D - 다음의 모든 핵심 구성 요소를 포함하는 기본 임포트입니다. Qt Quick 3D
  • QtQuick3D.AssetUtils - 런타임에 3D 에셋을 임포트하기 위한 라이브러리
  • QtQuick3D.Helpers - 3D 디자인 및 3D 씬 디버깅에 사용할 수 있는 추가 컴포넌트 라이브러리.

C++ 라이브러리

  • QtQuick3D - 유일한 공개 C++ 모듈입니다. QtQuick3D QML 임포트에 노출되는 모든 유형의 정의와 몇 가지 C++ API가 포함되어 있습니다.
  • QtQuick3DAssetImport - 에셋 임포트를 지원하고 에셋을 QML로 변환하는 데 도움이 되는 내부 및 비공개 라이브러리.
  • QtQuick3DRuntimeRender - 공간 씬 그래프 노드와 렌더러가 포함된 내부 및 비공개 라이브러리.
  • QtQuick3DUtils - 다른 모든 C++ 모듈에서 공통 유틸리티 라이브러리로 사용되는 내부 및 비공개 라이브러리.

에셋 임포터 플러그인

에셋 임포트 툴링은 플러그인 기반 아키텍처를 사용하여 구현됩니다. Qt Quick 3D 와 함께 제공되는 플러그인은 에셋 임포터 라이브러리 및 도구인 Balsam의 기능을 확장합니다.

  • Assimp - 이 플러그인은 타사 라이브러리 libAssimp를 사용하여 3D 인터체인지 형식의 3D 에셋을 Qt Quick 3D QML 컴포넌트로 변환합니다.

Qt Quick 3D 은 Qt 그래픽스 스택에 어떻게 들어맞나요?

위의 다이어그램은 Qt Quick 3D 이 더 큰 Qt 그래픽 스택에 어떻게 들어맞는지 보여줍니다. Qt Quick 3D 은 2D Qt Quick API의 확장으로 작동하며, 3D 장면 항목을 View3D 과 함께 사용할 때 장면은 Qt 렌더링 하드웨어 인터페이스(RHI)를 통해 렌더링됩니다. RHI는 API 호출을 주어진 플랫폼에 맞는 올바른 네이티브 렌더링 하드웨어 API 호출로 변환합니다. 위의 다이어그램은 각 플랫폼에서 사용할 수 있는 옵션을 보여줍니다. 네이티브 백엔드가 명시적으로 정의되어 있지 않으면 Qt Quick 이 각 플랫폼의 렌더링에 적합한 네이티브 백엔드로 기본 설정됩니다.

Qt Quick 3D 스택의 구성 요소와 Qt Quick 스택 간의 통합은 다음 섹션에서 설명합니다.

2D에서 3D 통합

3D 콘텐츠를 2D로 표시하는 것이 Qt Quick 3D API의 주요 목적입니다. 3D 콘텐츠를 2D로 통합하기 위한 기본 인터페이스는 View3D 컴포넌트입니다.

View3D 컴포넌트는 콘텐츠가 있는 다른 QQuickItem 파생 클래스처럼 작동하며 가상 함수 QQuickItem::updatePaintNode 를 구현합니다. Qt Quick 는 동기화 단계에서 Qt Quick 시나리오 그래프의 모든 "더티" 항목에 대해 updatePaintNode를 호출합니다. 여기에는 View3D 에서 관리하는 3D 항목도 포함되며, 이 항목도 updatePaintNode 호출의 결과로 동기화 단계를 거칩니다.

View3D 의 updatePaintNode 메서드는 다음 작업을 수행합니다:

  • 렌더러와 렌더링 타겟이 없는 경우 렌더러와 렌더링 타겟을 설정합니다.
  • SceneManager를 통해 3D 씬의 항목을 동기화합니다.
  • Qt Quick ( 아래3D 텍스처 경로의 2D) 에서 렌더링한 "동적" 텍스처를 업데이트합니다.

그러나 3D 씬의 렌더링은 View3D updatePaintNode 메서드에서 발생하지 않습니다. 대신 updatePaintNode는 Qt Quick 3D 에 대한 렌더러가 포함된 QSGNode 서브클래스를 반환하며, Qt Quick 렌더링 프로세스의 전처리 단계에서 3D 장면을 렌더링합니다.

Qt Quick 3D 렌더링 방법에 대한 배관은 어떤 View3D::renderMode 을 사용하는지에 따라 달라집니다:

오프스크린

View3D 의 기본 모드는 Offscreen 입니다. 오프스크린 모드를 사용하는 경우 View3D 은 오프스크린 표면을 생성하고 렌더링하여 텍스처 공급자가 됩니다. 이 표면은 Qt Quick 에서 텍스처로 매핑되고 QSGSimpleTextureNode 로 렌더링될 수 있습니다.

이 패턴은 이미 Qt Quick 에서 QSGLayerNode가 작동하는 방식과 매우 유사합니다.

언더레이

Underlay 모드를 사용하면 3D 장면이 View3D 을 포함하는 QQuickWindow 에 직접 렌더링됩니다. 렌더링은 QQuickWindow::beforeRenderPassRecording() 신호의 결과로 발생하므로 Qt Quick 의 다른 모든 것이 3D 콘텐츠 위에 렌더링됩니다.

오버레이

Overlay 모드를 사용하는 경우 3D 장면은 View3D 을 포함하는 QQuickWindow 에 직접 렌더링됩니다. 렌더링은 QQuickWindow::afterRenderPassRecording() 신호의 결과로 발생하며, 이는 3D 콘텐츠가 다른 모든 Qt Quick 콘텐츠 위에 렌더링됨을 의미합니다.

인라인

Inline 렌더링 모드는 QSGRenderNode 을 사용하여 화면 외부 표면을 사용하지 않고 Qt Quick 의 렌더링 대상에 직접 렌더링할 수 있습니다. Qt Quick 씬의 2D 렌더링 중에 렌더링 명령을 인라인으로 삽입하여 이를 수행합니다.

이 모드는 Qt Quick 렌더러와 동일한 뎁스 버퍼를 사용하며 Qt QuickQt Quick 3D 에서 z 값이 완전히 다른 의미를 갖기 때문에 문제가 될 수 있습니다.

2D에서 3D 통합

3D 씬을 렌더링할 때 2D 요소를 3D에 포함해야 하는 시나리오가 많이 있습니다. 2D 콘텐츠를 3D 씬 내부에 통합하는 방법에는 두 가지가 있으며, 각 방법에는 화면에 도달하는 고유한 경로가 있습니다.

직접 경로

직접 경로는 2D Qt Quick 콘텐츠가 3D 씬에 평면 항목으로 존재하는 것처럼 렌더링하는 데 사용됩니다. 예를 들어 다음 장면 정의를 생각해 보겠습니다:

Node {
    Text {
        text: "Hello world!"
    }
}

여기서 일어나는 일은 자식 컴포넌트가 QQuickItem 유형의 공간 노드에 설정되면 먼저 2D 항목에 3D 좌표를 추가하는 컨테이너인 QQuick3DItem2D로 래핑됩니다. 이렇게 하면 모든 추가 2D 자식이 3D 장면에 올바르게 나타나도록 렌더링되는 방식에 대한 기본 3D 변환이 설정됩니다.

씬을 렌더링할 때가 되면 이러한 2D 항목의 QSGNode가 Qt Quick 렌더러로 전달되어 적절한 렌더링 명령을 생성합니다. 명령은 인라인으로 수행되고 현재 3D 변환을 고려하기 때문에 2D 렌더러에서와 똑같이 렌더링되지만 마치 3D로 렌더링된 것처럼 표시됩니다.

이 접근 방식의 단점은 Qt Quick 2D 렌더러에는 조명 개념이 없기 때문에 3D 씬의 조명 정보를 2D 콘텐츠의 음영 처리에 사용할 수 없다는 것입니다.

텍스처 경로

텍스처 경로는 2D Qt Quick 씬을 사용하여 동적 텍스처 콘텐츠를 만듭니다. 다음 텍스처 정의를 고려하십시오:

Texture {
    sourceItem: Item {
        width: 256
        height: 256
        Text {
            anchors.centerIn: parent
            text: "Hello World!"
        }
    }
}

이 접근 방식은 Qt Quick 에서 레이어 항목이 작동하는 것과 동일한 방식으로 모든 것이 최상위 항목 크기의 화면 밖 표면으로 렌더링되고, 화면 밖 표면은 다른 곳에서 재사용할 수 있는 텍스처로 사용할 수 있다는 점에서 동일하게 작동합니다.

그런 다음 이 텍스처를 씬의 머티리얼에서 사용하여 아이템의 Qt Quick 콘텐츠를 렌더링할 수 있습니다.

씬 동기화

씬 관리자

Qt Quick 3D 의 씬 매니저는 3D 씬에서 공간 아이템을 추적하고 동기화 단계에서 아이템이 해당 씬 그래프 노드를 업데이트하는지 확인하는 역할을 담당합니다. Qt Quick 에서 이 역할은 2D의 경우 QQuickWindow 에서 수행합니다. 씬 매니저는 프론트엔드 노드와 백엔드 씬 그래프 오브젝트 간의 기본 인터페이스입니다.

View3D 항목에는 하나 이상의 씬 매니저가 생성되고 구성 시 기본 제공 씬 루트에 연결되므로 하나 이상의 씬 매니저가 있습니다. 공간 노드가 View3D 의 자식으로 추가되면 View3D 의 씬 매니저에 등록됩니다. 임포트된 씬을 사용할 때는 View3D 의 직접 자식이 아닌 노드를 관리하기 위해 두 번째 SceneManager가 생성(또는 이미 존재하는 경우 참조)됩니다. 이는 View3D 과 달리 임포트된 씬이 참조될 때까지 QQuickWindow 에 존재하지 않기 때문에 필요합니다. 추가 SceneManager는 임포트된 씬에 속한 에셋이 참조되는 QQuickWindow 당 적어도 한 번은 생성되도록 합니다.

씬 매니저는 내부 API이지만, 업데이트() 메서드를 호출하여 더티로 표시된 모든 오브젝트에 대해 업데이트SpatialNode를 호출하는 것은 씬 매니저가 담당한다는 점을 알아두는 것이 중요합니다.

프론트엔드/백엔드 동기화

동기화의 목적은 프론트엔드(Qt Quick)에 설정된 상태가 백엔드(Qt Quick 공간 씬 그래프 렌더러)에 설정된 상태와 일치하도록 하는 것입니다. 기본적으로 프론트엔드와 백엔드는 별도의 스레드(프론트엔드는 Qt 메인 스레드에, 백엔드는 Qt Quick 의 렌더 스레드에)에서 실행됩니다. 동기화 단계는 메인 스레드와 렌더 스레드가 데이터를 안전하게 교환할 수 있는 곳입니다. 이 단계에서 씬 매니저는 씬의 각 더티 노드에 대해 updateSpatialNode를 호출합니다. 그러면 새 백엔드 노드가 생성되거나 렌더러에서 사용할 수 있도록 기존 노드가 업데이트됩니다.

Qt Quick 공간 씬 그래프

Qt Quick 3DQt Quick 와 동일한 프론트엔드/백엔드 분리 패턴을 사용하도록 설계되었습니다. 프론트엔드 객체는 Qt Quick 엔진에 의해 제어되는 반면, 백엔드 객체는 씬 렌더링을 위한 상태 데이터를 포함합니다. 프론트엔드 오브젝트는 QObject 에서 상속되며 Qt Quick 엔진에 노출됩니다. QML 소스 파일의 항목은 프론트엔드 오브젝트에 직접 매핑됩니다.

이러한 프론트엔드 오브젝트의 속성이 업데이트되면 하나 이상의 백엔드 노드가 생성되어 시나리오 그래프에 배치됩니다. 3D 장면 렌더링에는 2D 렌더링보다 훨씬 더 많은 상태가 포함되므로 3D 장면 오브젝트의 상태를 표현하기 위한 별도의 특수한 장면 그래프 노드 세트가 있습니다. 이 씬 그래프를 Qt Quick 공간 씬 그래프라고 합니다.

프론트엔드 오브젝트와 백엔드 노드는 모두 두 가지 클래스로 분류할 수 있습니다. 첫 번째는 3D 공간의 어딘가에 존재한다는 의미에서 공간적입니다. 이것이 실제로 의미하는 바는 이러한 각 유형이 변환 행렬을 포함한다는 것입니다. 공간 항목의 경우 각 자식 항목이 부모의 트랜스폼을 상속하기 때문에 부모 자식 관계가 중요합니다.

다른 유형의 항목은 리소스입니다. 리소스 항목은 3D 공간에서 위치를 가지지 않고 다른 항목이 사용하는 상태일 뿐입니다. 이러한 항목 간에는 부모-자식 관계가 있을 수 있지만 소유권 외에는 다른 의미가 없습니다.

Qt Quick 의 2D 씬 그래프와 달리 공간 씬 그래프는 리소스 노드를 사용자에게 직접 노출합니다. 예를 들어 Qt Quick 에서 QSGTexture 은 공개 API이지만 이 객체를 직접 노출하는 QQuickItem 은 없습니다. 대신 사용자는 텍스처의 출처와 렌더링 방법을 모두 설명하는 이미지 항목을 사용하거나 QSGTexture 자체에서 작동하는 C++ 코드를 작성해야 합니다. Qt Quick 3D 에서는 이러한 리소스가 QML API에 직접 노출됩니다. 이는 리소스가 씬 상태의 중요한 부분이기 때문에 필요합니다. 이러한 리소스는 씬의 많은 오브젝트에서 참조할 수 있습니다(예: 많은 머티리얼이 동일한 텍스처를 사용할 수 있습니다). 또한 런타임에 텍스처의 프로퍼티를 설정하여 텍스처 샘플링 방식을 직접 변경할 수도 있습니다(예: 텍스처의 샘플링 방식).

공간 오브젝트

모든 공간 오브젝트는 3D 공간에서의 위치, 회전, 스케일을 정의하는 프로퍼티를 포함하는 노드 컴포넌트의 서브클래스입니다.

리소스 오브젝트

리소스 객체는 Object3D 컴포넌트의 하위 클래스입니다. Object3D 은 장면 관리자와 함께 사용하기 위한 몇 가지 특수 헬퍼가 포함된 QObject 하위 클래스일 뿐입니다. 리소스 객체에는 부모/자식 연관성이 있지만 이는 주로 리소스 소유권에 유용합니다.

뷰3D 및 렌더링 레이어

프론트엔드/백엔드 분리와 관련하여, View3D 은 렌더링할 씬 콘텐츠를 정의하기 때문에 사용자 관점에서 볼 때 View3D 이 분리 지점입니다. Qt Quick 공간 씬 그래프에서 렌더링할 씬의 루트 노드는 레이어 노드입니다. 레이어 노드는 View3D 의 속성과 SceneEnvironment 의 속성을 조합하여 View3D 에 의해 생성됩니다. View3D 에 대한 장면을 렌더링할 때 렌더러에 전달되어 장면을 렌더링하는 것은 바로 이 레이어 노드입니다.

씬 렌더링

렌더 대상 설정

렌더링 프로세스의 첫 번째 단계는 씬 렌더링 타깃을 결정하고 설정하는 것입니다. SceneEnvironment 에 설정된 속성에 따라 실제 렌더링 타겟은 달라집니다. 첫 번째 결정은 콘텐츠가 창 표면에 직접 렌더링될지 아니면 화면 밖 텍스처에 렌더링될지 여부입니다. 기본적으로 View3D 은 오프스크린 텍스처로 렌더링됩니다. 포스트 프로세싱 효과를 사용하는 경우 오프스크린 텍스처로 렌더링하는 것은 필수입니다.

씬 렌더링 대상이 결정되면 몇 가지 전역 상태가 설정됩니다.

  • 창 크기 - 창에 렌더링하는 경우
  • 뷰포트 - 렌더링되는 장면 영역의 크기입니다.
  • 가위 직사각형 - 뷰포트가 클리핑될 창의 하위 집합
  • 지우기 색상 - 렌더링 대상을 지울 색상(있는 경우)입니다.

렌더링 준비

렌더링의 다음 단계는 렌더러가 주어진 프레임에 무엇이 렌더링되어야 하는지, 필요한 모든 리소스가 최신 상태인지 파악하기 위해 하우스 키핑을 수행하는 준비 단계입니다.

준비 단계는 렌더링할 내용과 필요한 리소스를 결정하는 높은 수준의 준비 단계와 RHI를 사용하여 실제로 렌더링 파이프라인과 버퍼를 설정하고 메인 장면 패스의 렌더링 종속성을 설정하는 낮은 수준의 준비 단계로 나뉩니다.

높은 수준의 렌더링 준비

이 단계의 목적은 공간 씬 그래프의 상태를 렌더링 명령을 생성하는 데 사용할 수 있는 형태로 추출하는 것입니다. 여기서 개요는 렌더러가 조명 상태 세트와 함께 단일 카메라의 관점에서 렌더링할 지오메트리 및 머티리얼 조합 목록을 생성한다는 것입니다.

가장 먼저 수행되는 작업은 모든 콘텐츠에 대한 전역 공통 상태를 결정하는 것입니다. SceneEnvironment 에서 lightProbe 을 정의하면 해당 라이트 프로브 텍스처와 연결된 환경 맵이 로드되었는지 확인하고, 로드되지 않은 경우 새 환경 맵을 로드하거나 생성합니다. 환경 생성은 그 자체로 소스 텍스처를 큐브 맵으로 컨볼브하는 일련의 패스가 됩니다. 이 큐브 맵에는 스페큘러 반사 정보뿐만 아니라 머티리얼 셰이딩에 사용되는 조도가 모두 포함됩니다.

다음으로 렌더러는 씬에서 어떤 카메라를 사용할지 결정해야 합니다. 활성 카메라가 View3D 에 의해 명시적으로 정의되지 않은 경우 씬에서 사용 가능한 첫 번째 카메라가 사용됩니다. 씬에 카메라가 없는 경우 콘텐츠가 렌더링되지 않고 렌더러가 중단됩니다.

카메라가 결정되면 이 프레임에 대한 투영 행렬을 계산할 수 있습니다. 이 시점에서 계산이 수행되는 이유는 각 렌더러블이 어떻게 투사될지 알아야 하기 때문입니다. 이는 또한 이제 어떤 렌더링 가능한 항목을 렌더링해야 하는지 계산할 수 있음을 의미합니다. 렌더링 가능한 모든 항목의 목록부터 시작하여 비활성화되었거나 완전히 투명하여 보이지 않는 항목을 모두 제거합니다. 그런 다음 활성 카메라에서 프러스텀 컬링이 활성화된 경우 각 렌더링 가능한 항목이 카메라의 프러스텀 시야에서 완전히 벗어났는지 확인하고, 벗어난 경우 렌더링 가능한 목록에서 제거합니다.

카메라 투영 외에도 카메라 방향도 계산되는데, 이는 셰이딩 코드의 조명 계산에 필요하기 때문입니다.

씬에 조명 노드가 있는 경우 사용 가능한 최대 조명 길이만큼 목록에 수집됩니다. 렌더러가 지원하는 광원의 양보다 더 많은 광원 노드가 씬에 존재하는 경우 해당 제한을 초과하는 추가 광원 노드는 무시되며 씬의 조명에 기여하지 않습니다. 라이트 노드의 범위를 지정할 수 있지만 범위를 설정하더라도 각 라이트의 조명 상태는 조명이 있는 모든 머티리얼에 전송되지만 범위에 없는 라이트의 경우 밝기가 0으로 설정되므로 실제로는 해당 라이트가 해당 머티리얼의 조명에 기여하지 않는다는 점에 유의하세요.

이제 렌더러블 목록이 짧아졌으므로 씬의 현재 상태를 반영하도록 각 항목을 업데이트해야 합니다. 각 렌더러블에 대해 적절한 머티리얼이 로드되었는지 확인하고 그렇지 않은 경우 새 머티리얼을 생성합니다. 머티리얼은 셰이더와 렌더링 파이프라인의 조합으로, 드로 콜을 생성하는 데 필요합니다. 또한 렌더러는 모델에 설정된 지오메트리 및 텍스처와 같이 렌더러블을 렌더링하는 데 필요한 모든 리소스가 로드되었는지 확인합니다. 아직 로드되지 않은 리소스는 여기에 로드됩니다.

그런 다음 렌더러블 목록은 세 가지 목록으로 정렬됩니다.

  • 불투명 항목: 앞에서 뒤로, 즉 카메라에 가장 가까운 항목부터 카메라에서 가장 먼 항목까지 정렬됩니다. 이는 하드웨어 오클루전 컬링 또는 프래그먼트 셰이더의 초기 z 감지를 활용하기 위해 수행됩니다.
  • 2D 아이템: Qt Quick 렌더러에 의해 렌더링되는 QtQuick 아이템입니다.
  • 투명 아이템: 뒤에서 앞으로, 즉 카메라에서 가장 먼 아이템부터 카메라에 가장 가까운 아이템까지 정렬됩니다. 이는 투명한 아이템은 뒤에 있는 모든 아이템과 블렌딩되어야 하기 때문입니다.

로우 레벨 렌더링 준비

이제 이 프레임에 대해 고려해야 할 모든 것이 결정되었으므로 메인 렌더 패스에 대한 배관 및 종속성을 해결할 수 있습니다. 이 단계에서 가장 먼저 하는 일은 메인 패스에 필요한 모든 프리 패스를 렌더링하는 것입니다.

  • 뎁스 패스 렌더링 - 스크린 스페이스 앰비언트 오클루전 및 섀도잉과 같은 특정 기능에는 뎁스 프리 패스가 필요합니다. 이 패스는 모든 불투명 항목을 뎁스 텍스처로 렌더링하는 것으로 구성됩니다.
  • 화면 공간 앰비언트 오클루전 패스 렌더 - 화면 공간 앰비언트 오클루전 패스의 목적은 앰비언트 오클루전 텍스처를 생성하는 것입니다. 이 텍스처는 나중에 머티리얼에서 셰이딩할 때 특정 영역을 어둡게 하는 데 사용됩니다.
  • 섀도 패스 렌더링 - 그림자가 활성화된 씬의 각 라이트는 추가 섀도 패스에 기여합니다. 렌더러가 사용하는 섀도잉 기법에는 두 가지가 있으므로 조명 유형에 따라 패스가 달라집니다. 디렉셔널 라이트에서 그림자를 렌더링할 때는 디렉셔널 라이트의 방향과 카메라 프러스텀의 크기를 조합하여 씬이 2D 오클루전 텍스처로 렌더링됩니다. 포인트 또는 스포트 라이트에서 그림자를 렌더링할 때 라이트의 오클루전 텍스처는 라이트의 각 면 방향에 대한 오클루전 기여도를 나타내는 큐브 맵입니다.
  • 스크린 텍스처 렌더링 - 이 패스는 굴절과 같은 렌더링 기술에 사용할 수 있는 스크린 텍스처가 필요한 CustomMaterial 을 사용할 때만 발생합니다. 이 패스는 뎁스 패스처럼 작동하지만 대신 모든 불투명 항목을 컬러 텍스처로 렌더링합니다.

종속성 렌더링이 완료되면 나머지 패스는 준비되지만 렌더링되지는 않습니다. 이 준비에는 하이 레벨 준비 단계에서 수집한 상태를 균일 버퍼 값 생성/업데이트, 샘플러와 의존성 텍스처 연결, 셰이더 리소스 바인딩 설정, 드로 콜 수행에 필요한 파이프라인 상태 생성에 관련된 기타 모든 그래픽 프리미티브에 변환하는 작업이 포함됩니다.

씬 렌더링

어려운 준비 작업이 완료되었으므로 이제 메인 씬의 콘텐츠에 기여하는 명령을 실행하는 것이 쉬운 부분입니다. 렌더링은 다음 순서로 진행됩니다:

  • 클리어 패스 - 이것은 실제로 패스는 아니지만 SceneEnvironment 에 설정된 배경 모드에 따라 다른 일이 발생할 수 있습니다. 배경 모드가 투명 또는 컬러인 경우 컬러 버퍼는 투명 또는 지정된 컬러로 지워집니다. 그러나 배경 모드가 스카이박스로 설정된 경우 카메라의 관점에서 스카이박스를 렌더링하는 패스가 실행되어 버퍼를 초기 데이터로 채웁니다.
  • 불투명 패스 - 다음으로 모든 불투명 항목이 그려집니다. 이 시점에서 이미 정렬되어 있으므로 파이프라인 상태를 설정하고 목록의 순서대로 각 항목에 대해 그리기 명령을 실행하기만 하면 됩니다.
  • 2D 패스 - 씬에 2D 항목이 있는 경우 Qt Quick 렌더러가 호출되어 해당 항목을 렌더링하는 데 필요한 렌더링 명령을 생성합니다.
  • 투명 패스 - 마지막으로 씬의 투명 항목이 불투명 항목과 동일한 방식으로 하나씩 렌더링됩니다.

이것으로 씬 렌더링이 완료됩니다.

포스트 프로세싱

포스트 프로세싱 기능이 활성화된 경우 씬 렌더러의 결과가 포스트 프로세싱 단계의 입력인 텍스처라고 가정할 수 있습니다. 모든 포스트 프로세싱 메서드는 이 씬 입력 텍스처에 대해 작동하는 추가 패스입니다.

포스트 프로세싱 단계의 모든 단계는 선택 사항이며, 기본 제공 기능 및 사용자 정의 효과가 활성화되지 않은 경우 씬 렌더링의 출력은 최종 렌더링 대상에서 사용되는 것입니다. 단, tonemapping 은 기본적으로 활성화되어 있습니다.

내장 포스트 프로세싱

ExtendedSceneEnvironment 와 그 상위 유형 SceneEnvironment 은 3D 장면에 사용되는 가장 일반적인 효과와 렌더러에서 생성된 하이 다이나믹 레인지 색상 값을 0-1 LDR 범위로 매핑하는 데 사용되는 톤 매핑을 제공합니다. 이 효과에는 피사계 심도, 글로우/블룸, 렌즈 플레어, 비네트, 색상 조정 및 그레이딩, 안개 및 앰비언트 오클루전이 포함됩니다.

포스트 프로세싱 효과

애플리케이션은 SceneEnvironment::effects 속성에서 사용자 지정 포스트 프로세싱 효과를 정렬된 목록으로 지정할 수 있습니다. 이 목록이 비어 있지 않으면 목록에 있는 효과가 ExtendedSceneEnvironment 에서 제공하는 기본 제공 효과보다 먼저 적용됩니다. 각 포스트 프로세싱 효과는 이전 효과의 출력이 다음 효과의 입력이 되는 체인의 일부입니다. 이 체인의 첫 번째 효과는 씬 렌더러 단계의 출력에서 직접 입력을 받습니다. 이펙트가 씬 렌더러의 뎁스 텍스처 출력에 액세스할 수도 있습니다.

이 프로세스의 각 효과는 여러 개의 서브 패스로 구성될 수 있으므로 콘텐츠를 중간 버퍼로 렌더링할 수 있습니다. 멀티 패스 효과의 최종 패스는 포스트 프로세싱 단계의 다음 단계에서 사용할 컬러 데이터를 포함하는 단일 텍스처를 출력할 것으로 예상됩니다.

템포럴 및 프로그레시브 앤티앨리어싱

템포럴 및 프로그레시브 안티앨리어싱 단계는 SceneEnvironment 에서 프로퍼티를 설정하여 선택적으로 활성화할 수 있습니다. 엄밀히 말해 포스트 프로세싱 단계의 일부는 아니지만 템포럴 및 프로그레시브 안티앨리어싱의 실제 결과는 포스트 프로세싱 단계에서 실현됩니다.

템포럴 앤티앨리어싱은 씬이 활발하게 업데이트될 때 수행됩니다. 활성화하면 활성 카메라가 장면을 그리는 동안 각 프레임에 대해 카메라 방향을 아주 미세하게 조정합니다. 그런 다음 현재 프레임과 이전에 렌더링된 프레임을 블렌딩하여 렌더링된 내용을 부드럽게 만듭니다.

프로그레시브 앤티앨리어싱은 씬이 업데이트되지 않을 때만 수행됩니다. 활성화하면 업데이트가 강제로 수행되고 장면의 현재 상태가 활성 카메라 방향에 따라 아주 미세하게 조정되어 렌더링됩니다. 최대 8개의 프레임이 누적되어 사전 정의된 가중치와 함께 블렌딩됩니다. 애니메이션이 없는 장면을 부드럽게 만드는 효과가 있지만 업데이트할 때마다 여러 프레임이 추가로 렌더링되기 때문에 성능 저하가 발생합니다.

슈퍼 샘플링 앤티앨리어싱(SSAA)

슈퍼 샘플링 앤티앨리어싱은 씬을 무차별적으로 부드럽게 처리하는 방법입니다. 요청된 씬 크기의 배수인 텍스처로 렌더링한 다음 목표 크기로 다운샘플링하는 방식으로 작동합니다. 예를 들어 2X SSAA가 요청되면 장면을 의도한 크기의 2배인 텍스처로 렌더링한 다음 이 단계의 일부로 다운샘플링합니다. 이는 성능과 리소스 사용량에 큰 영향을 미칠 수 있으므로 가능하면 피해야 합니다. 또한 이 방법에 필요한 텍스처가 렌더링 하드웨어에서 지원하는 것보다 클 수 있으므로 View3D 크기가 너무 커서 이 방법을 사용할 수 없을 수도 있습니다.

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