[컴] Porter / Duff Mode - 1

안드로이드 / 그래픽 포터 더프 모드 / 색 조합 방법 / 그래픽 모드



Porter/Duff Mode

shader 를 사용할 때 모드중에 PorterDuff Mode(Porter/Duff) 가 있다. 오늘은 이녀석에 대해 간략하게 알아보자.

Porter/Duff 는 이 두사람이 쓴 논문에 있는 내용이 2개의 image 를 pixel 정보를 가지고 composite(조합?) 하는 방법에 대해 이야기하는데, 거기에 나온 내용을 구현해 놓은 것이다. 필자도 대충 본 것이라 일단 넘어가자 ^^

ref. 4 를 보면 PorterDuff Mode 의 연산방법에 대한 enum 값이 나와 있다. 근데 공부좀 해야 알아먹을 정도이다. 그래서 여기서는 조금 쉽게 이야기 한다.(대신에 부정확할 수 있지만 그것은 알아서 판단하자.^^;;)

일단 어떤 연산(operator) 이 있는지 알아보자.
  1. DST
  2. DST_ATOP
  3. DST_IN
  4. DST_OUT
  5. DST_OVER
  6. CLEAR
  7. SRC
  8. SRC_ATOP
  9. SRC_IN
  10. SRC_OUT
  11. SRC_OVER
  12. XOR
  13. LIGHTEN
  14. ADD
  15. DARKEN
  16. MULTIPLY
  17. OVERLAY
  18. SCREEN

18개나 있다 ^^;; 오늘은 이중에 설명이 비교적 쉬운(?) 위의 12개에 대해서만 이야기하도록 하자.

설명을 위해서 ref. 2 에서 그림을 좀 가져왔다. 그림을 보면 대략 감이 잡힌다.

from : ref. 2

Porter/Duff formula

Porter / Duff 의 operator 들은 아래 공식을 사용한다. operator 는 모두 아래 공식을 이용하고, s, d , b 에 어떤 값이 들어가느냐에 차이가 있다.
  • Asrc⋅[s]+Adest⋅[d]+Aboth⋅[b]

s, d , b 는 영역을 나타내는 변수라고 보면 된다.
  • source(s) : source 의 영역
  • destination(d) : destination 의 영역
  • both(b) : 겹쳐지는 영역


연산방법들, operators

겹쳐지는 부분

  • SRC_* : "겹쳐지는 부분에서 Source 의 색"을 사용한다.
  • DST_* : "겹쳐지는 부분에서 Dest 의 색"을 사용한다.
  • *_OUT/CLEAR/XOR : 이들은 "겹쳐지는 부분의 alpha 가 0" 이어서 아무런 색도 표현되지 않는다.

겹쳐지지 않는 부위

  • *_ATOP : *에 해당하는 녀석의 alpha 값이 0 + 그 반대에 해당하는 녀석은 자기 색을 갖는다.
  • *_IN : *에 해당하는 녀석의 alpha 값이 0 + 그 반대에 해당하는 녀석의 alpha 값도 0
  • *_OVER : 각자 자기색을 이용한다.
  • *_OUT : * 에 해당하는 녀석은 자기색 + 그 반대에 해당하는 녀석은 alpha 값이 0
  • SRC/DST: * 에 해당하는 녀석은 자기색 + 그 반대에 해당하는 녀석은 alpha 값이 0
예를 들어 DEST_ATOP 이라면, DEST 의 영역들의 alpha 값이 0 이 되는 것이다. 그런데 위에서 겹쳐지는 부분에 대한 정의는 따로 내렸기 때문에 겹쳐지지 않는 영역에 대해서만 적용된다.

이를 표로 나타내면 아래와 같다.

[s] [d] [b]
SRC s 0 s
SRC_ATOP 0 d s
SRC_IN 0 0 s
SRC_OVER s d s
SRC_OUT s d 0
DST 0 d d
DST_ATOP s 0 d
DST_IN 0 0 d
DST_OVER s d d
DST_OUT s d 0
CLEAR 0 0 0
XOR s d 0


일단 대충 여기까지로 이해는 됐을 것 같다. 좀 더 자세한 이야기는 ref. 2 , ref. 5 를 참고하면 된다.


Reference

  1. Fun with Android Shaders and Filters : 안드로이드의 shader/ filter 를 이용하는 법이 예제, 그림과 함께 나와 있다. 예제 소스는 demo sources 에 있다.
  2. Porter/Duff Compositing and Blend Modes – Søren Sandmann Pedersen : Porter/Duff 에 대한 설명이 잘 나와 있다.
  3. Xenomachina: Android's 2D Canvas Rendering Pipeline : 안드로이드의 2D rendering 순서(pipeline)을 다이어그램으로 보여준다.
  4. PorterDuff.Mode | Android Developers
  5. Alpha compositing - Wikipedia, the free encyclopedia



댓글 없음:

댓글 쓰기