[ Pobierz całość w formacie PDF ]
.1 i16.2).Domyœlnie, tymi argumentami s¹ odpowiednio funkcje GL_ONE i GL_ZERO, costa­nowi odpowiednik wy³¹czenia ³¹czenia kolorów wywo³aniemglDisable(GL_BLEND).Tabela 16.1.Funkcje ³¹czenia koloru Ÿród³owegoFunkcjaWspó³czynnik ³¹czenia koloruGL_ZEROGL_ONEGLJ)ST_COLORGL_ONE_MINUS_DST_COLORGL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHAGL_DST_ALPHAGL_ONE_MINUS _DST_ALPHA GL SRC ALPHA SATURATEKolor Ÿród³owy = O, O, O, 0.U¿ywa koloru Ÿród³owego.Kolor Ÿród³owy jest mno¿ony przez kolor piksela docelowego.Kolor Ÿród³o wy jest mno¿ony przez (l, l, l, l, l - kolor docelowy).Kolor Ÿród³owy jest mno¿ony przez Ÿród³ow¹ sk³adow¹ alfa.Kolor Ÿród³owy jest mno¿ony przez (l - Ÿród³owa sk³adowa alfa).Kolor Ÿród³owy jest mno¿ony przez docelow¹ sk³adow¹ alfa.Nieobs³ugiwane wMicrosoft OpenGL.Kolor Ÿród³owy jest mno¿ony przez (l - docelowa sk³adowa alfa).Nieobs³ugiwanew Microsoft OpenGL.Kolor Ÿród³owy jest mno¿ony przez mniejsz¹ z wartoœci: Ÿród³ow¹ sk³adow¹ alfa i(l - docelowa sk³adowa alfa).Nieobs³ugiwane w Microsoft OpenGL.Tabela 16.2.Funkcje ³¹czenia koloru docelowegoFunkcjaWspó³czynnik ³¹czenia koloruGL_ZEROGLJDNEGL_DST_COLORGL_ONE_MINUS_DST_COLORGL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHAGLJ)ST_ALPHAGL_ONE_MINUS _DST_ALPHA GL SRC ALPHA SATURATEKolor docelowy = O, O, O, 0.U¿ywa koloru docelowego.Kolor docelowy jest mno¿ony przez kolor piksela Ÿród³owego.Kolor docelowy jest mno¿ony przez (l, l, l, l, l - kolor Ÿród³owy).Kolor docelowy jest mno¿ony przez Ÿród³ow¹ sk³adow¹ alfa.Kolor docelowy jest mno¿ony przez (l - Ÿród³owa sk³adowa alfa).Kolor docelowy jest mno¿ony przez docelow¹ sk³adow¹ alfa.Nieobs³ugiwane wMicrosoft OpenGL.Kolor docelowy jest mno¿ony przez (l - docelowa sk³adowa alfa).Nieobs³ugiwanew Microsoft OpenGL.Kolor docelowy jest mno¿ony przez mniejsz¹ ze Ÿród³owej sk³adowej alfa i (l -docelowa sk³adowa alfa).Nieobs³ugiwane w Microsoft OpenGL.Rozdzia³ 16.» Efekty specjalne: przezroczystoœæ i mg³a_____________________507Efekt przezroczystoœci przez ³¹czenie kolorówPrzezroczystoœæ jest najbardziej typowym wykorzystaniem ³¹czenia kolorów,czêsto u¿ywanym w celu stworzenia szyb, butelek i innych przezroczystychtrójwymiarowych obiektów.Dziêki przezroczystoœci mo¿na tak¿e ³¹czyæ ze sob¹kilka obrazów lub te¿ osi¹gn¹æ efekt „miêkkiego pêdzla" w programachgraficznych.Oto funkcje ³¹czenia kolorów wywo³ywane we wszystkich tego typu programach:glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);Powy¿sza kombinacja powoduje pobranie koloru piksela Ÿród³owego iprzeskalowanie go zgodnie z wartoœci¹ sk³adowej alfa, a nastêpnie dodaniekoloru piksela docelowego przeskalowanego przez l minus wartoœæ sk³adowej alfa.Mówi¹c proœciej, funkcja ³¹­cz¹ca bierze u³amek bie¿¹cego koloru rysowania inak³ada go na piksel na ekranie.Sk³adowa alfa koloru mo¿e mieæ wartoœæ od O(ca³kowicie przezroczysty) do l (ca³ko­wicie nieprzezroczysty):Rd = Rs * As + Rd * (l - As)Gd = Gs * As + Gd * (l - As)Bd = Bs * As + Bd * (l - As)Poniewa¿ u¿ywana jest jedynie Ÿród³owa sk³adowa alfa, nie musisz posiadaæ kartyprze­chowuj¹cej w buforze koloru tak¿e bity kana³u alfa.To jest wa¿ne, gdy¿standardowa implementacja OpenGL Microsoftu nie obs³uguje kana³u alfa w buforzekoloru.Przy stosowaniu ³¹czenia kolorów nale¿y pamiêtaæ, ¿e testowanie buforag³êbokoœci mo¿e wp³yn¹æ na efekt, który chcesz osi¹gn¹æ.Aby mieæ pewnoœæ, ¿eprzezroczyste wielok¹ty i linie bêd¹ poprawnie narysowane, zawsze rysuj je odty³u do przodu.Rysunek 16.1.Przezroczysty imbryk do herbaty narysowany przy u¿yciu ³¹czenia kolorów508 ______________________ Czêœæ III » Tematy zaawansowane i efekty specjalneListing 16.1 przedstawia kod u¿yty do narysowania przezroczystego imbryka doherba­ty z rysunku 16.1.W funkcji draw_scene rysujemy dwa imbryki do herbaty,od ty³u do przodu, w celu zapewnienia, ¿e przedni imbryk bêdzie widzia³.Jakwidaæ, na ekranie pozostaj¹ ró¿ne artefakty (niepo¿¹dane efekty), w miejscach,gdzie przecinaj¹ siê wielok¹ty.Nie da siê ich kompletnie wyeliminowaæ, alemo¿na zredukowaæ ich iloœæ sortuj¹c wstêpnie wielok¹ty wed³ug ich g³êbokoœcioraz w³¹czaj¹c usuwanie odwróco­nych wielok¹tów funkcj¹glEnable(GL_CULL_FACE).Pierwsz¹ rzecz¹, jak¹ robimy w funkcji draw_scene, jest w³¹czenie mieszaniakolorów w celu osi¹gniêcia przezroczystoœci na podstawie wartoœci alfa kolorurysowania (Ÿród³owego):glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;Nastêpnie rysujemy nieprzezroczysty imbryk przy wy³¹czonym mieszaniu kolorów,tak abyœmy go zawsze widzieli:glDisable (GL_BLEND) ; glColor3f (1.0, 1.0, 0.0); auxSolidTeapot (1.0);Na koniec w³¹czamy mieszanie kolorów i rysujemy przezroczysty imbryk, zwartoœci¹ alfa (przezroczystoœci) wynosz¹c¹ 0,25:glEnable (GL_BLEND) ;glColor4f (1.0, 1.0, 1.0, 0.25);auxSolidTeapot (1.0);Listing 16.1.BLENDPOT.C: u¿ycie funkcji glBlendFunc \v celu stworzenia efektuprzezroczystoœci _____* "blendpot.c" - Testowy program demonstruj¹cy u¿ycie funkcji* • glBlendFunc () w celu osi¹gniêcia przezroczystoœci.VlincludeTe definicje zosta³y wprowadzone w celu zapewnienia zgodnoœci pomiêdzy MSWindows a reszt¹ œwiata.CALLBACK i APIENTRY to modyfikatory funkcji w MS Windows.#ifndef WIN32³ define CALLBACK# define APIENTRY ttendif /* 1WIN32 */GLfloat rotation = 0.0;/** 'reshape_scene () ' - Zmiana rozmiaru sceny.*/Rozdzia³ 16.* Efekty specjalne: przezroczystoœæ i mg³a____________________509void CALLBACKreshape_scene(GLsizei width, /* We - Szerokoœæ okna w pikselach */GLsizei height) /* We - Wysokoœæ okna w pikselach */ { /** Wyzerowanie bie¿¹cego widoku i przekszta³cenia perspektywicznego.*/giviewport(O, O, width, height);glMatrixMode(GL_PROJECTION);glLoadldentity();gluPerspective(22.5, (float)width / (float)height, 0.1, 1000.0);glMatrixMode(GL_MODELVIEW);/** 'draw_scene()' - Rysowanie sceny zawieraj¹cej dwa imbryki do* herbaty*/void CALLBACK draw_scene(void) {GLfloat frame;static float red_light[4] = ( 1.0, 0.0, 0.0, 1.0 };static float red_pos[4] = { 1.0, 1.0, 1.0, 0.0 };static float blue_light[4] = { 0.0, 0.0, 1.0, 1.0 };static float blue_pos[4] = { -1.0, -1.0, -1.0, 0.0 };/** W³¹czenie buforów i oœwietlenia*/glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHTO);glEnable(GL_LIGHTl);glShadeModel(GL_SMOOTH);/** Wyczyszczenie bufora koloru i g³êbokoœci.*/glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BOFFER_BIT);/** W scenie umieœciliœmy dwa œwiat³a.Pierwsze z nich jest czerwone* i zosta³o umieszczone u góry z prawej strony, za obserwatorem.* Drugie jest niebieskie i znajduje siê u do³u po lewej stronie,* przed obserwatorem.*/glLightfv(GL_LIGHTO, GL_DIFFUSE, red_light); glLightfv(GL_LIGHTO, GL_POSITION,red_pos);510_______________________Czêœæ III » Tematy zaawansowane l efekty specjalneglLightfv(GL_LIGHTl, GL_DIFFUSE, blue_light); glLightfv(GL_LIGHTl, GL_POSITION,blue_pos);glEnable(GL_COLOR_MATERIAL); g!BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glPushMatrix();glTranslatef(0.0, 0.0, -15.0); glRotatef(-rotation, 0.0, 1.0, 0.0);glDisable(GL_BLEND); glColor3f(1.0, 1.0, 0.0); auxSolidTeapot(1.0);glPopMatrix();glPushMatrix();glTranslatef(0.0, 0.0, -10.0); glRotatef(rotation, 0.0, 1.0, 0.0);glEnable(GL_BLEND); glColor4f(1.0, 1.0, 1.0, 0.25); auxSolidTeapot(1.0);glPopMatrix();auxSwapBuffers();/** ' rotate_objects ( ) ' - w wolnych chwilach obrót sceny.*/void CALLBACK rotate_objects (void) {rotation += 2.0;if (rotation >= 360.0) rotation -= 360.0;draw_scene ( ) ;/** 'mainf)1 - Inicjowanie okna i wyœwietlanie sceny do momentu* wciœniêcia klawisza 'Esc' [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • luska.pev.pl
  •