[컴] 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



댓글 1개:

  1. very well explained. I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Logistic Regression explained
    Correlation vs Covariance
    Simple Linear Regression
    Bag of Words Python
    KNN Algorithm

    답글삭제