CS/그래픽스

[Rendering Pipeline] Stage 0 : Vertex/index Buffer Preparation(Application Stage)

tae-woong 2025. 12. 25. 00:27

참고 영상

 

렌더링 파이프라인이란 3차원 상의 물체를 2차원의 컴퓨터 화면에 표현하기 위한 과정

0. CPU의 전략적 판단과 GPU를 위한 데이터 패키징

그래픽스 파이프라인의 실질적인 시작점은  Application Stage(Unity, Unreal)입니다.

 

이 단계는 CPU 메모리(RAM)에 있는 게임 월드의 수많은 데이터를 GPU가 처리할 수 있는 최적의 형태로 가공하여 전달하는 과정입니다.

 

클라이언트 개발자에게 이 단계는 Draw Call 최적화와 Memory Management의 승부처입니다.

 

1. Application Stage의 핵심 임무 : 가시성 판단 (Visibility Culling)

컬링은 GPU가 한다고 생각하기 쉽지만, 효율적인 렌더링을 위해 다음의 과정들은 주로 CPU(Application Stage)에서 먼저 수행됩니다.

  • Frustum Culling : 카메라의 시야 범위(Frustum) 밖에 있는 오브젝트를 계산하여 렌더링 목록에서 제외합니다.
  • Occlusion Culling : 시야 범위 안에 있더라도 다른 큰 물체에 완전히 가려진 오브젝트를 선별합니다.

목적 : 불필요한 데이터를 GPU로 보내지 않음으로써 PCI-Express Bandwidth(= 데이터 전송 양)를 절약하고, GPU가 수행할 필요 없는 연산을 원천 차단하여 전체적인 Draw Call 횟수를 줄이는 것입니다.

 

2. Vertex Buffer : 정점 데이터의 정의 (Data Structure)

컬링을 통과한 오브젝트들은 이제 GPU가 이해할 수 있는 정점들의 배열, 즉 Vertex Buffer 형태로 정리됩니다.

 

클라이언트 개발자는 메모리 효율을 위해 이 Data Structure를 정밀하게 설계해야 합니다.

  • Position : 로컬 공간의 좌표입니다.
  • Normal : 라이팅 연산을 위한 법선 벡터입니다.
  • UV Coordinates : Texture 매핑을 위한 좌표입니다.
  • Tangent : Normal Map 적용을 위한 접선 벡터입니다.

개발자 관점의 포인트 : 버텍스 하나에 담기는 정보가 많을수록 전송 속도가 느려집니다. 예를 들어, 모바일 환경에서는 32비트 Float 대신 16비트 Half Float를 사용하여 Memory Footprint(프로그램이 동작 중에 사용하는 메인 메모리의 양)를 절반으로 줄이는 등의 최적화가 이 단계의 설계에서 결정됩니다.

 

3. Index Buffer : 재료의 재사용과 효율 (Connectivity)

3D 모델은 수많은 삼각형의 집합이며, 하나의 정점은 보통 여러 개의 삼각형에 공유됩니다. Index Buffer는 이를 효율적으로 관리하기 위한 레시피 역할을 합니다.

  • 메커니즘 : Vertex Buffer에는 고유한 정점 데이터만 남기고, Index Buffer에서 그 정점들의 번호(Index)를 나열하여 삼각형을 정의합니다. (예: 0-1-2, 2-1-3)
  • 효율성 : 정점 데이터 자체를 복제하는 것보다 인덱스 번호를 사용하는 것이 메모리 사용량을 획기적으로 낮춥니다.
  • GPU 캐시 최적화 : Index Buffer를 잘 구성하면 GPU 내부의 Post-Transform Cache 히트율이 높아져, 이미 계산된 정점 연산을 재사용할 수 있게 됩니다.

 

4. 드로우 콜과 커맨드 버퍼 (Command Buffer & Render State)

데이터가 준비되면 CPU는 그래픽 API(DirectX, Vulkan, Metal 등)를 통해 다음 작업을 수행합니다.

 

CPU가 GPU에게 명령을 내릴 때, 이 명령들은 즉시 실행되는 것이 아니라 Command Buffer에 차례대로 쌓입니다.

  • Command Buffer : CPU는 GPU가 한가해질 때까지 기다리지 않습니다. 대신 실행해야 할 명령(Draw Call 등)들을 Command Buffer라는 대기열에 순차적으로 쌓아둡니다. GPU는 자기 속도에 맞춰 이 버퍼에서 명령을 하나씩 꺼내 처리합니다.
  • Render State : "어떤 텍스처를 쓸 것인가?", "어떤 쉐이더를 쓸 것인가?", "블렌딩 모드는 무엇인가?" 등 렌더링에 필요한 모든 환경 설정을 의미합니다.
  • ★ Draw Call (The Trigger) : Render State 설정이 모두 끝난 후, 최종적으로 "그려라"라고 명령을 내리는 신호입니다.

개발자 노트 : 드로우 콜 자체가 무거운 게 아니라, ★ 드로우 콜 직전에 Render State를 변경하는 행위(= SetPass Call)가 CPU에 엄청난 부하를 줍니다. 따라서 같은 머티리얼을 사용하는 오브젝트들을 묶는 배칭(Batching) 기술은 이 상태 변경 횟수를 줄이는 것이 목적입니다.

 

5. 핵심 요약 및 시사점

Application Stage는 단순히 데이터를 넘기는 단계가 아니라, "무엇을 그릴지(Culling)" 결정하고 "어떻게 효율적으로 보낼지(Buffer Preparation)"를 설계하는 단계입니다.

  • Culling을 통해 GPU의 불필요한 연산을 방지합니다.
  • Vertex Buffer는 데이터의 원천(Source)입니다.
  • Index Buffer는 데이터의 연결성(Topology)을 담당합니다.