Game Dev/Article

Premultiplied alpha

AKer 2016. 10. 14. 08:34
반응형

Post Multiplied Alpha

우리가 익히 많이 사용하고 있었던 Blending 공식
Dest.rgb = (Src.rgb * Src.a) + (1 - Src.a) * (Dest.rgb)

  • Src : SRC_ALPHA
  • Dest : INV_SRC_ALPHA

하지만 이 공식은 많은 경우에 잘못된 Artifact가 발생한다.


다음의 이미지를 보면 왼쪽은 (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