Post Multiplied Alpha
Dest.rgb = (Src.rgb * Src.a) + (1 - Src.a) * (Dest.rgb)
- Src : SRC_ALPHA
- Dest : INV_SRC_ALPHA
다음의 이미지를 보면 왼쪽은 (R:1.0, G:0.0, B:0.0, A:1.0) 컬러이고, 오른쪽은 (R:0.0, G:1.0, B:0.0, A:0.1) 색이다. 이 둘을 혼합한다면 아주 연한 녹색 빛을 띄는 붉은색이 되어야 할 것이다.
그런데 저 둘을 가지고 1x1 Mipmap을 만들어보면 다음과 같은 결과가 나타난다!?
이 컬러는 (R:0.5, G:0.5, B.0.0, A:0.55)로 단순히 2개의 색이 평균된 것이다.
Pre-multiplied Alpha
이제 공식을 바꾼다.
Src2.rgba = (Src.rgb * Src.a, Src.a) // Src에 Alpha를 미리 곱함 (=Pre-multiply)
Dest.rgb = (Src2.rgb * 1) + (1 - Src2.a) * (Dest.rgb)
- Src : SRC_ONE
- Dest : INV_SRC_ALPHA
이제 Blending 하기 전에 Alpha와 RGB를 미리 곱한다. 위에서 보았던 이미지는 이제 다음처럼 변경된다. 왼쪽은 Alpha가 1이니까 그대로 (R:1.0, G:0.0, B:0.0, A:1.0)이지만, 오른쪽은 Alpha가 0.1이기 때문에 (R:0.0, G:0.1, B:0.0, A:0.1)로 변경된다.
이제 Mipmap을 만들어보면!
사실 위의 예제에서는 Mipmap을 얘기했지만, Texture Filtering 할 때 인접 픽셀들을 가지고 섞는데 여기서도 Pre-multiplied RGB가 더 정확하다.
참고
https://developer.nvidia.com/content/alpha-blending-pre-or-not-pre
https://blogs.msdn.microsoft.com/shawnhar/2009/11/06/premultiplied-alpha/
'Game Dev > Article' 카테고리의 다른 글
Tiled Rendering (0) | 2016.10.21 |
---|---|
Forward+ Rendering (1) | 2016.10.19 |
Inferred Lighting (0) | 2016.10.13 |
Light Pre-Pass Renderering (=Deferred Lighting) (0) | 2016.10.09 |