CPU & DRAW

이전 게시글인 Intro의 Before Rendering을 요약하자면, GPU에서 이미지 렌더링을 처리하기 전에 해야하는 요소가 있다는 점을 이야기 했습니다. 이번 주제인 CPU & DRAW는 CPU Thread와 Draw Thread에서 처리하는 일에 대하여 조금 더 풀어 설명하고자 합니다.
CPU[Frame 0]
렌더링을 하려면 '대상'이 '어디'에 있는지를 알아야 합니다. 갑작스레 '대상'과 '어디'라는 개념을 언급하니 혼란스러울 수도 있을 것 같습니다. 엔진을 사용하는 작업자가 '나는 나무를 그리고 싶어'라고 가정을 해보려 합니다. 컴퓨터도 마찬가지로 혼란스럽습니다. 나무가 '어디'에 있는지를 모르기 때문입니다. 레벨에서 오브젝트를 렌더링을 하려고 한다면 나무가 놓인 '위치'를 알아야 그 자리에 나무라는 객체를 그릴지를 결정할 수 있게 됩니다. 실시간 렌더링이기 때문에 활용 방식에 따라서 유저가 무슨 경험하게 될지 컴퓨터는 모릅니다. 모든 '위치'가 바뀌는 프로젝트가 있을 수도 있다는 점도 염두해두고 있어야 합니다. 플레이어가 언제 무엇을 겪게 될지 예측할 방도가 없으니 CPU는 모든 논리와 위치를 계산해야한다는 것을 의미합니다.
이제 CPU는 모든 것들의 위치를 알아야한다는 것을 이해하게 됐습니다. 오브젝트의 위치를 계산합니다. 물리연산도 CPU에서 담당합니다. 오브젝트가 어디로 움직이는 지는 물리 법칙이 결정합니다. 물리법칙이 도달하는 최종위치를 알아내려면 CPU에서 계산하여야 합니다. AI 같은 이유로 CPU에서 계산을 합니다. NPC의 AI가 특정한 역할을 수행하려면 어떠한 방식으로 어디로 가야햐는지를 알아야합니다. 또한 AI의 생성과 소멸도 처리해야 합니다. CPU는 레벨에서 무언가 나타나거나 사라지도록 처리할 수 있습니다.
DRAW[Frame 1]
CPU에서 처리가 끝난 프레임은 GPU 렌더링으로 단계를 곧바로 수행하지 않고 Draw Thread로 넘어가게 됩니다. Draw Thread의 역할은 필요한 것만 렌더링 시키는 것입니다. 그려야할 '대상'을 모르기 때문 입니다. 이전에 CPU에서 정보를 처리 할 때, '어디'에 나무를 놓을 건데? 라는 것에 대한 질문을 했다면, Draw Thread에서는 네가 그릴 오브젝트 '대상'은 무엇이니?란 질문을 던집니다. 사용자가 원했던 '나무'는 이 타이밍에 들어갑니다. 또한 Draw Thread는 화면 상에 있는 것만 렌더링 시키려는 작업을 수행합니다. 모든 대상을 렌더링하고 있는 상태면 낭비되는 비용이 많아짐으로 필요한 것만 남기는 처리 작업을 진행하는 것입니다. 이러한 과정을 Occlusion Process라 합니다.
Occlusion Process
오클루전 프로세스는 보이는 모델과 오브젝트의 목록을 만듭니다. 기본적으로는 오브젝트 단위로 결정이 되고 현재 화면에서 보이는 모델과 보이지 않는 모델을 구분하는 역할을 합니다. 이 단계는 총 5가지의 방법으로 진행이 됩니다. 단일 방법보다 여러가지의 방법을 합쳐서 사용하는 방식이 비용 절약면에서 효율이 좋기 때문에 보통 5가지 방법을 결합하여 사용합니다.
- DistanceCulling
디스턴스 컬링은 카메라에서 일정거리 이상 떨어진 오브젝트를 제외합니다. 메시마다 별도로 설정해주는 것이 가능하며, Cull Distance Volume을 설정 해주면 특정 볼륨 이내의 오브젝트의 일괄적인 제어를 할수 있습니다.



- FrustumCulling
프러스텀 컬링은 카메라에서 보이는 범위에서 벗어난 오브젝트를 제외합니다. 항상 자동으로 적용 됨으로 따로 설정작업이 필요하지 않습니다.

- Precomputed Visibility
장면을 그리드로 나누어 각각의 셀에 저장하여, 셀의 위치에서 보여야할 요소를 결정하는 방식입니다. Precomputed Visibility를 사용하려면 WorldSetting에서 Precomputed Visibility 항목을 활성해 주어야하며, Force No Precomputed Lighting 항목 체크 해제 여부도 확인해 주어야합니다. DistanceCull과 마찬가지로 Volume에 해당하는 Precomputed Visibility Volume이 있습니다.


- Occlusion Culling
오클루전 컬링은 모든 보이는 상태를 검사하여 화면상에 보이는 오브젝트를 그릴지에 대한 가시성 결정을 합니다. 오브젝트에 완전히 가려진 객체들을 그리는 대상에서 제외시킵니다. Freezerendering이란 명령어를 통해서 검증 할 수 있습니다.

Stat initviews
- Visibility Culling에 수행되는 비용 및 관련된 통계를 나타냅니다.

- Nanite Culling(GPU)
나나이트는 컬링은 GPU 기반으로 작동합니다. 오클루전 컬링인 다른 오브젝트에 가려진 객체를 그리지 않는 것과 더불어 클러스터 컬링을 통해 오브젝트 단위로 관리되었던 GPU 비용 측면을 효율적인 관리를 할 수 있도록 의도하였습니다.
오클루전 컬링

클러스터 컬링


'Unreal Pipeline > Rendering Pipeline' 카테고리의 다른 글
| 02 Intro - Unreal Engine (0) | 2025.07.06 |
|---|---|
| 01 Rendering Pipeline Process - Unreal Engine (0) | 2025.04.21 |