드로우콜
CPU가 GPU에게 오브젝트를 렌더링하라고 명령 내리는 것을 드로우콜이라고 한다.
렌더링에는 메시, 쉐이더, 텍스처 등의 정보들이 필요하다. 이러한 정보들은 HDD, SSD 등의 데이터 저장 장치에 저장된다. 이러한 정보들은 CPU 메모리에 복사되어 옮겨지게 되고 GPU의 렌더링 작업을 위해 CPU 메모리에서 GPU 메모리에 데이터를 복사하는 과정을 거쳐 GPU에게로 데이터가 넘겨진다.
여기서 렌더링에 사용할 쉐이더, 텍스터의 주소, 알파 블랜딩 사용 여부 등의 렌더링 정보들이 필요하게 되고 이 정보들은 GPU의 렌더링 상태를 저장하는 테이블인 Render States에 저장된다. 이렇게 세팅된 정보들을 바탕으로 GPU는 CPU의 Draw Primitive Call이라는 명령을 받고 렌더링을 시작한다. 이렇게 만들어진 Render States, Draw Primitive Call로 이루어진 하나의 렌더링 명령은 어떤 Redner States를 수정하는 Command와 Draw Primitive Call Command로 나누어져 Command 버퍼에 저장된다. GPU는 Command 버퍼에 쌓인 명령들을 처리하며 렌더링을 하게 된다.
Render States에서 데이터를 수정하는 명령 중 쉐이더, 텍스터를 수정하는 명령을 가르켜 Set Pass Call이라고 한다.
이 둘만 따로 이름이 붙은 이유 중 하나는 아마 무거운 작업이기 때문일 것이다.
ndivia에서 제공되는 자료하고 한다.
파란색 안에 있는 Drawindexed()는 DP Call과 관련된 작업이고 빨간색 안에 있는 요소들이 Set Pass Call과 관련된 작업들이다. 딱 봐도 DP Call에 비해 많이 무겁다. 따라서 렌더링과 관련된 최적화 작업을 할 때에는 Set Pass Call을 최대한 줄이는 방향으로 작업하는 것이 맞다. Set Pass Call은 쉐이터, 텍스처와 관련된 데이터를 수정할 때 발생하므로 해당 수정 작업을 줄여야 한다.
배칭
배칭은 드로우콜을 줄이는 작업이다. 즉 렌더링 최적화 작업이다.
- 정적 배칭
정적인 오브젝트를 대상으로 사용할 수 있는 배칭이다.
같은 메트리얼을 사용하는 오브젝트의 메시를 하나로 통합하며 드로우콜을 줄인다. 여러 오브젝트를 하나의 드로우콜로 렌더링 할 수 있게 된다. 통합한 메시 정보를 저장할 메모리가 필요하기 때문에 메모리 부담이 높은 배칭 방법이다.
통합된 메시들은 클립링되지 않기 때문에 무작정 메시 하나로 통합하는 것은 좋은 방법이 아닐 수 있다.
- 동적 배칭
동적으로 움직이는 오브젝트를 대상으로 사용할 수 있는 배칭이다.
오브젝트들의 버텍스 정보를 하나의 버텍스 버퍼에 저장하여 드로우콜을 줄인다.
버텍스 통합을 매 프레임마다 실행하고 GPU가 아닌 CPU에서 연산하기 때문에 CPU부담이 크다.
이 문제 때문에 활용성이 떨어진다고 한다.
- 텍스처 아틀라스
메트리얼에 사용되난 텍스처들을 하나의 텍스처로 통합하여 드로우콜을 줄이는 방법이다.
이렇게 텍스처를 통합하는 것을 텍스처 아틀라스라고 한다.
'기타' 카테고리의 다른 글
[기타] Compute Shader (0) | 2024.05.28 |
---|---|
[기타] 객체 지향 SOLID 법칙 (0) | 2024.05.09 |
[기타] 객체 지향 프로그래밍 (1) | 2024.05.05 |