에듀테크 프로젝트 대시보드
안티에일리어싱 (Anti-Aliasing)
화면은 정사각형 픽셀의 격자다. 매끈한 대각선·곡선을 이 격자에 억지로 담으면 계단(jaggies)이 생긴다. 안티에일리어싱은 픽셀이 도형에 얼마나 덮였는지(coverage)를 계산해 경계를 반투명하게 칠하는 기술이다.
가장 단순한 렌더링은 픽셀 중심점 한 곳만 검사한다. 그 점이 도형 안이면 100% 칠하고, 밖이면 0%. 중간이 없다. 그래서 경사가 완만한 선은 한동안 같은 행에 머물다가 한 칸씩 뚝 떨어지는 계단이 된다.
두 캔버스 모두 72×72의 저해상도 격자를 크게 확대한 것이다(픽셀이 네모로 보이게 image-rendering: pixelated 적용).
왼쪽은 경계가 톱니처럼 튄다. 오른쪽은 경계 픽셀이 회색조로 부드럽게 이어진다 — 표본을 늘릴수록 더 매끈해진다.
핵심 아이디어: 픽셀을 점이 아니라 작은 정사각형으로 보고, 그 정사각형 넓이 중 도형이 차지하는 비율 0.0 ~ 1.0을
알파값으로 쓴다. 넓이를 정확히 적분하기 어려우니 보통 픽셀 안을 여러 번 표본화해서 근사한다.
파란 영역이 도형이고, 점은 서브픽셀 표본이다. 초록 점은 도형 안, 회색 점은 밖.
안에 든 표본: 7 / 16 → 커버리지 0.44
실제 넓이 비율: 0.42 — 표본이 많을수록 이 값에 가까워진다
# 픽셀 (px,py) 를 SS×SS 로 표본화해 커버리지 구하기 (SSAA) def pixel_coverage(px, py, shape, SS): inside = 0 for j in range(SS): for i in range(SS): # 픽셀 내부를 균일 격자로 나눠 각 칸의 중심을 표본 sx = px + (i + 0.5) / SS sy = py + (j + 0.5) / SS if shape.contains(sx, sy): inside += 1 return inside / (SS * SS) # 0.0 ~ 1.0 → 픽셀 알파
표본을 많이 찍으면 화질은 좋아지지만 그만큼 계산량도 늘어난다. 그래서 실무에서는 절충안을 쓴다.
| 기법 | 동작 방식 | 비용 | 특징 |
|---|---|---|---|
| SSAA Supersampling |
화면 전체를 2×~4× 큰 해상도로 렌더한 뒤 축소(박스 평균) | 4×~16× | 가장 깔끔. 텍스처·셰이더까지 다 슈퍼샘플 → 매우 무겁다 |
| MSAA Multisample |
깊이·커버리지는 여러 표본, 픽셀 셰이더(색 계산)는 1번만 실행 | 1.3×~2× | 도형 가장자리만 부드럽게. 내부 텍스처 경계·투명 컷아웃엔 효과 없음 |
| FXAA Fast approximate |
렌더 후 완성된 이미지에서 대비가 큰 경계를 찾아 블러 처리 | 거의 0 | 매우 빠르고 어디에나 적용. 화면이 살짝 뭉개지고 얇은 선이 깜빡일 수 있음 |
| TAA Temporal |
이전 프레임들을 조금씩 흔들어(jitter) 모은 뒤 시간축으로 평균 | 낮음 | 정지 화면 화질 최고. 빠르게 움직이면 잔상(ghosting) 발생 → 최신 게임 표준 |
회전하는 얇은 바퀴살. SSAA ON — 켜면 내부적으로 4배 해상도로 그린 픽셀 16개를 평균해 한 픽셀을 만든다.
같은 원리가 시간에도 적용된다. 영화는 초당 24프레임으로 세상을 표본화한다. 바퀴가 프레임 간격보다 빠르게 돌면, 우리 눈에는 느리게 돌거나 거꾸로 도는 것처럼 보인다(alias).
회전 속도를 프레임레이트 근처로 올려 보라. 겉보기 속도가 0으로 멈췄다가 음수(역회전)가 된다. 영화에서 모션 블러를 넣는 이유가 이것 — 프레임 사이의 움직임을 번지게 해서 시간축 커버리지를 만든다.