숏컷 코드
vertex
-> primitive assembly
-> rasterization
-> fragment
-> depth / blend문법과 예시
geometry 데이터가 화면의 픽셀이 되기까지 단계별 변환이 일어난다
렌더링 파이프라인은 "모델 데이터를 어떻게 화면의 픽셀로 바꾸는가"의 큰 흐름입니다. 점(vertex), 선(edge), 면(face), 폴리곤(polygon)이 vertex shader를 거쳐 clip space로 변환되고, primitive assembly에서 삼각형으로 조립됩니다. 이후 rasterization이 삼각형을 화면의 fragment(픽셀 후보) 집합으로 변환하고, fragment shader가 각 fragment의 색을 계산합니다. 마지막으로 depth test와 blend가 최종 픽셀 출력을 결정합니다. 각 단계의 입력과 출력이 무엇인지 이해하면, 버그가 어느 단계에서 생겼는지 추적하는 능력이 생깁니다.
shader로 제어 가능한 단계와 고정 pipeline 단계를 구분해야 한다
modern graphics API에서 vertex shader와 fragment shader는 프로그래머가 직접 작성합니다. 이 두 단계는 재프로그래밍 가능한(programmable) 단계입니다. 반면 primitive assembly, clipping, rasterization, depth/stencil test, blending은 render state와 API 설정으로 제어하지만 직접 shader 코드를 작성하지는 않는 고정(fixed-function) 단계입니다. 버그를 보면 "이게 shader 코드 문제인가, render state 설정 문제인가"를 나누는 것이 디버깅의 첫 단계입니다. 조명이 이상하면 fragment shader, 오브젝트가 안 보이면 depth/clip 상태, 투명도가 잘못되면 blend state를 먼저 봐야 합니다.
[programmable]
vertex shader -> 정점 위치와 속성 변환
fragment shader -> 픽셀 후보의 색 계산
[fixed-function]
primitive assembly -> 삼각형 조립
rasterization -> fragment 생성
depth/stencil test -> 가림 판정
blending -> 투명도 합성파이프라인 단계별로 의심해야 할 버그가 다르다
렌더링 버그를 볼 때 단계 기준으로 의심 범위를 좁히면 디버깅 속도가 크게 달라집니다. 메시가 뒤집혀 보인다면 vertex shader의 좌표 변환 또는 backface culling, 반투명이 이상하다면 blend order나 blend state, 앞뒤 가림이 잘못됐다면 depth test 설정, geometry가 아예 사라진다면 clip space 범위 밖(near/far plane 이탈)이나 vertex shader의 w=0 출력을 먼저 의심합니다. 이 사고 체계가 없으면 shader 코드를 아무리 고쳐도 원인이 render state에 있어서 해결이 안 되는 상황이 반복됩니다.
// 단계별 의심 대상
geometry 사라짐 -> clip space, near/far, vertex shader
뒤집힘 -> winding, backface culling, vertex 변환
투명 합성 이상 -> blend state, 렌더 순서
깊이 판정 이상 -> depth test 설정, depth buffer precision
색 계산 이상 -> fragment shader, texture 샘플링rasterization pipeline과 ray tracing pipeline은 철학이 다르다
실시간 게임 렌더링은 대부분 rasterization 기반으로 시작합니다. 카메라에서 삼각형으로 "앞에서 뒤로" 전진하는 방식입니다. ray tracing은 반대로 카메라에서 픽셀마다 광선을 쏴 교차 오브젝트를 찾는 방식으로, 반사·굴절·정확한 그림자에 유리하지만 비용이 훨씬 높습니다. 현대 게임 엔진은 rasterization 기본 파이프라인에 ray tracing을 선택적으로 혼합합니다(RTGI, RTAO 등). 두 파이프라인을 명확히 구분해 두면 엔진 렌더링 옵션의 의미를 읽는 데 도움이 됩니다.
렌더링 파이프라인을 읽을 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 색 계산이 이상할 때 | fragment shader 먼저 확인 |
| 오브젝트가 사라질 때 | clip space 범위, near/far plane 확인 |
| 투명·반투명이 이상할 때 | blend state, 렌더 순서 확인 |
| 앞뒤 가림이 잘못될 때 | depth test 설정 확인 |
| 메시가 뒤집혀 보일 때 | winding order, backface culling 확인 |
| UI나 파티클이 가끔만 가려질 때 | depth write/test와 투명 렌더 순서를 함께 확인 |
특이 케이스와 주의할 점
흔한 실패는 fragment shader만 계속 고치면서 실제 원인인 depth write, blend state, culling 설정은 안 보는 것입니다. 특히 투명 오브젝트 문제는 색 계산보다 렌더 순서와 state 설정이 원인인 경우가 많습니다. 버그를 보면 shader 단계와 render state 단계를 먼저 분리해서 의심하세요.
참고 링크
2 sources