1. IA 스테이지 개요
Input-Assembler, IA 단계는 그래픽스 파이프라인의 첫번째 단계이다.
IA 스테이지의 핵심 목적은 GPU 메모리에 존재하는 정점 버퍼(Vertex Buffer)와 인덱스 버퍼(Index Buffer)에서 원시 정점 및 인덱스 데이터를 읽어들이는 것이다. 그리고 이 데이터들을 기본 도형 토폴로지(Primitive Topology) 설정에 맞게 조합하여, 렌더링의 최소 단위인 기본 도형(Primitive)을 조립한다.
이렇게 조립된 기본 도형(과 관련 정점 데이터)은 파이프라인의 다음 단계인 정점 셰이더(Vertex Shader)로 전달된다.
2. IA 스테이지의 주요 기능
IA 단계의 기능은 크게 두 가지로 요약할 수 있다.
- Primitive 조립. 사용자가 제공한 버퍼에서 데이터를 읽고, 설정된 토폴로지 규칙에 따라 점, 선, 삼각형 등의 기본 도형을 조합한다.
- 시스템 생성 값(System-Generated Values) 추가: 셰이더에서 유용하게 사용할 수 있는 시스템 시맨틱(Semantic)을 데이터에 추가(연결)한다. 이는 셰이더의 효율을 높인다.
- 예: `SV_VertexID` (정점 ID), `SV_InstanceID` (인스턴스 ID), `SV_PrimitiveID` (기본 도형 ID)
3. 핵심 구성 요소 및 용어
IA 스테이지를 이해하기 위해서는 다음 구성 요소들에 대한 정의가 필요하다.
3.1. 정점 (Vertex)

- 도형을 구성하는 꼭짓점. 하나의 점, 선분의 양 끝점, 또는 다각형의 꼭짓점이 될 수 있다.
- 정점은 단순히 3D 위치(Position) 정보뿐만 아니라, 렌더링에 필요한 추가 데이터(속성)를 포함할 수 있다.
- 노멀 벡터 (Normal)
- 텍스처 좌표 (Texture Coordinates, UV)
- 정점 색상 (Color)
3.2. 기본 도형 (Primitive)
- 'Primitive'는 '원시의', '기본의'라는 뜻으로, GPU가 렌더링할 수 있는 가장 기본적인 도형 단위를 말한다.
- 예: 점(Point), 선(Line), 삼각형(Triangle)
3.3. 정점 버퍼 (Vertex Buffer)
- 렌더링에 사용할 모든 정점(Vertex) 데이터를 연속된 메모리(버퍼)에 모아놓은 자료구조이다.
- IA 스테이지에는 동시에 여러 개의 정점 버퍼를 설정(바인딩)할 수 있다. (D3D11/12 기준 최대 32개)
3.4. 인덱스 버퍼 (Index Buffer)

- 정점 버퍼의 정점들을 재사용하여 기본 도형을 조립할 때 사용된다.
- 정점 중복 문제: 사각형(삼각형 2개)을 예로 들면, 4개의 정점이 필요하지만 삼각형 2개를 `TRIANGLELIST`로 그리면 총 6개의 정점 데이터가 필요하다. 이 중 2개는 중복이다.
- **해결:** 인덱스 버퍼는 정점 버퍼에 4개의 고유한 정점만 저장한 뒤, 이 정점들의 '순서(인덱스)'를 `[0, 1, 2, 0, 2, 3]` 과 같이 저장하여 중복을 제거한다.
- IA 스테이지에는 동시에 **1개**의 인덱스 버퍼만 설정할 수 있다.
3.5. 기본 도형 토폴로지 (Primitive Topology)
- IA가 정점들을 어떤 방식으로 조합하여 기본 도형을 형성할지 정의하는 설정(규칙)이다.
- 주요 토폴로지 유형은 다음과 같다.
- D3D_PRIMITIVE_TOPOLOGY_POINTLIST: 모든 정점을 독립된 점으로 그린다.
- D3D_PRIMITIVE_TOPOLOGY_LINELIST: 정점 2개를 묶어 하나의 독립된 선분으로 그린다.
- D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: 모든 정점을 순서대로 이어 하나의 연속된 선으로 그린다.
- D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: 정점 3개를 묶어 하나의 독립된 삼각형으로 그린다. (가장 보편적)
- D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: 정점들을 연속적으로 사용하여 일련의 삼각형들(스트립)을 생성한다.
3.6. 입력 레이아웃 (Input Layout)
- 정점 버퍼는 단순히 바이트(byte)가 모여있는 자료구조일 뿐, 그 내용물의 구조를 알지 못한다.
- 입력 레이아웃은 정점 버퍼의 데이터가 어떤 구조로 이루어져 있는지를 IA와 셰이더에게 알려주는 객체이다.
- 예: "정점 데이터의 첫 12바이트는 `float3`형식의 `POSITION`이고, 그다음 8바이트는 `float2` 형식의 `TEXCOORD`이다."
- 이 정보는 'D3D11_INPUT_ELEMENT_DESC' (혹은 D3D12의 'D3D12_INPUT_ELEMENT_DESC') 구조체의 배열로 정의된다.
- IA 단계는 이 입력 레이아웃의 시맨틱스와 정점 셰이더의 입력 시맨틱스를 비교하여, 데이터가 올바르게 전달되는지 검증하는 작업도 수행한다.
4. 상수 버퍼 (Constant Buffer)
- 상수 버퍼는 IA 스테이지에서 직접 사용하는 구성 요소는 아니다.
- 이것은 CPU가 셰이더 스테이지(정점 셰이더, 픽셀 셰이더 등)로 데이터를 전달할 때 사용하는 버퍼이다.
- 셰이더가 실행되는 동안 변하지 않는 값(예: 월드/뷰/투영 행렬, 시간 값 등)을 전달하는 데 사용된다.
- DX9의 공유 배열보다 효율적으로 업데이트되도록 설계되어 GPU 메모리 대역폭과 CPU 사용량을 최소화한다.
- GPU는 데이터를 16바이트 배수(float4 크기)로 읽는 것이 효율적이므로, HLSL cbuffer 구조체는 16바이트 경계에 맞춰 패딩(Padding)되며, CPU 측에서도 이 구조를 동일하게 맞춰야 한다.
'그래픽스' 카테고리의 다른 글
| 06. Geometry Shader (0) | 2025.11.04 |
|---|---|
| 05. Domain Shader (0) | 2025.11.04 |
| 04. Tessellator (0) | 2025.11.04 |
| 03. Hull Shader (0) | 2025.11.04 |
| 02. Vertex Shader (0) | 2025.11.04 |