이전 글에서는 렌더링 파이프라인(Rendering Pipeline)이 왜 등장했는지,
그리고 GPU가 화면 이미지를 만들기 위해 어떤 흐름으로 발전해왔는지를 정리했습니다.
이번 글에서는 렌더링 파이프라인의 첫 번째 단계인 Input Assembly 단계에 대해 정리해보려고 합니다.
처음 IA(Input Assembly)라는 이름을 보면 어렵게 느껴질 수 있지만, 실제 역할은 굉장히 직관적입니다.
이 단계는 GPU가 화면을 그리기 위한 “기본 재료”를 준비하는 과정이라고 할 수 있습니다.
그리고 이 단계를 이해하기 시작하면, 왜 게임 엔진들이 Mesh, Vertex Buffer, Index Buffer 같은 구조를 사용하는지도 함께 이해할 수 있습니다.
GPU가 처음부터 “삼각형”을 알고 있는 것은 아니다.
3D 모델링 저작 도구에서 제작된 모델링은 삼각면(또는 사각면) 여러 개가 서로 연결되는 형태로 구성됩니다.

이렇게 제작된 모델링을 GPU를 통해서 화면에 표현할 때
“GPU는 3D 모델 전체를 화면에 바로 그리는 것 아닌가?”라고 생각할 수도 있습니다.
하지만 GPU는 처음부터 “캐릭터”, “건물”, “자동차” 같은 개념을 이해하지 않습니다.
GPU가 실제로 전달 받는 것은 굉장히 단순한 데이터입니다.
예를 들어 아래 같은 정점(Vertex) 데이터입니다.
Vertex 0 = { Position, Normal, UV }
Vertex 1 = { Position, Normal, UV }
Vertex 2 = { Position, Normal, UV }
3D 모델링 데이터를 통해서 GPU는 먼저 “점(Vertex) 데이터” 목록을 전달 받습니다.
하지만 GPU 입장에서는 아직 이 Vertex 데이터 모음을 가지고 무엇을 어떻게 그려야 하는지 알 수 없습니다.
왜냐하면 어떤 Vertex와 어떤 Vertex를 연결해야 삼각형이 되는지 아직 모르기 때문입니다.
바로 이 문제를 해결하기 위해 Input Assembly 단계가 등장했습니다.
3D 모델은 결국 삼각형 조합이다
최신 GPU는 대부분 삼각형(Triangle) 기반으로 동작합니다.
게임 안의 캐릭터나 건물 역시 내부적으로는 수많은 삼각형 조합 형태로 구성됩니다.

