드로우콜

CPU가 현재 프레임에 어떤 것을 그려야 할지 정하고, GPU에 오브젝트를 그리라고 명령을 한다.

이 명령이 바로 드로우콜이다.

 

게임의 오브젝트를 화면에 렌더링 하려면, 우선 오브젝트가 렌더링 대상인지를 판단해야 한다.

이러한 과정을 컬링(프러스텀 컬링, 오클루전 컬링 등)이라고 하며,

컬링을 거친 오브젝트가 렌더링 되기 위해서는 CPU에서 GPU에 다음의 정보를 줘야한다.

 

- 메시 정보

- 텍스쳐 정보

- 쉐이더 정보

- 트랜스폼 정보

- 알파 블렌딩 여부

 

 

이러한 정보는 스토리지에 보관되어있다가 CPU가 이를 읽어들여 CPU 메모리에 데이터를

올린다. 그 후 CPU 메모리에 있는 정보들을 GPU 메모리로 복사하는 과정을 거친다.

 

이러한 과정이 매 프레임마다 일어난다면, 성능을 많이 잡아먹기 때문에 로딩 시점에서

데이터들을 미리 메모리에 올려둔다.

 

오브젝트 렌더링이 시작되면, GPU에 어떤 텍스처를 사용할지, 어떤 버텍스들을 사용할지, 어떤 쉐이더를

사용할지 등 메모리에 있던 정보들을 순차적으로 전달해야한다.

이런 정보들을 GPU의 상태 정보를 담는 테이블에 저장하고, 이 테이블을 Render State라고 부른다.

각각의 요소는 GPU 메모리를 가리키는 포인터를 저장한다.

 

CPU가 렌더 상태를 변경하는 명령을 GPU에게 보낸 후, 마지막으로 메시를 그리라는 명령을 GPU에게 추가로 보낸다.

이 명령을 DP Call(Draw Primitive Call) 이라고 부른다. GPU는 DP Call을 받으면 렌더 상태의 여러 정보들을

바탕으로 오브젝트의 메시를 렌더링한다.

 

이러한 과정에서 드로우콜에 사용되는 명령들은 GPU가 알아들을 수 있는 명령으로 변환되어야 하는데,

이것이 CPU 오버헤드를 발생시키며, CPU 병목의 주 원인이 된다.

 

요약)

 

1. 렌더 상태 정보들을 변경하라는 명령을 GPU에 내리고,

2. 렌더 상태 정보들을 바탕으로 메시를 그리라는 명령인 DP Call을 보냄

 

=> 이러한 과정을 드로우콜이라고 부른다.

 

드로우콜의 발생 예시

 

메시 1개, 머테리얼 1개 => 드로우콜 1번

메시 10개 => 드로우콜 10번

메시 10개 * 20 => 드로우콜 200번

메시 1개, 머테리얼 2개 => 드로우콜 2번 (서브메쉬 생성)

참고 링크 : https://tsyang.tistory.com/79

 

 

 

 

+ Recent posts