인스턴스 렌더링
소개
Qt Quick 3D 는 Model 객체의 인스턴싱을 지원합니다. 인스턴싱은 한 번의 드로우 호출로 하나의 오브젝트를 여러 번 렌더링하는 기술을 말합니다. (예: OpenGL 함수 glDrawElementsInstanced
.)
인스턴싱을 사용하면 모델을 변형하여 복제할 수 있습니다. Repeater3D 을 사용하는 것과는 달리 모델과 해당 그래픽 리소스는 한 번만 할당됩니다. 복제된 인스턴스의 렌더링은 GPU에 의해 낮은 수준에서 수행됩니다. 모델의 복잡성에 따라 몇 배의 성능 향상을 가져올 수 있습니다.
실제로 인스턴싱은 기본 모델을 기준으로 각 인스턴스가 수정되는 방식을 지정하는 테이블을 정의하여 수행됩니다.
인스턴싱 API
인스턴싱 API의 주요 원칙은 명시적이라는 것입니다: 기존 API 내에서 인스턴싱 기회를 자동 감지하려고 하지 않습니다. 대신 instancing 속성을 Instancing 개체를 참조하도록 설정하여 각 모델을 개별적으로 표시합니다. 동일한 인스턴싱 개체를 여러 모델에서 동시에 사용할 수 있습니다.
인스턴싱 객체는 각 사본이 렌더링되는 방식을 정의하는 테이블을 지정합니다. 사용 가능한 수정 사항은 다음과 같습니다:
- 변형: 위치, 회전 및 배율
- 색상: 모델의 재질과 혼합되는 색상
- 사용자 지정데이터: 사용자 지정 머티리얼에서 사용할 수 있는 데이터
Qt는 인스턴싱을 상속하는 세 가지 QML 유형을 제공합니다:
- InstanceList 모든 인스턴스를 열거하고 각 인스턴스의 프로퍼티에 바인딩할 수 있습니다.
- RandomInstancing 는 정의된 범위 내에서 임의의 인스턴스를 생성하여 빠르게 테스트하고 프로토타입을 만들 수 있는 방법을 제공합니다.
- FileInstancing 외부 파일에서 인스턴스 테이블을 읽습니다.
인스턴싱 예제는 QML API를 사용하여 장면을 생성하는 방법을 보여줍니다.
다른 종류의 인스턴스 테이블은 QQuick3DInstancing 을 서브클래싱하여 C++에서 정의할 수 있습니다. 예를 들어 particle system 는 내부적으로 자체 인스턴싱 테이블을 사용합니다. ModelParticle3D.instanceTable 로 사용할 수 있습니다.
커스텀 셰이더 코드를 작성하면 인스턴싱을 사용하여 물리 기반 렌더링을 위한 변수, 스켈레탈 애니메이션 가중치, 왜곡 또는 커스텀 머티리얼로 표현할 수 있는 기타 모든 추가 프로퍼티를 제어할 수 있습니다. 인스턴싱 테이블의 커스텀 데이터는 4개의 부동 소수점 숫자로 구성됩니다.
커스텀 인스턴싱 예제는 커스텀 머티리얼과 C++로 구현된 인스턴스 테이블을 결합하는 방법을 보여줍니다.
알파 블렌딩 및 인스턴싱
올바른 알파 블렌딩을 위해서는 반투명 오브젝트를 앞뒤로 렌더링해야 합니다. 따라서 QtQuick3D 에서는 불투명 오브젝트와 반투명 오브젝트를 개별적으로 정렬하여 올바른 순서로 렌더링합니다. 그러나 인스턴싱을 사용하면 depth-sorting 이 켜져 있지 않은 경우 GPU는 인스턴싱 테이블에 지정된 순서대로 인스턴스를 렌더링합니다. 인스턴스 수가 많으면 시간이 오래 걸릴 수 있으므로 성능상의 이유로 QtQuick3D 에서는 기본적으로 테이블을 정렬하지 않습니다. 즉, 반투명 인스턴스가 서로 겹치거나 다른 반투명 객체와 겹치면 결과가 잘못 표시될 수 있습니다. 일반적으로 불투명도가 낮으면 오류가 덜 눈에 띕니다.
완전히 불투명한 오브젝트와 겹치지 않는 반투명 오브젝트는 항상 올바르게 렌더링되는데, 이는 Qt가 깊이 버퍼 테스트를 사용하여 불투명한 오브젝트 뒤에 그리는 것을 피하기 때문입니다. 그러나 정렬이 없으면 불투명 오브젝트의 성능에 잠재적인 영향을 미칠 수 있습니다: 최적의 순서로 렌더링되지 않을 수 있으며, 이는 동일한 픽셀이 여러 번 쓰여져 조각 셰이더의 작업이 늘어날 수 있음을 의미합니다.
렌더러는 인스턴싱 테이블의 내용을 검사하지 않으므로 인스턴스 테이블에 반투명 알파 값이 포함된 경우 이를 명시적으로 지정해야 합니다: hasTransparency 속성을 true
로 설정하여 렌더러가 알파 블렌딩을 활성화하도록 합니다. 이는 모든 인스턴스에 적용됩니다: 완전히 불투명한 인스턴스도 깊이 테스트 없이 렌더링되어 눈에 보이는 오류가 발생할 수 있습니다.
씬의 나머지 부분에 대한 렌더링 순서는 모델의 depth bias 을 설정하여 조정할 수 있습니다.
트랜스폼 및 인스턴싱
각 인스턴스에는 인스턴스 테이블에 자체 트랜스폼이 있습니다. 이는 인스턴스화된 모델의 트랜스폼과 결합됩니다. 여러 사용 사례가 있기 때문에 약간 복잡합니다:
- 각 개별 인스턴스에 적용되는 모델에서 트랜스폼을 수행합니다. 이를 통해 인스턴스 테이블을 변경하지 않고도 모든 인스턴스를 한 번에 회전하는 등 저렴한 애니메이션을 만들 수 있습니다.
- 전체 인스턴스 그룹을 한 번에 변환하기.
- 모델 계층 구조 인스턴싱.
이러한 모든 경우를 지원하기 위해 모델의 트랜스폼은 로컬 인스턴스 트랜스폼과 글로벌 인스턴스 트랜스폼의 두 부분으로 나뉩니다. 개념적으로 인스턴싱은 다음과 같이 수행됩니다:
- 먼저 로컬 인스턴스 트랜스폼에 따라 모델이 트랜스폼됩니다.
- 그런 다음 인스턴스 테이블 트랜스폼을 적용하여 각 인스턴스를 계산합니다.
- 마지막으로 인스턴스화된 객체의 전체 그룹이 글로벌 인스턴스 트랜스폼에 따라 트랜스폼됩니다.
기본적으로 모델의 로컬 인스턴스 트랜스폼은 모델의 스케일과 회전으로 구성되며, 나머지는 글로벌 인스턴스 트랜스폼으로 이동합니다.
이는 모델의 instanceRoot 속성을 설정하여 제어할 수 있습니다. 이는 인스턴스 좌표계의 원점을 정의합니다. 가장 일반적인 용도는 모델의 계층 구조를 인스턴스화할 때입니다. 예를 들어 정육면체 주위를 도는 구가 있습니다:
Model { id: cube instancing: someInstanceTable source: "#Cube" materials: DefaultMaterial { diffuseColor: "lightgray" } Node { Model { source: "#Sphere" instanceRoot: cube instancing: cube.instancing x: 150 materials: DefaultMaterial { diffuseColor: "gray" } } NumberAnimation on eulerRotation.y { from: 0 to: 360 duration: 4000 loops: Animation.Infinite } } }
구 인스턴스가 큐브의 요소인 것처럼 위치하도록 지정하려면 instanceRoot
을 지정해야 합니다. 계층 구조의 각 모델은 여전히 instancing
속성을 지정해야 합니다. 일반적인 경우 모두 동일한 Instancing
객체로 설정해야 합니다.
instanceRoot
단일 모델을 인스턴스화할 때도 사용할 수 있습니다. 예를 들어 중심을 벗어난 지점을 중심으로 회전하는 원통이 있습니다:
Node { id: parentNode Model { source: "#Cylinder" instanceRoot: parentNode instancing: anotherInstanceTable x: 25 materials: DefaultMaterial { diffuseColor: "white" } } NumberAnimation on eulerRotation.y { from: 0 to: 360 duration: 1000 loops: Animation.Infinite } }
선택 및 인스턴스화
Picking 는 사용자 인터페이스 상호작용에서 모델을 선택할 수 있는 메커니즘입니다. 인스턴스화된 렌더링을 사용하면 동일한 모델의 여러 표현이 있으므로 선택 결과에는 instance index. 인스턴스화된 선택은 기본 모델에 pickable 속성을 설정하여 활성화합니다.
© 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.