핵심 정리
| 단계 | 의미 |
|---|---|
| Primitive setup | 삼각형의 화면 좌표와 경계 계산 |
| Coverage test | 어떤 샘플이 삼각형 안에 있는지 판단 |
| Interpolation | UV, normal 같은 attribute 보간 |
| Fragment shader | 샘플 후보의 색과 출력값 계산 |
| Per-sample test | depth, stencil, blending 적용 |
구조
래스터라이제이션은 clip/NDC/screen space로 온 삼각형을 화면의 샘플 후보로 바꾸는 과정입니다. 이때 만들어지는 단위가 fragment입니다. fragment는 “최종 픽셀”이 아니라 depth test, stencil, blending을 통과하기 전의 후보입니다.
triangle on screen
-> covered samples
-> fragments
-> tests/blending
-> framebuffer pixels삼각형 내부의 attribute는 barycentric coordinate 같은 방식으로 보간됩니다. UV가 보간되기 때문에 fragment shader는 각 fragment마다 다른 텍스처 좌표를 받을 수 있습니다.
픽셀과 fragment
한 픽셀에 여러 fragment가 생길 수 있습니다. 여러 삼각형이 같은 픽셀을 덮거나, MSAA처럼 픽셀 안에 여러 샘플이 있으면 fragment와 픽셀 수는 일치하지 않습니다.
성능 기준
| 상황 | 비용 증가 |
|---|---|
| 큰 삼각형이 화면을 많이 덮음 | fragment 수 증가 |
| 여러 면이 겹침 | overdraw 증가 |
| fragment shader가 복잡함 | ALU, texture sampling 비용 증가 |
| 고해상도 렌더 타깃 | fill-rate, bandwidth 증가 |
| 투명 물체 | depth early reject 어려움 |
래스터라이제이션 이후 비용은 화면 해상도와 화면 점유율에 민감합니다. 같은 메시라도 화면에 크게 보이면 fragment 비용이 커집니다.
주의할 점
정점 수가 적다고 항상 싸게 그려지는 것은 아닙니다. 화면을 크게 덮는 단순한 삼각형 하나도 fragment shader가 무겁거나 overdraw가 크면 비쌀 수 있습니다.
반대로 아주 많은 작은 삼각형은 vertex와 primitive 처리 비용이 문제가 될 수 있습니다. 병목이 정점 쪽인지 fragment 쪽인지 분리해서 봐야 합니다.
참고 링크
1 sources