개요
절두체 선별은 cpu에서 렌더링 파이프라인 전 각 오브젝트(인스턴스)들에 대해 그들의 경계입체가 시야 절두체와 충돌하는지 검사하고 충돌하지 않는 오브젝트는 제외하고 충돌하는 오브젝트들만 렌더링 파이프라인에 제출하는 기법을 이야기한다.
래스터화 단계의 절단에서 절두체에 속하지 않는 삼각형들을 제외하긴 하지만 그전에 api호출 비용이나, 정점 셰이더, 테셀레이션, 기하 셰이더에서는 그대로 계산이 되기에 cpu에서 절두체에 충돌하지않는 오브젝트는 미리 선별하여 렌더링 파이프라인에 제출자체를 하지않는다면 성능을 높일 수 있다.
만일 선별을 하지않는다면 gpu에서 오브젝트별로 수많은 정점들에 대해 연산을 해야하지만 선별을 한다면 오브젝트 별로 cpu에서 간단한 aabb, 구등의 경계입체와 절두체 사이의 충돌 판정만 해주면 되기에 훨씬 성능이 좋을 수 있다.
절두체 선별 과정
절두체 선별은 다음 과정을 거친다.
- 시야 공간에서의 절두체를 구한다.
- 시야공간 절두체에 역 시야행렬을 곱해 월드 공간에서의 절두체를 구한다.
- 각 오브젝트 별로 역 월드행렬을 이용해 해당 오브젝트 로컬 공간에서의 절두체를 구한다.
- 해당 오브젝트의 로컬 공간 경계입체와 로컬 공간 절두체의 충돌검사를 진행한다.
- 충돌하는 오브젝트만 렌더링한다.
절두체 선별 및 인스턴싱
인스턴싱을 사용할때 절두체 선별을 다음과 같이 적용할 수 있다.
한 기하구조로 여러 인스턴스를 그릴 때 그 기하구조의 각 인스턴스에 대해 기하구조의 경계입체와 인스턴스의 역 월드행렬로 인스턴스가 절두체와 충돌하는지 검사한다.
절두체와 충돌하는 인스턴스들을 인스턴스 구조적 버퍼에 앞에서 부터 넣는다.
절두체와 충돌하는 인스턴스 수를 저장해둔다.
이후 해당 인스턴스 수로 인스턴싱 렌더링을 호출한다.
이렇게 하면 그려질 인스턴수 개수로 인스턴싱 렌더링이 되며 할당되는 인스턴스 ID도 0 ~ 인스턴스 개수 - 1 이 되어 갱신해준 구조적 버퍼 부분까지를 사용하여 그에 해당하는 인스턴스들이 그려지게 된다.
참고서적
DirectX 12를 이용한 3D 게임 프로그래밍 입문
'그래픽스 > DirectX12' 카테고리의 다른 글
[Directx12][18장]입방체 매핑 (0) | 2023.03.21 |
---|---|
[Directx12][17장]3차원 물체의 선택 (0) | 2023.03.21 |
[Directx12][16장][1]인스턴싱 (0) | 2023.03.21 |
[Directx12][15장]1인칭 카메라 & 동적 색인화 (0) | 2023.03.21 |
[Directx12][14장]테셀레이션 (0) | 2023.03.21 |