GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie 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 modelami cieniowania oraz modelem barw RGB. 2. Zadanie projektowe: Napisać aplikację która: Dla zbioru danych wskazanego przez prowadzącego (Zestawy danych.rar >Zestaw 1 lub Zestaw 2 >nazwa zbioru) wykonać cieniowanie metodą gładką (cieniowanie Gouarda) i metodą płaską. W przypadku cieniowania Gouarda zastosować rozbudowaną paletę kolorów oraz uproszczoną (dwa kolory: niebieski-czerwony). W przypadku cieniowania płaskiego możliwość wyboru koloru. Dodatkową opcją nieobowiązkową jest możliwość włączenie i wyłączenie ditheringu. Przykładowy wynik działania aplikacji z zastosowaniem rozbudowanej palety kolorów jest przedstawiony na rysunku 1. Rys.1. Przykładowa mapa kolorów dla rozbudowanej palety kolorów.
Na stronie internetowej dostępny jest program demo.exe który umożliwia wczytanie danych testowych (Zestawy danych.rar >Zestaw 1 lub Zestaw 2 >nazwa zbioru) i porównanie efektu działania z projektowaną w ramach zajęć aplikacją. Struktura zbioru danych składa się z trzech kolumn: 0 0 1220.71 0 2.01613 1212.81 0 4.03226 1189.11 0 6.04839 1149.54 0 8.06452 1094.03 0 10.0806 1022.47 0 12.0968 934.765 0 14.1129 831.052 0 16.129 712.56 0 18.1452 584.283 0 20.1613 457.858 Pierwsza kolumna: współrzędne x punktów poszczególnych czworokątów (rys.2) Druga kolumna: współrzędne y punktów poszczególnych czworokątów (rys.2) Trzecia kolumna: wartość (zmienna typu float) przypisana do aktualnego punktu (rys.2)
Rys.2. Przykładowa wizualizacja punktów z zbioru danych. Ważne! Aplikacja powinna umożliwiać wczytanie dowolnego zbioru danych (Zestawy danych.rar >Zestaw 1 lub Zestaw 2 >nazwa zbioru) oraz mieć możliwość ustawienia modelu cieniowania czy też rozmiaru palety kolorów. APLIKACJA BĘDZIE ROZWIJANA NA KOLEJNYCH ZAJĘCIACH O KOLEJNE FUNKCJE I METODY. 3. OpenGL - przydatne funkcje i parametry: Barwa może być określana na dwa sposoby: a) w trybie bezpośrednim w którym kolor ustalamy przy pomocy funkcji z grupy glcolor. Wspominanie funkcje możemy podzielić na trzy grupy: funkcja trójargumentowa (podajemy składowe RGB), funkcja czteroargumentowa z dodatkową obsługą kanału alfa, funkcja która przyjmuje wskaźnik na tablicę ze składowymi koloru. void glcolor3d( GLdouble red, GLdouble green, GLdouble blue ) void glcolor3f( GLfloat red, GLfloat green, GLfloat blue ) void glcolor3i( GLint red, GLint green, GLint blue )
void glcolor4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ) void glcolor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) void glcolor4i( GLint red, GLint green, GLint blue, GLint alpha ) b) w trybie indeksowym kolor określony jest pojedynczą liczbą (indeksem) która zawiera informacje o składowych RGB. Model zarządzania mapą kolorów jest uzależniony od typu systemu, w którym pracuje program. OpenGL nie posiada żadnych mechanizmów pozwalających na zmianę zawartości mapy kolorów oraz zmiany jej rozmiarów. Początkowa wartość indeksu bieżącego koloru wynosi 1. void glindexd( GLdouble c ) void glindexf( GLfloat c ) void glindexi( GLint c ) Czyszczenie bufora koloru w trybie indeksowym wykonuje funkcja: void glclearindex( GLfloat c ) Parametr c określa indeks mapy kolorów (domyślna wartość indeksu = 0). Funkcja ta jest odpowiednikiem funkcji glclearcolor działającej w trybie bezpośrednim. Bufor koloru: Bufor koloru służy do przechowywania obrazu naszej renderowanej sceny. W OpenGL najczęściej stosuje sie dwa bufory koloru: przedni i tylny w celu eliminacji migotania obrazu. Nasza bieżąca scena znajduje się w przednim buforze i jest wyświetlana na ekranie, natomiast w tym samym czasie rysowana jest kolejna ramka sceny. Po zakończeniu rysowania, bufory są zamieniane i cały cykl jest powtarzany. Cieniowanie: Cieniowanie jest metodą polegającą na ustaleniu koloru poszczególnych pikseli wielokąta. W bibliotece OpenGL udostępnione są dwa modele cieniowania: cieniowanie płaskie oraz cieniowanie gładkie.
W przypadku cieniowania płaskiego wielokąt otrzymuje jeden kolor który zostaje określony dla ostatniego wierzchołka, natomiast cieniowanie gładkie wykorzystuje algorytm Gouarauda, który polega na liniowej interpolacji wartości składowych koloru określonych dla każdego wierzchołka wielokąta. Wybór rodzaju cieniowania umożliwia funkcja: void glshademodel( GLenum mode ) Parametr mode może przyjąć jedną z wartości: GL_FLAT - cieniowanie płaskie, GL_SMOOTH - cieniowanie gładkie. Dithering: Biblioteka OpenGL opisuje kolory za pomocą liczb zmiennoprzecinkowych. Końcowy efekt widoczny na ekranie zależy przede wszystkim od możliwości systemu okienkowego oraz karty graficznej. W przypadku, gdy w systemie dostępna jest niewielka ilość barw (np. 256), biblioteka OpenGL może symulować kolory metodą ditheringu. Algorytm ten umieszcza w pobliżu siebie różnokolorowe plamki (piksele) tak aby sprawiały wrażenie jednolitej barwy. Technika ta bywa określana także mianem rozpraszania, rozsiewania lub roztrząsania. Włączenie i wyłączenie ditheringu wymaga użycia funkcji glenable/gldisable z parametrem GL_DITHER. 4. Literatura: a) J.D.Foley, A. van Dam, S.K. Finer, J.F. Hughes, R.L. Phillips, Wprowadzenie do grafiki komputerowej". b) http://www.opengl.org 5. Co na następnych zajęciach: Konwersja i mieszanie kolorów.