GRAFIKA KOMPUTEROWA 8: Konwersja i mieszanie kolorów http://galaxy.agh.edu.pl/~mhojny Prowadzący: dr inż. Hojny Marcin Akademia Górniczo-Hutnicza Mickiewicza 30 30-059 Krakow pawilon B5/p.406 tel. (+48)12 617 46 37 e-mail: mhojny@metal.agh.edu.pl
1. Cel projektu: Zapoznanie się z podstawowymi technikami mieszania kolorów oraz konwersji modeli barw. 2. Zadanie projektowe: W oparciu o opracowaną aplikację w ramach poprzednich zajęć: a) dodać możliwość wyświetlenia mapy barw w oparciu o wybrany model mieszania b) opracować kalkulator konwersji modelu barw RGB->CMY, CMY->RGB 3. BLENDING Mieszanie kolorów lub też inaczej blending (alfa blending) polega na ustaleniu wynikowego koloru piksela będącego kombinacją koloru źródłowego (Rs, Gs, Bs, As ) oraz koloru przeznaczenia (Rd, Gd, Bd, Ad ) przechowywanego w buforze kolorów. Mieszanie kolorów wykorzystywane jest do uzyskania efektów przezroczystości, antyaliasingu czy też odbicia. Włączanie i wyłączanie mieszania kolorów Aktywacja mieszania (domyślnie wyłączona) kolorów wymaga wywołania funkcji glenable z parametrem GL_BLEND. Wywołanie funkcji gldisable aktywuje wyłączenie mieszania kolorów. Równanie mieszania kolorów Domyślnie kolor wynikowy (R, G, B, A) obliczany jest na podstawie równania mieszania kolorów: = + = + = + = +
Akademia Górniczo - Hutnicza gdzie (Sr, Sg, Sb, Sa ) i (Dr, Dg, Db, Da ) są odpowiednio współczynnikami mieszania dla koloru źródłowego i koloru przeznaczenia. Wartości składowych (R, G, B, A) koloru wynikowego zawężane są do przedziału [0, 1], stąd poprawna matematycznie forma zapisu powyższego równania: = (, + ) = (, + ) = (, + ) = (, + ) Wybór innego równania mieszania kolorów umożliwia funkcja: void glblendequation( GLenum mode ) której parametr mode może przyjąć jedną z poniższych wartości: GL_FUNC_ADD - domyślne równanie mieszania, GL_FUNC_SUBTRACT - równanie mieszania: = (, ) = (, ) = (, ) = (, ) GL_FUNC_REVERSE_SUBTRACT - równanie mieszania:
Akademia Górniczo - Hutnicza = (, ) = (, ) = (, ) = (, ) GL_MIN - równanie mieszania: = (, ) = (, ) = (, ) = (, ) GL_MAX - równanie mieszania: = (, ) = (, ) = (, ) = (, ) Współczynniki mieszania kolorów Powyższe równania mieszania korzystają ze współczynników mieszania kolorów dla koloru źródłowego (Sr, Sg, Sb, Sa ) oraz koloru przeznaczenia (Dr, Dg, Db, Da ). W celu określania wartości tych współczynników można wykorzystać podstawową funkcję w bibliotece OpenGL:
void glblendfunc( GLenum src, GLenum dst ) Parametry funkcji src oraz dst określają sposób obliczania współczynników mieszania kolorów: parametr współczynnik mieszania GL_ZERO (0, 0, 0, 0) GL_ONE (1, 1, 1, 1) GL_SRC_COLOR (Rs, Gs, Bs, As ) GL_ONE_MINUS_SRC_COLOR (1, 1, 1, 1) (Rs, Gs, Bs, As ) GL_DST_COLOR (Rd, Gd, Bd, Ad ) GL_ONE_MINUS_DST_COLOR (1, 1, 1, 1) (Rd, Gd, Bd, Ad ) GL_SRC_ALPHA (As, As, As, As ) GL_ONE_MINUS_SRC_ALPHA (1, 1, 1, 1) (As, As, As, As ) GL_DST_ALPHA (Ad, Ad, Ad, Ad ) GL_ONE_MINUS_DST_ALPHA (1, 1, 1, 1) (Ad, Ad, Ad, Ad ) GL_CONSTANT_COLOR (Rc, Gc, Bc, Ac) GL_ONE_MINUS_CONSTANT_COLOR (1, 1, 1, 1) (Rc, Gc, Bc, Ac) GL_CONSTANT_ALPHA (Ac, Ac, Ac, Ac) GL_ONE_MINUS_CONSTANT_ALPHA (1, 1, 1, 1) (Ac, Ac, Ac, Ac) GL_SRC_ALPHA_SATURATE (f, f, f, 1), f = min (As, 1 Ad )
Wartość początkowa dla parametru src wynosi GL_ONE a dla parametru dst wynosi GL_ZERO. Ostatnia stała GL_SRC_ALPHA_SATURATE może być stosowana wyłącznie jako wartość parametru src. Przykładowy fragment kodu: void Draw() { glclearcolor( 0.0, 1.0, 0.0, 1.0 ); // kolor tła - zawartość bufora koloru glclear( GL_COLOR_BUFFER_BIT ); // czyszczenie bufora koloru glenable( GL_BLEND ); // włączenie mieszania kolorów glblendfunc( GL_ONE, GL_ONE ); // współczynniki mieszania kolorów glblendequation( GL_FUNC_ADD ); // równanie GL_FUNC_ADD glblendequation( GL_MIN ); // równanie GL_MIN glblendequation( GL_MAX ); // równanie GL_MAX glblendequation( GL_FUNC_SUBTRACT ); // równanie GL_FUNC_SUBTRACT glblendequation( GL_FUNC_REVERSE_SUBTRACT ); // równanie GL_FUNC_REVERSE_SUBTRACT 4. KONWERSJA MODELI BARW RGB na CMY C = 1 - R M = 1 - G Y = 1 - B CMY na RGB R = 1 - C G = 1 - M B = 1 Y RGB na CMYK K = 1 - max{r, G, B} C = (1 - R - K) / (1 - K) M = (1 - G - K) / (1 - K) Y = (1 - B - K) / (1 - K) CMYK na RGB R = (1 - C) * (1 - K) G = (1 - M) * (1 - K) B = (1 - Y) * (1 - K) 5. Co na następnych zajęciach: Przeźroczystość.