Render Hell - Book 1 (+알쓸유잡 강의 참고) 정리

2023. 9. 5. 16:12배움엔 끝이없다/그래픽스

쉐이더 스터디 내용 공유를 위해 작성했습니다.

참고 강의 영상: 알쓸유잡 - 야 너두 쉐이더 개발할 수 있어!

주 참고 자료: Render Hell - Book 1

 

Book 1에선 전반적인 렌더링에 대한 High level 용어 정리 및 Pipeline에 대한 overview를 제공합니다.

 

1. 데이터 이동

렌더링을 위한 정보인 정점 데이터, 텍스쳐 등은 RAM에서 VRAM으로 복사된다.

복사 후, RAM에서 더이상 필요하지 않은 데이터는 해제된다. 

- 이는 프로그래머가 정한다. 예를 들어 정점 데이터는 충돌 체크 등을 위해 남기고, 텍스쳐 등 렌더링에만 쓰이는 정보는 해제할 수 있다.

- 유니티에 관련 속성으로는 Texture read/write enabled 속성이 있다. Texture 정보를 cpu에서 읽거나 변경해야할 경우 RAM에서 해제하면 안되므로 체크한다. https://docs.unity3d.com/ScriptReference/Texture-isReadable.html

 

GPU도 CPU처럼 Register, L1, L2 캐시가 존재한다.

 

2. Render State / Draw Call / Command Buffer

Render State: 데이터 말고도 렌더링을 위해 필요한 정보들이 있다. blend mode나 shader 등 여러 설정값들을 합쳐서 Render State라고 부른다.

Draw Call: GPU에게 한번 렌더링을 하라고 명령하는 것을 Draw Call이라 한다.

Command Buffer: CPU가 GPU에게 명령을 전달할 때 Command Buffer에 들어가 순차적으로 처리된다.

 

한 번의 Draw Call을 할 땐 정점 데이터 이외에 모든 Render State는 이전 상태를 쓰므로, 다른 State로 그리고 싶다면 Render State를 변경해줘야한다.

그렇기 때문에 같은 Render State를 가지는 오브젝트들을 먼저 렌더링해야 Render State Change를 줄일 수 있다.

 

3. Sorting, Batching, Instancing

관련된 Draw Call Optimization 중 대표적으로 sorting, batching, instancing이 있다.

Sorting

위에서 말한대로 Render State 변경을 최소화하기 위해 같은 Render State끼리 붙여서 렌더링 하는 방법이다.

Batching

같은 Render State를 가지는 mesh들을 하나의 mesh로 합쳐서, 여러번의 Draw Call을 하나로 합쳐서 렌더링 하는 방법이다.

- Static Batching: 정적인 오브젝트를 하나의 mesh로 합쳐두는 것으로, 주로 배경에 활용됨. 씬이 너무 큰 경우 메모리 부족을 겪을 수 있음

- Dynamic Batching: 움직이는 오브젝트를 하나의 mesh로 합치는 것으로, vertex buffer를 매번 다시 구성해야하기 때문에 graphics API에 따라 효율적이지 않은 경우가 있음. Unity에서는 particle, trail renderer등에 활용함. https://docs.unity3d.com/Manual/dynamic-batching.html

Instancing

같은 Render State와 Data 즉, 1번의 Draw Call을 보내되 GPU에서 같은 정보로 여러번 렌더링하는 방법이다.

간단한 Transform 정보 등만 상이하게 할 수 있으나, 모든 GPU에서 instancing을 지원하지 않는다.

또 어떻게 보면 Batching을 GPU에 넘기는 것과 비슷한 효과이므로, 퍼포먼스가 CPU bound일 때 활용하는 것이 좋다.

반응형