핵심 정리
| 개념 | 의미 |
|---|---|
| Alpha | 색의 불투명도 또는 마스크 값 |
| Alpha test | 기준값보다 낮은 fragment를 버림 |
| Alpha blending | source와 destination 색을 섞음 |
| Premultiplied alpha | RGB가 alpha만큼 미리 곱해진 표현 |
| Sort order | 투명 물체 합성 순서 |
구조
불투명 렌더링은 보통 depth test로 앞에 있는 표면만 남깁니다. 투명 렌더링은 뒤의 색과 현재 색을 섞어야 하므로 depth test와 blending 순서가 더 까다롭습니다.
final = srcColor * srcFactor + dstColor * dstFactor일반 alpha blending은 source alpha를 기준으로 현재 fragment와 이미 framebuffer에 있는 색을 섞습니다. 이때 destination 색은 이미 그려진 결과이므로, 투명 물체는 대개 뒤에서 앞으로 정렬해 그립니다.
alpha test는 blending이 아니라 discard에 가깝습니다. 잎사귀, 철망, 머리카락 카드처럼 완전히 보이거나 완전히 안 보이는 경계에는 유용하지만, 부드러운 반투명 표현에는 맞지 않습니다.
Premultiplied alpha
premultiplied alpha는 RGB 값에 alpha가 미리 곱해진 상태입니다. 가장자리 halo를 줄이고 합성 수식을 안정적으로 만들 수 있지만, texture export와 blending state가 같은 전제를 공유해야 합니다.
선택 기준
| 상황 | 접근 |
|---|---|
| 유리, 연기, UI 반투명 | alpha blending |
| 나뭇잎, 철망, cutout 표면 | alpha test, alpha clipping |
| 가장자리 halo가 보임 | premultiplied alpha 확인 |
| 투명 물체끼리 겹침 | 정렬, depth write 정책 |
| 많은 투명 particle | overdraw와 blending 비용 확인 |
투명도는 shading 문제가 아니라 렌더링 순서와 framebuffer 합성 문제입니다. material 값이 맞아도 draw order와 depth write가 틀리면 결과가 깨집니다.
주의할 점
투명 물체는 depth write를 끄는 경우가 많지만, depth test까지 끄면 뒤에 있어야 할 물체가 앞에 섞일 수 있습니다. depth test, depth write, sort order를 분리해서 봐야 합니다.
Deferred rendering은 G-buffer에 불투명 표면 하나의 정보를 저장하는 구조라 투명도를 자연스럽게 처리하기 어렵습니다. 그래서 투명 pass는 별도 forward pass로 분리되는 경우가 많습니다.
참고 링크
1 sources