드로우 콜
게임 그래픽스에서 성능에 큰 영향을 미치는 중요한 개념 중 하나.
CPU가 GPU에게 렌더링 명령을 보내어 화면에 그릴 객체를 지정하는 것으로, 게임의 성능에 직결되는 중요한 요소.
컬링 (Culling)
렌더링 대상에 포함되는지 여부를 체크하는 과정으로, 시야에 포함되지 않는 오브젝트는 제외.
렌더링 대상인 오브젝트만이 드로우 콜을 발생.
CPU와 GPU의 협업
GPU가 메시를 렌더링하려면 GPU 메모리에서 데이터를 읽어와야 함.
CPU는 스토리지에서 파일을 읽어들이고 데이터를 CPU 메모리에 올린 뒤, GPU 메모리로 복사.
위 복사과정이 매 프레임마다 일어난다면 성능을 많이 잡아먹음.
이 과정을 최적화하기 위해 데이터는 로딩 시점에 미리 메모리에 올려두어야 함.
Render State와 DP Call
GPU는 어떤 텍스처, 어떤 버텍스, 어떤 쉐이더 등을 사용할지를 알려주는 정보를 렌더 상태(Render State)에 저장.
CPU가 렌더 상태를 변경하는 명령을 GPU에게 보내면, GPU는 해당 정보를 렌더 상태에 저장.
CPU는 마지막으로 GPU에 메시를 그리라는 명령을 보내는데, 이를 DP Call(Draw Primitive Call)이라고 함.
Command Buffer
PU가 GPU에 명령을 보낼 때 명령들을 잠시 저장하는 버퍼가 존재.
CPU가 명령을 GPU에게 직접 보내는 것이 아니라, 명령을 버퍼에 쌓아두고 GPU가 가져가서 처리하는 방식을 사용.
이를 통해 CPU와 GPU는 비동기적으로 일을 처리할 수 있음.
드로우 콜과 성능
CPU에서 GPU로 명령을 변환하는 과정에서 오버헤드가 발생.
최적화를 위해서는 드로우 콜 호출 횟수를 줄이는 것이 중요하며, 멀티쓰레드 렌더링 등의 기술을 활용하여 성능을 향상시킬 수 있음.
렌더링 되기 위한 CPU에서 GPU에게 보내는 정보
메시 정보 (Mesh Information)
3D 모델의 기하학적 형태를 정의하는 정보로, 정점(Vertex), 인덱스(Index), 면(Face) 등이 포함.
텍스처 정보 (Texture Information)
표면에 적용되는 이미지나 패턴과 같은 시각적 정보를 정의함.
텍스처는 오브젝트의 표면에 입히는 데 사용.
쉐이더 정보 (Shader Information)
그래픽 카드에서 실행되는 쉐이더 프로그램을 정의함.
쉐이더는 빛의 효과, 그림자, 색상 처리 등을 담당하며, 렌더링의 시각적 결과를 조작함.
트랜스폼 정보 (Transform Information)
오브젝트의 위치, 회전, 크기 등을 나타내는 변환 정보.
이를 통해 오브젝트의 월드 공간에서의 위치와 방향을 조절.
알파 블렌딩 여부 (Alpha Blending)
투명도 및 투명한 오브젝트들 간의 블렌딩을 정의함.
알파 블렌딩을 사용하면 오브젝트의 일부가 투명하게 표시될 수 있음.
기타 등등
다양한 렌더링 옵션 및 특성에 관련된 기타 정보들을 포함.
예를 들어, 라이팅 정보, 쉐이딩 모델, 렌더 타깃 등이 해당.
드로우 콜의 발생 조건
기본적으로 오브젝트를 그릴 때
메시가 1개이고 머티리얼이 1개인 경우, 한 번의 드로우 콜이 발생.
여러 개의 메시가 있는 오브젝트
오브젝트의 메시가 여러 개인 경우, 각 메시당 한 번의 드로우 콜이 발생.
예를 들어, 한 오브젝트의 메시가 10개이면 해당 오브젝트를 렌더링하는데 드로우 콜이 10번 발생하며, 10개의 메시로 이뤄진 오브젝트가 20개 있다면 드로우 콜은 총 200번 발생.
메시는 1개이지만 머티리얼이 여러 개인 경우
메시는 1개이지만 머티리얼이 여러 개인 경우, 각 머티리얼당 한 번의 드로우 콜이 발생.
이는 서브 메시 생성과 관련됨.
쉐이더에서 멀티패스로 두 번 이상 렌더링하는 경우
쉐이더 내에서 멀티패스로 두 번 이상 렌더링하는 경우, 각 패스당 한 번의 드로우 콜이 발생.
예를 들어, 카툰 렌더링 쉐이더에서 외곽선을 추가로 그려주는 경우가 이에 해당.