Top Layer |
Bottom Layer |
일단 다음처럼 두개의 레이어를 만들고, 여러 효과를 넣어본다.
gimp 최신버전 코드를 깟는데 float로 계산한다.
가장 많이 쓰는 Screen 과 overlay 그리고 Multiply(곱)
Screen |
Overlay |
Multiply |
in이 top이고 layer가 바닥이다.
comp[c] = in[c] * layer[c];
0-1값으로 생각하면 쉽게 어두워짐을 알 수 있다. 이 다음부터는 그림만가지고 이야기한다.
그림은 많이 쓰이는 순서이지만 설명은 Multiply부터 하는 것이 쉽다.
comp[c] = 1.0f - (1.0f - in[c]) * (1.0f - layer[c]);
Screen은 반전 후 곱한 색상을 반전하는 것과 같다. 반대로 좀 더 밝아 짐을 볼 수 있다.
Overlay부터는 top layer와 bottom layer가 서로 동등하지 않다. 일단 normal모드 부터 동등하지 않으므로 이상한 것은 아니다.
if (in[c] < 0.5f)
val = 2.0f * in[c] * layer[c];
else
val = 1.0f - 2.0f * (1.0f - layer[c]) * (1.0f - in[c]);
아직 메뉴얼은 그대로지만 photoshop으로 대동단결 했다.
Hard light에서 복사해오자.
Top Layer를 흰색에서 회색, 회색에서 검정 두부분으로 나누어, 어두운곳은 Multiply효과를 밝은 곳은 Screen효과를 준다.
중간영역의 대비가 커진다. 그 결과 색상이 강해지고, 경계가 날카로와 진다.
다음은 LightenOnly와 DarkenOnly이다.
각값에서 밝은 값과 어두운 값을 취한다.
comp[c] = MAX (in[c], layer[c]);
comp[c] = MIN (in[c], layer[c]);
다음은 Burn과 Dodge이다.
Dodge |
comp[c] = safe_div (in[c], 1.0f - layer[c]);
Burn |
comp[c] = 1.0f - safe_div (1.0f - in[c], layer[c]);
다음은 조명 계통이다.
Hard light, soft light, vivid light pin light 등이다.
if (layer[c] > 0.5f)
{
val = (1.0f - in[c]) * (1.0f - (layer[c] - 0.5f) * 2.0f);
val = MIN (1.0f - val, 1.0f);
}
else
{
val = in[c] * (layer[c] * 2.0f);
val = MIN (val, 1.0f);
}
Overlay와 동등한 식이지만, 기준이 bottom layer이다. in <-->layer를 하면, 같다. xy축을 바꾸면 바로 알 수 있다. -->
Soft light |
이름과 달리 Hard light와는 별관련이 없다. Screen Mode와 매우 유사하다.
멏몇 버전의 GIMP에서는 Screen과 같다. ( 계속 다시 옜날로 가는 경우가 있나보다. )
스크린된 Pixel을 S라고 하자.
gfloat multiply = in[c] * layer[c];
gfloat screen = 1.0f - (1.0f - in[c]) * (1.0f - layer[c]);
gfloat val = (1.0f - in[c]) * multiply + in[c] * screen;
상위 픽셀에 따라, multiply와 screen을 얼마나 섞을지 정한다.
Vivid light |
if (layer[c] <= 0.5f)
{
val = 1.0f - safe_div (1.0f - in[c], 2.0f * layer[c]);
val = MAX (val, 0.0f);
}
else
{
val = safe_div (in[c], 2.0f * (1.0f - layer[c]));
val = MIN (val, 1.0f);
}
Overlay처럼 구간을 나누어, dodge와 burn을 적용한다.
Pin light |
이것은 lighten과 darken을 조합하는 것 같다.
if (layer[c] > 0.5f)
val = MAX(in[c], 2.0f * (layer[c] - 0.5f));
else
val = MIN(in[c], 2.0f * layer[c]);
Linear light |
if (layer[c] <= 0.5f)
val = in[c] + 2.0f * layer[c] - 1.0f;
else
val = in[c] + 2.0f * (layer[c] - 0.5f);
그렇다.더하기 .