Quick Comparison
| 표면 | 색 합성 | 깊이 write | 먼저 확인할 것 |
|---|---|---|---|
| 불투명 | 끔 | 켬 | 일반 depth test |
| Cutout 잎·철망 | discard 또는 alpha clip | 켬 | cutoff, shadow caster |
| 반투명 유리·연기 | straight 또는 premultiplied blend | 보통 끔 | 뒤에서 앞으로 정렬 |
| Premultiplied asset | ONE, ONE_MINUS_SRC_ALPHA | 보통 끔 | RGB가 이미 alpha를 곱했는지 |
straight alpha: C_out = C_src * A_src + C_dst * (1 - A_src)
premultiplied alpha: C_out = C_src + C_dst * (1 - A_src)구조
불투명 렌더링은 보통 depth test로 앞에 있는 표면만 남깁니다. 투명 렌더링은 뒤의 색과 현재 색을 섞어야 하므로 depth test와 blending 순서가 더 까다롭습니다.
final = srcColor * srcFactor + dstColor * dstFactor일반 alpha blending은 source alpha를 기준으로 현재 fragment와 이미 framebuffer에 있는 색을 섞습니다. 이때 destination 색은 이미 그려진 결과이므로, 투명 물체는 대개 뒤에서 앞으로 정렬해 그립니다.
alpha test는 blending이 아니라 discard에 가깝습니다. 잎사귀, 철망, 머리카락 카드처럼 완전히 보이거나 완전히 안 보이는 경계에는 유용하지만, 부드러운 반투명 표현에는 맞지 않습니다.
straight alpha texture의 RGB는 alpha와 독립적인 색이고, blend factor는 보통 SRC_ALPHA, ONE_MINUS_SRC_ALPHA입니다. premultiplied alpha texture는 저장 전에 RGB에 alpha를 곱한 값이므로 ONE, ONE_MINUS_SRC_ALPHA를 써야 합니다. asset 표현과 blend state를 섞으면 가장자리가 검게 뜨거나 밝은 halo가 생깁니다.
Premultiplied alpha
premultiplied alpha는 RGB 값에 alpha가 미리 곱해진 상태입니다. 투명한 texel의 RGB가 이웃 색을 섞는 문제를 줄이고 여러 합성을 안정적으로 만들 수 있지만, texture export와 blending state가 같은 전제를 공유해야 합니다. 이미 straight alpha로 저장된 PNG에 premultiplied blend state를 쓰거나 그 반대를 쓰면 값이 두 번 곱해지거나 전혀 곱해지지 않습니다.
선택 기준
| 상황 | 접근 |
|---|---|
| 유리, 연기, UI 반투명 | alpha blending |
| 나뭇잎, 철망, cutout 표면 | alpha test, alpha clipping |
| 가장자리 halo가 보임 | premultiplied alpha 확인 |
| 투명 물체끼리 겹침 | 정렬, depth write 정책 |
| 많은 투명 particle | overdraw와 blending 비용 확인 |
| 색이 검거나 과하게 밝음 | texture alpha 표현과 blend factor를 함께 확인 |
투명도는 shading 문제가 아니라 렌더링 순서와 framebuffer 합성 문제입니다. material 값이 맞아도 draw order와 depth write가 틀리면 결과가 깨집니다.
주의할 점
투명 물체는 depth write를 끄는 경우가 많지만, depth test까지 끄면 뒤에 있어야 할 물체가 앞에 섞일 수 있습니다. depth test, depth write, sort order를 분리해서 봐야 합니다.
Deferred rendering은 G-buffer에 불투명 표면 하나의 정보를 저장하는 구조라 투명도를 자연스럽게 처리하기 어렵습니다. 그래서 투명 pass는 별도 forward pass로 분리되는 경우가 많습니다.
alpha clipping은 깊이를 정상적으로 기록할 수 있지만 cutoff 경계가 계단져 보일 수 있습니다. alpha-to-coverage와 MSAA는 일부 완화책이지만 sample count와 coverage 규칙에 의존하므로, 일반 blending의 대체 규칙으로 가정하면 안 됩니다.
참고 링크
1 sources