예를 들어 사각형 하나도 실제로는 아래처럼 두 개 삼각형으로 나뉘는 경우가 많습니다.
0 ----- 1 | / | | / | | / | 2 ----- 3
이 구조는 실제로 GPU 입장에서는 아래와 같이 두 개 삼각형으로 처리됩니다.
Triangle 1 = (0, 1, 2) Triangle 2 = (2, 1, 3)
GPU는 결국 “Vertex 목록을 어떤 방식으로 연결해서 기본 도형(Primitive)을 만들 것인가?”를 알아야 합니다.
그리고 이 작업을 담당하는 단계가 바로 Input Assembly 단계입니다.
왜 이름이 “Assembly”일까?
이름을 보면 Input + Assembly 즉, 입력 데이터를 조립한다는 의미로 해석할 수 있습니다.
실제로 이 단계에서는 Vertex 데이터를 읽고, 그 데이터를 기본 도형으로 조립합니다.
여기에서 말하는 기본 도형(Primitive)에는 여러가지 타입이 존재합니다.
- Point
- Line
- Triangle
등의 형태로 Vertex들을 연결하게 됩니다.
즉, Input Assembly 단계는 “GPU가 실제로 처리 가능한 도형 단위로 데이터를 구성하는 단계”라고 볼 수 있습니다.
GPU는 Vertex Buffer를 읽기 시작한다
Input Assembly 단계에서 가장 먼저 사용하는 것이 Vertex Buffer(정점 버퍼)입니다.
Vertex Buffer는 말 그대로 Vertex 데이터가 저장된 메모리 공간입니다.
정점 버퍼에는 아래와 같은 다양한 데이터가 저장될 수 있습니다.
- 위치(Position)
- 노멀/법선(Normal)
- 텍스처 좌표(UV)
- 색상(Color)
- 탄젠트/접선(Tangent)
- 바이탄젠트/종법선(Bitangent)
GPU는 먼저 Vertex Buffer에서 정점 데이터를 읽어오기 시작합니다.
그리고 중요한 점은 GPU가 이 데이터를 매우 빠르게 읽을 수 있어야 한다는 점입니다.
왜냐하면 최근 게임들이 점점 더 복잡해지고, 퀄리티가 향상되면서
수십만, 수백만 개 이상의 Vertex를 처리할 수도 있기 때문입니다.
즉, Vertex 데이터를 어떻게 배치하고 전달할 것인가 역시 굉장히 중요한 문제가 되기 시작했습니다.
Vertex Buffer가 있는데 Index Buffer는 왜 필요할까?
그래픽스 API나 게임 엔진에서 렌더링 파트를 공부하다 보면 Index Buffer(색인 버퍼)라는 개념이 등장합니다.
그리고 최근에는 Vertex Buffer와 Index Buffer를 함께 사용해 정점 데이터를 처리하는 경우가 대부분입니다.
왜냐하면 같은 Index Buffer를 사용하면 Vertex를 여러 삼각형이 공유할 수 있기 때문입니다.
예를 들어 아래와 같은 사각형 구조를 다시 생각해보겠습니다.
0 ----- 1 | / | | / | | / | 2 ----- 3
이 구조는 두 개 삼각형으로 구성되는데, Vertex 1과 Vertex 2는 두 삼각형이 함께 사용합니다.
만약 Vertex 데이터를 삼각형마다 중복 저장하면 메모리 사용량이 크게 증가할 수 있습니다.
그래서 GPU는 보통 Vertex 데이터는 한 번만 저장하고, Index Buffer를 이용해서 “어떤 Vertex들을 연결할 것인가”를 따로 관리합니다.
예를 들어 위의 정점 목록에 아래와 같이 색인 목록을 구성할 수 있습니다.
Indices = {
0, 1, 2,
2, 1, 3
};
즉, Input Assembly 단계는 단순히 Vertex 읽기 단계가 아니라,
Vertex 목록을 어떤 순서와 형태로 조합해서 기본 도형 형태로 조립할지를 결정한 다음, 조립을 처리하는 과정이라고 할 수 있습니다.
Primitive라는 개념의 등장
렌더링 파이프라인을 공부하다 보면 Primitive라는 단어를 자주 접하게 됩니다.
Primitive는 GPU가 처리하는 기본 도형 단위입니다.
- Point Primitive
- Line Primitive
- Triangle Primitive
그리고 최신 GPU에서 가장 많이 사용하는 Primitive가 바로 Triangle입니다.
즉, Input Assembly 단계의 핵심 역할은 결국 Vertex 데이터를 Primitive 형태로 구성하는 과정이라고 볼 수 있습니다.
왜 굳이 이런 단계를 따로 분리했을까?
그런데 그래픽스 프로그래밍을 익한다고해서 Input Assembly에서 처리되는 과정을 보고 느낄 수 있지 않습니다.
Input Assembly의 다음 단계는 Vertex Shader 단계입니다.
따라서 “Vertex를 읽고 바로 Vertex Shader로 넘기면 되는 것 아닌가?” 하는 생각이 들 수도 있습니다.
하지만 GPU 입장에서는 Primitive 단위 구성이 굉장히 중요한 과정입니다.
왜냐하면 렌더링 파이프라인을 구성하는 이후의 단계들은 모두 Primitive 기반으로 동작하기 때문입니다.
- Vertex Shader
- Rasterizer
- Pixel Shader
즉, GPU는 먼저 “어떤 Vertex들이 하나의 도형을 구성하는가”를 알아야 이후 계산을 수행할 수 있습니다.
그리고 이런 이유 때문에 Input Assembly 단계가 렌더링 파이프라인의 가장 앞 단계에 위치하는 것입니다.
CPU는 GPU를 위해 데이터를 준비한다
이제 굉장히 중요하며 우리가 앞으로 잊어서는 안되는 내용이 등장합니다.
GPU가 화면을 그리는 일을 하려면 CPU에서 준비를 해줘야한다는 점입니다.
GPU가 스스로 정점 데이터를 생성하지 않습니다.
CPU 쪽에서 Vertex Buffer 생성, Index Buffer 생성, Primitive Topology 설정과 같은 준비 작업을 처리합니다.
예를 들어 DirectX에서는 아래와 같은 코드를 사용해 Input Assembly 단계에 필요한 작업을 처리합니다.
IASetVertexBuffers(...) IASetIndexBuffer(...) IASetPrimitiveTopology(...)
즉, CPU는 GPU가 효율적으로 Vertex를 조립할 수 있도록 데이터를 준비합니다.
그리고 GPU는 Input Assembly 단계에서 이 데이터를 실제 Primitive 형태로 구성하기 시작합니다.
Input Assembly 단계는 생각보다 굉장히 중요하다
개발자에게 렌더링 파이프라인에서 일반적으로 중요한 단계는 각 Shader 단계입니다.
개발자가 개입해서 각 단계에서 어떤 일을 수행할 지를 결정할 수 있기 때문입니다.
Shader 단계 중 첫 번째 단계인 Vertex Shader는 Input Assembly 바로 다음에 이어집니다.
따라서 처음에는 IA 단계가 단순히 Vertex Shader에서 사용할 데이터를 조립하는 단순 데이터 입력 단계처럼 느껴질 수도 있습니다.
하지만 GPU 전체 렌더링 흐름의 시작점이라고 할 수 있습니다.
왜냐하면 이 단계에서 Primitive 구성이 잘못되면 이후 단계들도 전부 잘못 동작하게 되기 때문입니다.
즉, Input Assembly 단계는 단순 입력 단계라기보다, GPU가 렌더링 가능한 구조를 구성하는 첫 단계입니다.
IA 단계는 도형을 구성하는 단계
Input Assembly라는 이름이 낯설고, 어렵게 느껴질 수도 있습니다.
하지만 지금까지 살펴본대로 Input Assembly 단계는 결국,
Vertex 데이터를 GPU가 처리 가능한 Primitive 형태로 조립하는 과정이라는 것을 알 수 있습니다.
그리고 Input Assembly가 렌더링 파이프라인의 흐름에서 어떤 역할을 하고, 왜 필요한 지를 이해하면
Vertex Buffer, Index Buffer, Primitive Topology 같은 개념들이 등장하는 이유도 함께 이해하실 수 있습니다.
마무리
렌더링 파이프라인의 첫 단계인 Input Assembly는 단순 데이터 입력 단계처럼 느껴질 수도 있습니다.
하지만 GPU가 렌더링 가능한 도형 구조를 만들기 위한 시작 단계라는 것을 살펴봤습니다.
그리고 이 단계는 렌더링 파이프라인에서 이후에 이어지는 다른 모든 단계들과 연결됩니다.
- Vertex Shader
- Rasterizer
- Pixel Shader
다음 글에서는 Vertex Shader 단계가 왜 등장했는지,
그리고 GPU는 왜 Vertex를 “변환”하기 시작했는지를 이어서 정리해보려고 합니다.