핵심 정리
| 개념 | 의미 |
|---|---|
| Vertex | 위치와 attribute를 가진 입력 단위 |
| Attribute | normal, UV, color, tangent 같은 정점 데이터 |
| Index buffer | 정점 재사용을 위한 인덱스 목록 |
| Primitive | point, line, triangle 같은 조립 단위 |
| Mesh | vertex/index/material 정보 묶음 |
구조
GPU는 보통 정점 버퍼에서 position, normal, UV 같은 attribute를 읽고, index buffer를 통해 삼각형을 조립합니다. 삼각형이 기본 단위인 이유는 항상 평면을 이루고, 보간과 래스터라이제이션 규칙을 안정적으로 적용하기 쉽기 때문입니다.
vertex buffer:
position, normal, uv
index buffer:
0, 1, 2
2, 3, 0정점 하나는 화면의 픽셀 하나가 아닙니다. 정점은 삼각형의 꼭짓점이고, rasterization 단계에서 삼각형 내부의 fragment 후보가 만들어집니다.
보간
삼각형 내부 fragment의 UV, normal, color는 정점 attribute를 보간해서 얻습니다. 그래서 vertex shader가 넘긴 값은 fragment shader에서 픽셀마다 다른 값으로 들어올 수 있습니다.
데이터 설계
| 목적 | 필요한 attribute |
|---|---|
| 위치만 표시 | position |
| 기본 조명 | position, normal |
| 텍스처 매핑 | position, UV |
| normal map | normal, tangent, UV |
| vertex color | color |
| 스키닝 | bone index, weight |
attribute가 많아질수록 vertex bandwidth가 늘어납니다. 필요 없는 attribute를 계속 실어 보내면 vertex processing과 메모리 대역폭 비용이 증가합니다.
주의할 점
정점 수와 삼각형 수는 같은 값이 아닙니다. UV seam, hard normal, tangent split이 있으면 같은 위치라도 여러 정점으로 분리될 수 있습니다.
또 index buffer가 항상 빠른 것은 아닙니다. 정점 재사용이 거의 없거나 데이터가 매우 단순한 경우에는 인덱스 관리 비용과 캐시 효율을 함께 봐야 합니다.
참고 링크
1 sources