OpenGL. Księga eksperta. Wydanie V

download OpenGL. Księga eksperta. Wydanie V

of 102

Transcript of OpenGL. Księga eksperta. Wydanie V

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    1/102

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    2/102

    Id do

    Spis treci

    Przykadowy rozdzia

    Skorowidz

    Katalog online

    Dodaj do koszyka

    Zamw cennik

    Zamw informacjeo nowociach

    Fragmenty ksiekonline

    Helion SAul. Kociuszki 1c44-100 Gliwicetel. 32 230 98 63e-mail: [email protected] Helion 19912011

    Katalog ksiek

    Twj koszyk

    Cennik i informacje

    Czytelnia

    Kontakt

    Zamw drukowanykatalog

    OpenGL. Ksiga eksperta.Wydanie VAutorzy:Richard S. Wright,Nicholas Haemel,

    Graham Sellers,Benjamin Lipchak

    Tumaczenie: ukasz Piwko

    ISBN: 978-83-246-2976-3

    Tytu oryginau:OpenGL SuperBible: Comprehensive

    Tutorial and Reference (5th Edition)

    Format: 172245, stron: 688

    Dowiedz si, jak tworzy zapierajce dech w piersiach gry 3D

    i efektowne, trjwymiarowe wizualizacje!

    Jak sprawnie tworzy podstawowe obiekty, owietla je i cieniowa?

    Jak napisa wasne programy, korzystajc z biblioteki OpenGL i jzyka GLSL?

    Jak programowa grak na urzdzenia przenone, takie jak iPhone, iPod czy iPad?

    Po prawie dwudziestu latach na rynku biblioteka OpenGL jest dzi wiodcym API w dziedzinie

    programowania graki trjwymiarowej, gier 3D, wizualizacji, symulacji, modelowania naukowego,a nawet edytowania obrazw i lmw dwuwymiarowych. Swj sukces zawdzicza nie tylko atwoci

    uycia, ale przede wszystkim kompatybilnoci z niemal wszystkimi platformami dostpnymi narynku. wietnie sprawdza si zarwno w komputerach PC z systemem Windows, jak i komputerachMac, a take na stacjach uniksowych, w centrach rozrywki opartych o lokalizacj, na najbardziej

    znanych konsolach do gier, w kieszonkowych grach elektronicznych, a nawet w oprzyrzdowaniu

    lotniczym czy samochodowym. Nie bez znaczenia dla spopularyzowania tej biblioteki by take

    fakt, e mona j rozszerza, dziki czemu ma ona wszystkie zalety otwartego standardu,

    a dodatkowo mona wzbogaca jej implementacj o wasne dodatki.

    OpenGL. Ksiga eksperta. Wydanie 5 to nowe, zaktualizowane (specykacja OpenGL 3.3) wydanie znanego podrcznika dla wszystkich programistw, bez wzgldu na poziom ich zaawansowania.

    Ksika ta stanowi wyczerpujcy kurs tworzenia niesamowitych wizualizacji 3D, gier oraz

    wszelkiego rodzaju grak. Dziki niej nauczysz si pisa programy wykorzystujce bibliotekOpenGL, kongurowa rodowisko pracy do przetwarzania graki trjwymiarowej oraz tworzy

    podstawowe obiekty, owietla je i cieniowa. Nastpnie zgbisz tajniki jzyka OpenGL Shading

    Language i zaczniesz sprawnie pisa wasne programy, wprowadza do nich rozmaite efekty

    wizualne oraz zwiksza ich wydajno. Poznasz wszystkie najnowsze techniki programowania

    przy uyciu biblioteki OpenGL, takie jak przeksztacenia, nakadanie tekstur, cieniowanie,

    zaawansowane bufory czy zarzdzanie geometri. Przejdziesz take szczegowy kurs

    programowania graki w urzdzeniach iPhone, iPod touch oraz iPad!

    Kompletny przewodnik po najpopularniejszej na wiecie bibliotece do

    programowania graki trjwymiarowej OpenGL 3.3!

    http://helion.pl/katalog.htmhttp://helion.pl/zakupy/add.cgi?id=opglk5http://helion.pl/cennik.htmhttp://helion.pl/emaile.cgihttp://helion.pl/emaile.cgihttp://helion.pl/online.htmhttp://helion.pl/online.htmmailto:[email protected]://helion.pl/zamow_katalog.htmhttp://helion.pl/zamow_katalog.htmhttp://helion.pl/autorzy/ricwri.htmhttp://helion.pl/autorzy/ricwri.htmhttp://helion.pl/autorzy/ricwri.htmhttp://helion.pl/autorzy/nichae.htmhttp://helion.pl/autorzy/nichae.htmhttp://helion.pl/autorzy/nichae.htmhttp://helion.pl/autorzy/grasel.htmhttp://helion.pl/autorzy/grasel.htmhttp://helion.pl/autorzy/benlip.htmhttp://helion.pl/autorzy/benlip.htmhttp://www.amazon.com/exec/obidos/ASIN/0321712617/helion-20http://www.amazon.com/exec/obidos/ASIN/0321712617/helion-20http://www.amazon.com/exec/obidos/ASIN/0321712617/helion-20http://helion.pl/autorzy/benlip.htmhttp://helion.pl/autorzy/grasel.htmhttp://helion.pl/autorzy/nichae.htmhttp://helion.pl/autorzy/ricwri.htmhttp://www.amazon.com/exec/obidos/ASIN/0321712617/helion-20http://www.amazon.com/exec/obidos/ASIN/0321712617/helion-20http://helion.pl/ksiazki/opglk5.htmmailto:[email protected]://helion.pl/online.htmhttp://helion.pl/cennik.htmhttp://helion.pl/emaile.cgihttp://helion.pl/zakupy/add.cgi?id=opglk5http://helion.pl/katalog.htmhttp://helion.pl/zamow_katalog.htmhttp://helion.pl/
  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    3/102

    Spis treci

    Podzikowania ............................................................................................ 17

    O autorach .................................................................................................... 21

    Wstp do wydania pitego ......................................................................... 23

    Wstp do wydania czwartego .................................................................... 25

    Wstp do wydania trzeciego ...................................................................... 29

    Wprowadzenie ............................................................................................. 31Co nowego w tym wydaniu ........................................................................................................ 31Struktura ksiki .......................................................................................................................... 32

    Cz I: Podstawy ................................................................................................................. 32Cz II: Techniki rednio zaawansowane i zaawansowane .......................................... 34Cz III: OpenGL na rnych platformach .................................................................... 34

    Konwencje typograficzne ........................................................................................................... 35Witryna internetowa ............................................................................................................ 35

    Cz I Podstawy ................................................................................. 37

    Rozdzia 1. Wprowadzenie do grafiki trjwymiarowej i biblioteki OpenGL ............. 39Historia grafiki komputerowej w skrcie ................................................................................ 40

    Elektryczno ........................................................................................................................ 40Wejcie w trzeci wymiar ...................................................................................................... 41

    Podstawowe efekty trjwymiarowe i najwaniejsze pojcia ................................................. 44Przeksztacanie i rzutowanie ............................................................................................... 44Rasteryzacja ........................................................................................................................... 45Cieniowanie ........................................................................................................................... 45Teksturowanie ....................................................................................................................... 46Mieszanie kolorw ............................................................................................................... 47czenie punktw ................................................................................................................. 47

    Typowe zastosowania grafiki trjwymiarowej ........................................................................ 47Trzy wymiary w czasie rzeczywistym ................................................................................ 47Trzy wymiary bez czasu rzeczywistego ............................................................................. 48Programy do cieniowania ................................................................................................... 50

    Podstawowe zasady programowania grafiki trjwymiarowej .............................................. 52To nie jest zestaw narzdzi .................................................................................................. 52Ukady wsprzdnych ........................................................................................................ 52Rzutowanie z trzech w dwa wymiary ................................................................................ 56

    Podsumowanie ............................................................................................................................. 58

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    4/102

    8

    Spis treci

    Rozdzia 2. Rozpoczynanie pracy .................................................................................. 61Czym jest OpenGL ...................................................................................................................... 62

    Ewolucja standardu .............................................................................................................. 63

    Mechanizm rozszerze ............................................................................................................... 64Czyje to rozszerzenie ............................................................................................................ 66

    Korzystanie z biblioteki OpenGL .............................................................................................. 71Narzdzia pomocnicze ......................................................................................................... 72Biblioteka GLUT ................................................................................................................... 72Biblioteka GLEW .................................................................................................................. 73Biblioteka GLTools ............................................................................................................... 73

    Szczegy interfejsu ..................................................................................................................... 74Typy danych .......................................................................................................................... 74

    Bdy OpenGL ............................................................................................................................. 76Sprawdzanie wersji ...................................................................................................................... 77Pobieranie wskazwek z funkcji glHint ................................................................................... 77Maszyna stanw OpenGL .......................................................................................................... 78

    Konfigurowanie rodowiska programistycznego w systemie Windows ...................... 79Dodawanie cieek ............................................................................................................... 79Tworzenie projektu .............................................................................................................. 81Dodawanie wasnych plikw .............................................................................................. 82

    Konfigurowanie rodowiska programistycznego w systemie Mac OS X ............................ 84Niestandardowe ustawienia kompilacji ............................................................................ 85Tworzenie nowego projektu ............................................................................................... 85Szkielety, nagwki i biblioteki ........................................................................................... 87

    Nasz pierwszy trjkt ........................................................................................................... 90Ukad wsprzdnych .......................................................................................................... 95Konfigurowanie ustawie ................................................................................................... 98Zabieramy si do pracy ...................................................................................................... 100

    Oywianie sceny ........................................................................................................................ 101Klawisze specjalne ..............................................................................................................101Odwieanie ekranu ...........................................................................................................103

    Prosta animacja .......................................................................................................................... 103Podsumowanie ...........................................................................................................................104

    Rozdzia 3. Podstawy renderowania ........................................................................... 105

    Rysowanie punktw w trzech wymiarach ............................................................................. 106Podstawowy potok graficzny ................................................................................................... 106

    Klient-serwer ....................................................................................................................... 107Programy do cieniowania ................................................................................................. 108

    Konfigurowanie ukadu wsprzdnych ................................................................................ 110Rzutowanie ortogonalne ................................................................................................... 111Rzutowanie perspektywiczne ............................................................................................ 112

    Standardowe programy do cieniowania ................................................................................ 112Atrybuty ...............................................................................................................................113Zmienne typu uniform ...................................................................................................... 113

    czenie punktw ...................................................................................................................... 115Punkty i linie ....................................................................................................................... 116

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    5/102

    9

    Spis treci

    Rysowanie trjktw w trzech wymiarach .....................................................................120Nawinicie ...........................................................................................................................121

    Prosty kontener porcji danych ................................................................................................ 124

    Niechciana geometria ........................................................................................................ 126Przesuwanie wieloktw .................................................................................................... 131Wycinanie noycami .......................................................................................................... 134

    Mieszanie kolorw .................................................................................................................... 135czenie kolorw ................................................................................................................ 136Zmiana rwnania mieszania .............................................................................................139Wygadzanie ........................................................................................................................ 140

    Podsumowanie ...........................................................................................................................145

    Rozdzia 4. Podstawy przeksztace geometrycznych.

    Najwaniejsze informacje o wektorach i macierzach ............................ 147Czy to jest ten straszny rozdzia z matematyk? ................................................................... 148Szybki kurs matematyki ........................................................................................................... 149

    Wektory, czyli w ktrym kierunku .................................................................................. 149Macierz ................................................................................................................................. 152

    Przeksztacenia ...........................................................................................................................154Wsprzdne oka ................................................................................................................ 154Przeksztacenia punktu widzenia ..................................................................................... 155Przeksztacenia modelowania ........................................................................................... 156Dwoisto model-widok .................................................................................................... 157Przeksztacenia rzutowania ...............................................................................................158

    Przeksztacenia widoku ..................................................................................................... 159Macierz model-widok ............................................................................................................... 160Konstruowanie macierzy ................................................................................................... 160czenie przeksztace .......................................................................................................164Stosowanie macierzy model-widok ................................................................................. 165

    Wicej obiektw ........................................................................................................................ 167Klasa zestaww trjktw .................................................................................................167

    Macierz rzutowania ................................................................................................................... 171Rzutowanie prostopade .................................................................................................... 171Rzutowanie perspektywiczne ............................................................................................ 172Macierz rzutowania model-widok ................................................................................... 174

    Potok przeksztace ...........................................................................................................178Stos macierzy ....................................................................................................................... 179Modyfikowanie potoku ..................................................................................................... 180Wersja wzbogacona ............................................................................................................184

    Poruszanie si przy uyciu kamer i aktorw .........................................................................185Ukad odniesienia aktora ................................................................................................... 186Kty Eulera. Uyj ukadu odniesienia, Luke! .............................................................. 187Obsuga kamery .................................................................................................................. 188Dodawanie aktorw ........................................................................................................... 191Owietlenie .......................................................................................................................... 192

    Podsumowanie ...........................................................................................................................193

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    6/102

    10

    Spis treci

    Rozdzia 5. Tekstury podstawy ............................................................................... 195Surowe dane obrazw ............................................................................................................... 196

    Pakowanie pikseli ............................................................................................................... 196

    Piksmapy ..............................................................................................................................199Upakowane formaty pikseli ..............................................................................................200Zapisywanie pikseli ............................................................................................................203Wczytywanie pikseli ...........................................................................................................205

    adowanie tekstur ..................................................................................................................... 208Wykorzystywanie bufora kolorw ................................................................................... 209Aktualizowanie tekstur ...................................................................................................... 210Obiekty tekstur ................................................................................................................... 211

    Nakadanie tekstur .................................................................................................................... 212Wsprzdne tekstury ........................................................................................................ 212Parametry tekstur ............................................................................................................... 214Praktyczne zastosowanie poznanych wiadomoci ........................................................217

    Mipmapy ..................................................................................................................................... 222Filtrowanie mipmap ........................................................................................................... 223Generowanie poziomw mipmap .................................................................................... 225Zastosowanie mipmap .......................................................................................................225

    Filtrowanie anizotropowe ........................................................................................................ 233Kompresja tekstur ..................................................................................................................... 235

    Kompresowanie tekstur ..................................................................................................... 236adowanie tekstur skompresowanych ............................................................................238Ostatni przykad ................................................................................................................. 239

    Podsumowanie ...........................................................................................................................240

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania ................. 241GLSL 101 ..................................................................................................................................... 242

    Zmienne i typy danych ...................................................................................................... 243Kwalifikatory zmiennych .................................................................................................. 246Prawdziwy shader ...............................................................................................................248Kompilowanie, wizanie i konsolidowanie .................................................................... 252Praktyczne wykorzystanie shadera .................................................................................. 258Wierzchoek prowokujcy ................................................................................................ 259

    Dane uniform shadera ..............................................................................................................259

    Znajdowanie danych uniform .......................................................................................... 260Zmienne uniform skalarne i wektorowe .........................................................................260Tablice uniform .................................................................................................................. 261Macierze uniform ............................................................................................................... 262Paski shader ........................................................................................................................ 262

    Funkcje standardowe ................................................................................................................ 265Funkcje trygonometryczne ...............................................................................................265Funkcje wykadnicze .......................................................................................................... 266Funkcje geometryczne ....................................................................................................... 267Funkcje macierzowe ...........................................................................................................267Funkcje porwnywania wektorw ................................................................................... 267Inne czsto uywane funkcje ............................................................................................ 267

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    7/102

    11

    Spis treci

    Symulowanie wiata ................................................................................................................. 272wiato rozproszone ...........................................................................................................272Shader wiata rozproszonego .......................................................................................... 274

    Model owietlenia ADS ..................................................................................................... 278Cieniowanie Phonga ..........................................................................................................281

    Korzystanie z tekstur ................................................................................................................. 285Nic, tylko teksele ................................................................................................................. 285Owietlanie tekseli .............................................................................................................. 287Anulowanie przetwarzania fragmentw .........................................................................289Teksturowanie w stylu kreskwkowym teksele w roli wiata ................................ 292

    Podsumowanie ...........................................................................................................................294

    Rozdzia 7. Tekstury techniki zaawansowane ....................................................... 295Tekstury prostoktne ................................................................................................................ 296

    Wczytywanie tekstury prostoktnej ................................................................................ 297Zastosowanie tekstur prostoktnych ............................................................................... 297

    Tekstury szecienne ................................................................................................................... 300Wczytywanie tekstur szeciennych .................................................................................. 301Tworzenie puda nieba ...................................................................................................... 302Tworzenie efektu odbicia .................................................................................................. 304

    Multiteksturowanie ................................................................................................................... 305Wiele wsprzdnych tekstur ........................................................................................... 306Przykad multiteksturowania ............................................................................................306

    Teksturowanie punktw ...........................................................................................................309

    Teksturowanie punktw .................................................................................................... 309Rozmiar punktw ...............................................................................................................310Podsumowanie wiadomoci ............................................................................................. 311Parametry punktw ............................................................................................................314Nadawanie punktom ksztatw ........................................................................................ 314Obracanie punktw ............................................................................................................315

    Tablice tekstur ............................................................................................................................317adowanie tablicy tekstur dwuwymiarowych ................................................................ 317Indeksowanie tablicy tekstur ............................................................................................319Uzyskiwanie dostpu do tablic tekstur ............................................................................ 320

    Tekstury zastpcze ..................................................................................................................... 320

    Podsumowanie ...........................................................................................................................322

    Cz II Techniki rednio zaawansowane i zaawansowane ...........323

    Rozdzia 8. Buforowanie od tej pory przechowywanie danychzaley od Ciebie ......................................................................................... 325Bufory ..........................................................................................................................................326

    Tworzenie wasnych buforw ...........................................................................................327Napenianie buforw ......................................................................................................... 328Obiekty bufora pikseli ........................................................................................................ 329

    Tekstury buforowe .............................................................................................................336

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    8/102

    12

    Spis treci

    Obiekt bufora obrazu, czyli opuszczamy okno ..................................................................... 338Sposb uycia FBO ............................................................................................................. 339Obiekt bufora renderowania .............................................................................................339

    Bufory rysowania ................................................................................................................ 341Kompletno bufora obrazu .............................................................................................344Kopiowanie danych w buforach obrazu ......................................................................... 347Praktyczny przykad wykorzystania buforw FBO ....................................................... 348

    Renderowanie do tekstur .........................................................................................................353Podsumowanie ...........................................................................................................................358

    Rozdzia 9. Buforowanie techniki zaawansowane ................................................ 359Uzyskiwanie dostpu do danych .............................................................................................360

    Mapowanie buforw ..........................................................................................................360Kopiowanie buforw .......................................................................................................... 361

    Wysyanie danych z shadera pikseli i odwzorowywanie fragmentw wyjciowych ....... 362Nowe formaty dla nowej generacji urzdze ........................................................................364

    Precyzyjne formaty zmiennoprzecinkowe ...................................................................... 365Wieloprbkowanie .............................................................................................................379Liczby cakowite .................................................................................................................. 383sRGB ..................................................................................................................................... 384Kompresja tekstur .............................................................................................................. 386

    Podsumowanie ...........................................................................................................................388

    Rozdzia 10. Operacje na fragmentach koniec potoku ........................................... 389

    Okrawanie przycinanie geometrii na wymiar .................................................................. 390Wieloprbkowanie .................................................................................................................... 391

    Powierzchnia pokrycia prbki .......................................................................................... 391Maska prbki ....................................................................................................................... 392Podsumowanie dotychczasowych wiadomoci ............................................................. 393

    Operacje na szablonach ............................................................................................................397Testowanie gbi ........................................................................................................................ 400

    Ograniczanie wartoci gbi ..............................................................................................400Mieszanie kolorw .................................................................................................................... 400

    Rwnanie mieszania ........................................................................................................... 401Funkcja mieszania .............................................................................................................. 401

    Zebranie wiadomoci .........................................................................................................403Rozsiewanie kolorw ................................................................................................................ 404Operacje logiczne ...................................................................................................................... 405Maskowanie wyniku ................................................................................................................. 405

    Maskowanie koloru ............................................................................................................406Maskowanie gbi ............................................................................................................... 406Maskowanie buforw szablonu ........................................................................................ 407Zastosowanie masek ........................................................................................................... 407

    Podsumowanie ...........................................................................................................................407

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    9/102

    13

    Spis treci

    Rozdzia 11. Programy cieniujce techniki zaawansowane ................................... 409Zaawansowane shadery wierzchokw .................................................................................. 410

    Fizyczne symulacje w shaderze wierzchokw ............................................................... 410

    Shadery geometrii ...................................................................................................................... 417Shader geometrii przepuszczajcy dane .......................................................................... 417Zastosowanie shadera geometrii w programie ............................................................... 419Usuwanie geometrii w shaderach geometrii .................................................................. 423Modyfikowanie geometrii w shaderze geometrii ..........................................................426Generowanie geometrii w shaderze geometrii ............................................................... 427Zmienianie typu obiektu podstawowego w shaderze geometrii ................................. 431Nowe typy obiektw podstawowych w shaderach geometrii ......................................433

    Zaawansowane shadery fragmentw ...................................................................................... 436Przetwarzanie kocowe w shaderze fragmentw korekcja kolorw .....................438Przetwarzanie kocowe splot ...................................................................................... 439Generowanie danych obrazu w shaderze fragmentw ................................................. 442Ignorowanie zada w shaderze fragmentw .................................................................. 445Kontrolowanie gbi poszczeglnych fragmentw ........................................................ 447

    Inne zaawansowane funkcje shaderw .................................................................................. 448Interpolacja i kwalifikatory pamici ................................................................................ 448Inne zaawansowane funkcje wbudowane .......................................................................452

    Obiekty bufora bloku zmiennych jednorodnych ................................................................. 454Tworzenie blokw zmiennych jednorodnych ................................................................ 455

    Podsumowanie ...........................................................................................................................464

    Rozdzia 12. Zarzdzanie geometri techniki zaawansowane .............................. 465Zbieranie informacji o potoku OpenGL zapytania .........................................................466Przygotowywanie zapytania ..............................................................................................467Wysyanie zapytania ..........................................................................................................468Pobieranie wynikw zapytania .........................................................................................468Wykorzystanie wyniku zapytania .................................................................................... 469Zmuszanie OpenGL do podejmowania decyzji .............................................................472Mierzenie czasu wykonywania polece .......................................................................... 475

    Przechowywanie danych w pamici GPU .............................................................................477Przechowywanie danych w buforach danych wierzchokw ....................................... 478Przechowywanie w buforach indeksw wierzchokw ................................................. 482

    Organizowanie buforw przy uyciu obiektw tablic wierzchokw ................................483Optymalne rysowanie duych iloci geometrii .....................................................................486

    czenie funkcji rysujcych .............................................................................................. 486czenie geometrii poprzez restart obiektw podstawowych .....................................487Rysowanie wielu egzemplarzy jednego obiektu .............................................................489Automatyczne pobieranie danych ................................................................................... 495

    Przechowywanie przeksztaconych wierzchokw przeksztacenie zwrotne .............. 500Przeksztacenie zwrotne .................................................................................................... 501Wyczanie rasteryzacji ..................................................................................................... 506Liczenie wierzchokw przy uyciu zapyta obiektw podstawowych ...................... 507Wykorzystanie wynikw zapytania obiektw podstawowych .....................................508Przykad zastosowania przeksztacenia zwrotnego ....................................................... 509

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    10/102

    14

    Spis treci

    Przycinanie i rysowanie tego, co si chce ...............................................................................518Definiowanie wasnych paszczyzn obcinania ............................................................... 519

    Synchronizacja rysowania ........................................................................................................ 523

    Podsumowanie ...........................................................................................................................527

    Cz III OpenGL na rnych platformach ........................................529

    Rozdzia 13. OpenGL w systemie Windows .................................................................. 531Implementacje OpenGL w systemie Windows .....................................................................532

    OpenGL firmy Microsoft .................................................................................................. 533Nowoczesne sterowniki graficzne .................................................................................... 533Rozszerzenia OpenGL ....................................................................................................... 534Rozszerzenia WGL ............................................................................................................. 536

    Podstawy renderowania w systemie Windows .....................................................................537Konteksty urzdzenia GDI ................................................................................................538Formaty pikseli ................................................................................................................... 539Kontekst renderingu OpenGL .......................................................................................... 547

    Konsolidacja wiadomoci .........................................................................................................550Tworzenie okna .................................................................................................................. 550Rendering penoekranowy ................................................................................................ 555

    Podwjne buforowanie .............................................................................................................556Zapobieganie poszarpaniu obrazu ................................................................................... 557

    Podsumowanie ...........................................................................................................................557

    Rozdzia 14. OpenGL w systemie Mac OS X .................................................................. 559Cztery twarze OpenGL w systemie Mac ................................................................................ 560Biblioteka OpenGL i interfejs Cocoa ...................................................................................... 561

    Tworzenie programu Cocoa .............................................................................................561Skadanie wszystkiego razem ............................................................................................566Buforowanie pojedyncze czy podwjne ..........................................................................568Program SphereWorld .......................................................................................................569

    Renderowanie penoekranowe ................................................................................................573Renderowanie penoekranowe w Cocoa .........................................................................574

    CGL .............................................................................................................................................581Synchronizacja szybkoci klatek ....................................................................................... 581Przyspieszanie operacji wypeniania ............................................................................... 582Wielowtkowo w OpenGL ............................................................................................583

    Podsumowanie ...........................................................................................................................583

    Rozdzia 15. OpenGL w Linuksie .................................................................................... 585Wiadomoci podstawowe ........................................................................................................ 586

    Rys historyczny ................................................................................................................... 586Co to jest X ..........................................................................................................................586

    Zaczynamy .................................................................................................................................. 587Sprawdzanie obsugi OpenGL .......................................................................................... 587

    Konfiguracja Mesy .............................................................................................................588Konfiguracja sterownikw sprztowych .........................................................................589

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    11/102

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    12/102

    Rozdzia 6.Mylenie niekonwencjonalne programy do cieniowania

    Autor: Richard S. Wright, Jr

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    13/102

    242

    Cz I Podstawy

    Po raz pierwszy ze shaderami spotkalimy si w rozdziale 3., w ktrym opisane zostay podsta-wowe techniki renderowania. Osoby, ktre ten rozdzia pominy, aby od razu przej do pisaniashaderw, powinny w razie potrzeby do niego wrci i dokadnie zapozna si z atrybutamii danymi typu uniformoraz sposobami ich przekazywania do shadera z kodu klienckiego.W tamtym rozdziale w krgu naszych zainteresowa bya wycznie strona kliencka. Uylimy teniektrych standardowych shaderw oraz kilku typowych funkcji i procedur renderujcych. Napocztku tego rozdziau mona bdzie pogbi sw wiedz na temat pracy po stronie klienckiej,a nastpnie pokaemy, jak pisa wasne shadery, czyli serwerow cz procesu renderowania.W tym celu naley zapozna si z jzykiem do pisania programw do cieniowania, czyli shaderw.

    GLSL 101OpenGL Shading Language (GLSL) to wysokopoziomowy jzyk programowania podobny do

    jzyka C. Napisane w nim programy podlegaj kompilacji i konsolidacji przez implementacjOpenGL i najczciej w caoci dziaaj na sprzcie graficznym. Kod shaderw wyglda podob-nie do programw w jzyku C. Ich wykonywanie zaczyna si od funkcji mainoraz mona w nichpisa funkcje pobierajce argumenty i zwracajce wartoci. Poniszy rysunek 6.1 to kopiarysunku 3.1 z rozdziau 3., przedstawiajca podstawowe cechy architektury shadera.

    Jak wynika z powyszego schematu, zawsze potrzebne bd nam przynajmniej dwa shadery

    wierzchokw i fragmentw. Trzeci rodzaj shadera, ktry rwnie moe by potrzebny, to tzw.shader geometrii, ale jego szczegowy opis odoymy do rozdziau 11. Programy cieniujce techniki zaawansowane. Dane do shadera wierzchokw mona przesya na trzy sposoby

    jako atrybuty, czyli elementy danych dotyczce poszczeglnych wierzchokw; dane rodzajuuniform, ktre s takie same dla caej porcji danych wierzchokowych; oraz jako tekstury, o kt-rych szerzej pisalimy w rozdziale 5. Dane uniformi teksturowe mona take przesya do sha-dera fragmentw. Nie ma natomiast sensu wysya do tego shadera atrybutw wierzchokw,poniewa suy on tylko do wypeniania fragmentw (pikseli) po rasteryzacji danego obiektupodstawowego. Dane wierzchokowe mog natomiast by przesyane do shadera fragmentwprzez program wierzchokowy. Wwczas jednak dane takie mog by stae (kady fragment

    dysponuje tak sam wartoci) lub wartoci mog by interpolowane na rne sposoby napowierzchni obiektu.

    Kod shaderw jest bardzo podobny do kodu programw w jzyku C. Wykonywanie zaczyna siod funkcji main, obowizuj takie same konwencje stosowania komentarzy i taki sam zestawznakw oraz uywa si wielu takich samych dyrektyw preprocesora. Pen specyfikacj jzykamona znale w dokumencie OpenGL Shading Language Specification. Wskazwki, jak znalet specyfikacj, zamieszczono w dodatku A. S tam wymienione przydatne adresy internetoweoraz inne wartociowe rda i kursy uzupeniajce. Przyjmujemy zaoenie, e znasz ju jzykiC i C++, i dlatego bdziemy opisywa jzyk GLSL z perspektywy programisty tych jzykw.

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    14/102

    243

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Rysunek 6.1.

    Schemat architekturyshadera

    Zmienne i typy danych

    Nauk jzyka GLSL dobrze jest rozpocz od zapoznania si z dostpnymi w nim typami

    danych. S cztery typy: liczby cakowite (ze znakiem i bez znaku), liczby zmiennoprzecinkowe (odOpenGL 3.3 tylko pojedynczej precyzji) oraz wartoci logiczne (bool). W GLSL nie ma wska-nikw ani typw acuchowych i znakowych. Funkcje mog zwraca wartoci dowolnegoz dostpnych typw lub nie zwraca nic, jeli zostan zadeklarowane jako void, ale niedozwo-lone jest stosowanie wskanikw void. Sposb uycia typw danych GLSL jest podobny do spo-sobu ich uycia w jzykach C i C++.

    bool bDone = false; // Warto logiczna: true lub false

    int iValue = 42; // Liczba cakowita ze znakiem

    uint uiValue = 3929u; // Liczba cakowita bez znaku

    float fValue = 42.0f; // Warto zmiennoprzecinkowa

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    15/102

    244

    Cz I Podstawy

    Typy wektoroweJedn z najbardziej interesujcych rzeczy dostpnych w GLSL, a ktrej nie ma w C i C++, s

    wektorowe typy danych. Wartoci kadego z czterech podstawowych typw danych mona prze-chowywa w dwu-, trzy- lub czterowymiarowych wektorach. Pen list wektorowych typwdanych przedstawia tabela 6.1.

    Tabela 6.1. Wektorowe typy danych jzyka GLSL

    Typ Opis

    vec2, vec3, vec4 Dwu-, trzy- i czteroskadnikowy wektor wartoci zmiennoprzecinkowych

    ivec2, ivec3, ivec4 Dwu-, trzy- i czteroskadnikowy wektor wartoci cakowitoliczbowych

    uvec2, uvec3, uvec4 Dwu-, trzy- i czteroskadnikowy wektor wartoci cakowitoliczbowych bez znaku

    bvec2, bvec3, bvec4 Dwu-, trzy- i czteroskadnikowy wektor wartoci logicznych

    Zmienne typu wektorowego deklaruje si tak samo, jak wszystkie inne rodzaje zmiennych.Ponisza instrukcja deklaruje pooenie wierzchoka w postaci czteroskadnikowego wektora war-toci zmiennoprzecinkowych:

    vec4 vVertexPos;

    Wektor mona take zainicjalizowa przy uyciu konstruktora:

    vec4 vVertexPos = vec4(39.0f, 10.0f, 0.0f, 1.0f);

    Nie naley jednak tego sposobu inicjalizacji myli z konstruktorem klasy w jzyku C++. Wekto-rowe typy danych w jzyku GLSL nie s klasami, lecz typami wbudowanymi. Wektory monaprzypisywa jeden do drugiego, dodawa, skalowa przez wartoci skalarne (nie wektorowe) itd.

    vVertexPos = vOldPos + vOffset;

    vVertexPos = vNewPos;

    vVertexPos += vec4(1.0f, 1.0f, 0.0f, 0.0f);

    vVertexPos *= 5.0f;

    Kolejn niezwyk cech jzyka GLSL jest sposb odwoywania si do poszczeglnych elemen-

    tw wektora. Jeli wiesz, co to takiego konstrukcja unionw jzyku C++, wektory moesz sobiewyobrazi jako unie na steroidach. W celu odwoania si do elementw wektora mona uykropki albo dowolnego z trzech zestaww identyfikatorw: xyzw, rgbaoraz stpq. Podczas pracyz typami wektorowymi najczciej uywamy identyfikatorw xyzw.

    vVertexPos.x = 3.0f;

    vVertexPos.xy = vec2(3.0f, 5.0f);

    vVertexPos.xyz = vNewPos.xyz;

    Podczas pracy z kolorami korzystamy z identyfikatorw rgba.

    vOutputColor.r = 1.0f;

    vOutputColor.rgba = vec4(1.0f, 1.0f, 0.5f, 1.0f);

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    16/102

    245

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Identyfikatorw stpquywany w pracy ze wsprzdnymi tekstur.

    vTexCoord.st = vec2(1.0f, 0.0f);

    Dla jzyka GLSL nie ma znaczenia, ktrego zestawu identyfikatorw uyjemy, tzn. nie ma ad-nego bdu w poniszej instrukcji:

    vTexCoord.st = vVertex.st;

    Nie mona natomiast miesza rnych zestaww w jednej operacji dostpu do wektora:

    vTexCoord.st = vVertex.xt; // Nie mona uy jednoczenie x i t!

    Wektorowe typy danych obsuguj rwnie technik transformacji o nazwie swizzling. Polegaona na zamianie miejscami dwch lub wikszej liczby elementw wektora. Moe si to np. przy-

    da do zamiany danych kolorw w formacie RGB na BGR:

    vNewColor.bgra = vOldColor.rgba;

    Wektorowe typy danych s typami rodzimymi nie tylko jzyka GLSL, lecz rwnie sprztu. Sszybkie, a operacje wykonywane s na wszystkich czterech skadnikach naraz. Na przykad poni-sza operacja:

    vVertex.x = vOtherVertex.x + 5.0f;

    vVertex.y = vOtherVertex.y + 4.0f;

    vVertex.z = vOtherVertex.z + 1.0f;

    zostaaby wykonana znacznie szybciej, gdyby uyto rodzimej notacji wektorowej:vVertex.xyz = vOtherVertex.xyz + vec3(5.0f, 4.0f, 1.0f);

    Typy macierzoweOprcz typw wektorowych, jzyk GLSL obsuguje kilka typw macierzowych. Jednak w przeci-wiestwie do tych pierwszych, typy macierzowe obsuguj tylko wartoci zmiennoprzecinkowe. Niemona tworzy macierzy wartoci typu cakowitoliczbowego ani logicznych, poniewa nie majone praktycznego zastosowania. W tabeli 6.2 znajduje si lista dostpnych typw macierzowych.

    Macierz w jzyku GLSL to w istocie tablica wektorw kolumnowych (moe warto sobie w tymmomencie powtrzy wiadomoci o porzdku kolumnowym macierzy z rozdziau 4. Podstawyprzeksztace geometrycznych. Najwaniejsze informacje o wektorach i macierzach). Aby naprzykad ustawi ostatni kolumn macierzy 44, mona zastosowa nastpujcy kod:

    mModelView[3] = vec4(0.0f, 0.0f, 0.0f, 1.0f);

    Aby pobra ostatni kolumn macierzy:

    vec4 vTranslation = mModelView[3];

    Jeszcze precyzyjniejsze zapytanie:

    vec3 vTranslation = mModelView[3].xyz;

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    17/102

    246

    Cz I Podstawy

    Tabela 6.2. Typy macierzowe jzyka GLSL

    Typ Opis

    mat2, mat2x2 Dwie kolumny i dwa wiersze

    mat3, mat3x3 Trzy kolumny i trzy wiersze

    mat4, mat4x4 Cztery kolumny i cztery wiersze

    mat2x3 Dwie kolumny i trzy wiersze

    mat2x4 Dwie kolumny i cztery wiersze

    mat3x2 Trzy kolumny i dwa wiersze

    mat3x4 Trzy kolumny i cztery wiersze

    mat4x2 Cztery kolumny i dwa wiersze

    mat4x3 Cztery kolumny i trzy wiersze

    Macierze mona take mnoy przez wektory. Dziaanie takie czsto wykonuje si w celu prze-ksztacenia wierzchoka przez macierz rzutowania model-widok:

    vec4 vVertex;

    mat4 mvpMatrix;

    vOutPos = mvpMatrix * vVertex;

    Typy macierzowe, podobnie jak wektory, maj rwnie swoje konstruktory. Aby na przykadwpisa bezporednio do kodu macierz 44, mona napisa ponisz instrukcj:

    mat4 vTransform = mat4(1.0f, 0.0f, 0.0f, 0.0f,

    0.0f, 1.0f, 0.0f, 0.0f,

    0.0f, 0.0f, 1.0f, 0.0f,

    0.0f, 0.0f, 0.0f, 1.0f);

    Jako macierz przeksztacenia zastosowalimy macierz jednostkow. Mona take uy szybszegokonstruktora macierzy wypeniajcego tylko przektn jedn wartoci.

    mat4 vTransform = mat4(1.0f);

    Kwalifikatory zmiennych

    Deklaracje zmiennych shadera mona rozszerzy o pewne kwalifikatory suce do okrelaniaich jako zmiennych wejciowych (ini uniform), wyjciowych (out) lub staych (const). Zmiennewejciowe odbieraj dane od klienta OpenGL (atrybuty przesyane poprzez C lub C++) lubz poprzedniego etapu pracy shadera (np. zmienne przekazywane przez shadera wierzchokwdo shadera fragmentw). Zmienne wyjciowe su do zapisywania na dowolnym etapie pracy

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    18/102

    247

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    wartoci, ktre chcemy udostpni w nastpnych etapach, np. w celu przekazania danych z sha-dera wierzchokw do shadera fragmentw albo zapisania ostatecznej wartoci koloru przez shaderfragmentw. W tabeli 6.3 zostay zebrane gwne kwalifikatory zmiennych.

    Tabela 6.3. Kwalifikatory zmiennych

    Kwalifikator Opis

    Zwyka zmienna lokalna niedostpna i niewidoczna na zewntrz

    const Staa czasu kompilacji lub parametr tylko do odczytu funkcji

    in Zmienna przekazana z poprzedniego etapu

    in centroid Zmienna przekazana z poprzedniego stanu, stosuje interpolacj rodkow

    out Zmienna przekazywana do nastpnego etapu przetwarzania lub przechowujca warto zwrotn funkcjiout centroid Zmienna przekazywana do nastpnego etapu przetwarzania, stosuje interpolacj rodkow

    inout Zmienna do odczytu i zapisu. Dozwolona tylko jako parametr funkcji lokalnej

    uniform Warto przekazywana od klienta, taka sama dla wszystkich wierzchokw

    Kwalifikatora inoutmona uywa tylko do deklarowania parametrw funkcji. Poniewa jzykGLSL nie obsuguje wskanikw (czyli referencji), kwalifikator ten stanowi jedyny sposb naprzekazanie wartoci do funkcji i umoliwienie jej zmodyfikowania i zwrcenia wartocizmiennej. Na przykad funkcja zadeklarowana poniej:

    int CalculateSometing(float fTime, float fStepSize, inout float fVariance);

    zwrciaby warto cakowitoliczbow (np. znacznik powodzenia lub niepowodzenia) i dodat-kowo mogaby zmodyfikowa warto zmiennej fVariance, a kod wywoujcy mgby odczytarwnie t jej now warto. Aby umoliwi modyfikowanie parametru w jzykach C i C++,mona by byo zadeklarowa t funkcj przy uyciu wskanika:

    int CalculateSomething(float fTime, float fStepSize, float* fVariance);

    Kwalifikator centroiddziaa wycznie w przypadku renderowania buforw wieloprbkowa-

    nych. W buforze o pojedynczym prbkowaniu interpolacj wykonuje si zawsze od rodka pik-sela. W przypadku wieloprbkowania, gdy zostanie uyty kwalifikator centroid, warto inter-polowana wypada w obrbie zarwno obiektu podstawowego, jak ipiksela. Wicej na tematwieloprbkowania piszemy w rozdziale 9. Buforowanie techniki zaawansowane.

    Domylnie parametry s interpolowane midzy etapami shaderw w sposb odpowiedni dlaperspektywy. Mona zastosowa interpolacj nieperspektywiczn za pomoc sowa kluczowegonoperspective, a nawet cakiem j wyczy za pomoc sowa flat. Mona take uy sowakluczowego smooth, aby bezporednio zaznaczy, e zmienna jest pynnie interpolowanaw sposb perspektywiczny, ale to jest i tak dziaanie domylne. Poniej znajduje si kilka przy-

    kadowych deklaracji:

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    19/102

    248

    Cz I Podstawy

    smooth out vec3 vSmoothValue;

    flat out vec3 vFlatColor;

    noperspective float vLinearlySmoothed;

    Prawdziwy shader

    Nadszed czas, aby w kocu przyjrze si prawdziwej parze shaderw, ktre robi co uytecz-nego. W klasie GLShaderManagerznajduje si standardowy shader nazywany shaderem jednost-kowym. Nie stosuje on adnych przeksztace geometrii i rysuje obiekty podstawowe wype-nione tylko jednym kolorem. To wydaje si nieco zbyt mao. Rozbudujemy go zatem troch, abyzobaczy, jak si cieniuje obiekty podstawowe, takie jak np. trjkt, stosujc inn warto kolorudla kadego wierzchoka. Na listingu 6.1 przedstawiony jest kod shadera wierzchokw, a nalistingu 6.2 shadera fragmentw.

    Listing 6.1. Shader wierzchokw ShadedIdentity

    // Shader ShadedIdentity// Shader wierzchokw// Richard S. Wright Jr// OpenGL. Ksiga eksperta

    #version 330

    in vec4 vVertex; // Atrybut pooenia wierzchoka

    in vec4 vColor; // Atrybut koloru wierzchoka

    out vec4 vVaryingColor; // Warto koloru przekazywana do shadera fragmentw

    void main(void)

    {

    vVaryingColor = vColor; // Kopiowanie wartoci koloru

    gl_Position = vVertex; // Przekazanie dalej pooenia wierzchoka

    }

    Listing 6.2. Shader fragmentw ShadedIdentity

    // Shader ShadedIdentity// Shader fragmentw

    // Richard S. Wright Jr// OpenGL. Ksiga eksperta

    #version 330

    out vec4 vFragColor; // Kolor fragmentu do rasteryzacji

    in vec4 vVaryingColor; // Kolor przychodzcy od shadera wierzchokw

    void main(void)

    {

    vFragColor = vVaryingColor; // Kolor interpolowany na fragment

    }

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    20/102

    249

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Wersje jzyka GLSLPierwszy wiersz niebdcy komentarzem w kadym shaderze to okrelenie wersji jzyka:

    #version 330

    To oznacza, e niniejszy shader wymaga przynajmniej wersji 3.3 jzyka GLSL. Jeli sterownikOpenGL jej nie obsuguje, shadera nie uda si skompilowa. W OpenGL 3.2 wprowadzono jzykGLSL 1.5, w OpenGL 3.1 GLSL 1.4, a w OpenGL 3.0 GLSL 1.3. Trudno si poapa? Nietylko Tobie. Dlatego rada ARB zdecydowaa, e od OpenGL 3.3 numer wersji jzyka GLSL bdzieodpowiada wersji biblioteki. Wersja 4.0 biblioteki OpenGL zostaa opublikowana w tym samymczasie, co wersja 3.3, i odpowiadajcy jej jzyk GLSL ma rwnie numer 4.0. Konstrukcja wyma-gajca wersji 4.0 GLSL wygldaaby nastpujco:

    #version 400

    Jeli zajrzysz do kodu shaderw standardowych w bibliotece GLTools, nie znajdziesz w nichtakiej informacji o wersji jzyka. Biblioteka ta jest przeznaczona do pracy z profilem zgodno-ciowym i zastosowano w niej starsze konwencje z GLSL 1.1. W istocie biblioteka ta wsppracujeze sterownikami OpenGL nawet w wersji 2.1. Pamitajmy, e stanowi ona tylko pomoc w roz-poczciu korzystania z biblioteki OpenGL.

    Deklaracje atrybutwAtrybuty s okrelane dla poszczeglnych wierzchokw przez kliencki kod C/C++. W naszym

    shaderze wierzchokw zostay one zadeklarowane przy uyciu specyfikatora in.in vec4 vVertex;

    in vec4 vColor;

    Dwie powysze instrukcje deklaruj dwa atrybuty wejciowe, czteroskadnikowe pooenie wierz-choka oraz czteroskadnikow warto koloru wierzchoka. Shader ten jest wykorzystywany przezprogram ShadedTriangle. Przy uyciu klasy GLBatchutworzylimy trzy pooenia wierzcho-kw i trzy wartoci kolorw. Jak klasa GLBatchprzekazuje te wartoci do shadera, dowiesz siw podrozdziale Kompilowanie, wizanie i konsolidowanie. Przypomnijmy z rozdziau 3., ew jzyku GLSL mona mie maksymalnie 16 atrybutw w programie wierzchokowym. Ponadto

    kady atrybut jest zawsze czteroskadnikowym wektorem, nawet jeli nie wszystkich skadnikwuywamy.Gdybymy na przykad wewntrznie wyznaczyli jako atrybut tylko jedn warto typufloat, i tak zajaby ona przestrze czterech wartoci zmiennoprzecinkowych.

    Dodatkow rzecz do zapamitania jest fakt, e zmienne oznaczone jako ins przeznaczonetylko do odczytu. Moe si wydawa sprytnym rozwizaniem ponowne uycie nazwy zmiennejw jakich porednich obliczeniach w shaderze, ale kompilator GLSL w sterowniku zgosibyw takiej sytuacji bd.

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    21/102

    250

    Cz I Podstawy

    Deklarowanie danych wyjciowychDalej zadeklarowalimy jedn zmienn wyjciow, bdc rwnie czteroskadnikowym wek-

    torem liczb zmiennoprzecinkowych.out vec4 vVaryingColor;

    Zmienna ta bdzie okrela warto koloru wierzchoka, ktry ma zosta przekazany do shaderafragmentw. W shaderze fragmentw musi ona zosta zadeklarowana jako in, aby nie zostazwrcony bd konsolidatora podczas kompilacji i konsolidacji shaderw.

    Gdy w shaderze wierzchokw zmienna zostanie zadeklarowana jako out, a w shaderze fragmen-tw jako in, shader fragmentw odbierze j jako warto interpolowan. Domylnie interpolacjata jest wykonywana zgodnie z perspektyw. Aby mie pewno, e tak si stanie, mona przed

    zmienn wstawi dodatkowy specyfikator smooth. Mona take zastosowa specyfikator flat,aby wyczy interpolacj, lub noperspective, aby zastosowa prost interpolacj liniowmidzy wartociami. Podczas uywania sowa kluczowego flattrzeba wzi pod uwag pewnedodatkowe fakty, o ktrych szerzej piszemy w podrozdziale Wierzchoek prowokujcy.

    Przetwarzanie wierzchokwDochodzimy do gwnej czci naszego shadera wierzchokw, ktra jest wykonywana jeden razdla kadego wierzchoka w porcji danych.

    void main(void)

    { vVaryingColor = vColor;

    gl_Position = vVertex;

    }

    Ten kod jest bardzo prosty. Przypisalimy przychodzcy atrybut koloru do wychodzcej wartociinterpolowanej i przypisalimy przychodzc warto wierzchoka bezporednio do zmiennejgl_Positionbez transformacji. Zmienna gl_Positionto wbudowany czteroskadnikowywektor zawierajcy wymagany wynik shadera wierzchokw. Wartoci z tej zmiennej s wyko-rzystywane na etapie skadania geometrii do tworzenia obiektu podstawowego. Pamitajmy, eponiewa nie wykonujemy adnych dodatkowych przeksztace, nasz wierzchoek zostanie

    odwzorowany na kartezjaski ukad wsprzdnych o zakresie wartoci od 1,0do 1,0na wszyst-kich trzech osiach.

    Przetwarzanie fragmentwTeraz przechodzimy do shadera fragmentw. W przypadku renderowania obiektu podstawo-wego, takiego jak trjkt, najpierw wierzchoki s przetwarzane przez shader wierzchokw, pniejs one skadane w trjkt, a nastpnie rasteryzowane przez sprzt. Urzdzenie okrela pooenieposzczeglnych fragmentw na ekranie (a mwic dokadniej w buforze kolorw), a nastpniedla kadego z nich (jeli nie jest stosowane wieloprbkowanie, fragment odpowiada pikselowi)

    wywouje egzemplarz shadera fragmentw. Kolor zwracany przez naszego shadera fragmentwto czteroskadnikowy wektor liczb zmiennoprzecinkowych, ktry deklarujemy nastpujco:

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    22/102

    251

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    out vec4 vFragColor;

    Jeli shader fragmentw zwraca tylko jedn warto, jest ona wewntrznie okrelana jako war-

    to wyjciowa zero. Jest to pierwszy wynik shadera fragmentw, ktry nastpnie zostaje wysanydo bufora ustawionego przez funkcj glDrawBuffers. Domylnym buforem jest GL_BACK,czyli tylny bufor koloru (oczywicie w kontekstach z podwjnym buforowaniem). Czsto zdarzasi tak, e bufor koloru nie zawiera czterech skadnikw zmiennoprzecinkowych i wwczas warto-ci wyjciowe s rzutowane na zakres bufora docelowego. W wikszoci przypadkw mog toby np. cztery bajty bez znaku (o wartociach od 0do 255). Moglibymy take zwrci wartocicakowitoliczbowe przy uyciu typu wektorowego ivec4i rwnie one zostayby odwzorowanena zakres bufora kolorw. Moliwe jest take zwrcenie czego wicej ni tylko warto koloru,

    jak rwnie zapisywanie danych w kilku buforach jednoczenie. Te techniki jednak wykraczajdaleko poza zakres tego wstpnego rozdziau.

    Do shadera fragmentw zostaje przesana pynnie interpolowana warto koloru pochodzcaz shadera wierzchokw. Deklaruje si j jako zmienn z kwalifikatorem in:

    in vec4 vVaryingColor;

    Gwna cz shadera fragmentw jest jeszcze prostsza ni shadera wierzchokw. Przypisujemyw niej otrzyman warto koloru bezporednio do koloru fragmentu.

    void main(void)

    {

    vFragColor = vVaryingColor; }

    Efekt dziaania tego shadera przedstawia rysunek 6.2.

    Rysunek 6.2.

    Wynik dziaaniaprogramuShadedTriangle

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    23/102

    252

    Cz I Podstawy

    Kompilowanie, wizanie i konsolidowanie

    Opisalimy zasad dziaania prostego shadera, wic teraz powiniene dowiedzie si, jak jest onkompilowany i konsolidowany w celu przygotowania do uytku w OpenGL. Kod rdowy sha-dera jest przekazywany sterownikowi, kompilowany, a nastpnie konsolidowany, tak jak kadytypowy program w jzykach C i C++. Dodatkowo konieczne jest powizanienazw atrybutwz shadera z jednym z 16 gniazd atrybutw alokowanych i udostpnianych przez GLSL. Po drodzesprawdzamy bdy i nawet otrzymujemy informacje diagnostyczne od sterownika, jeli prbaskompilowania projektu si nie powiedzie.

    API OpenGL nie obsuguje adnych operacji wejcia i wyjcia na plikach. Programista musi samzdoby kod rdowy swoich shaderw w najbardziej odpowiadajcy mu sposb. Jedn z naj-

    prostszych metod jest zapisanie tego kodu w plikach tekstowych ASCII. Wwczas kod rdowymona z takich plikw pobra za pomoc typowych funkcji systemu plikw. Podejcie to zasto-sowalimy w naszym przykadzie. Zastosowalimy rwnie konwencj, wedug ktrej plikomshaderw wierzchokw nadaje si rozszerzenie .vp, a plikom shaderw fragmentw .fp.Innym rozwizaniem jest zapisanie tekstw w postaci tablic znakw wbudowanych w kodC lub C++. Jednak tak zapisany kod trudno si modyfikuje i mimo i cay kod znajduje siw jednym miejscu, zmienianie shaderw i eksperymentowanie z kodem rdowym jest utrud-nione. Oczywicie kod shaderw mona take generowa za pomoc specjalnych algorytmw,a nawet pobiera go z bazy danych albo pliku zaszyfrowanego. Te metody mog by bardzoprzydatne, gdy bdziemy chcieli przesya gdzie nasze aplikacje, ale w zastosowaniach eduka-

    cyjnych nic nie przebije zwykych plikw tekstowych.

    Funkcja gltLoadShaderPairWithAttributes to prawdziwy kombajn do wczytywania i ini-cjalizowania shaderw. Jej kod przedstawia listing 6.3. Na podstawie jego analizy przestudiujemyproces wczytywania shadera.

    Listing 6.3. Funkcja gltLoadShaderPairWithAttributes

    /////////////////////////////////////////////////////////////////// Wczytuje par shaderw oraz je kompiluje i czy.// Podaj kod rdowy kadego shadera. Nastpnie// podaj nazwy tych shaderw, okrel liczb atrybutw

    // oraz podaj indeks i nazw kadego atrybutu.GLuint gltLoadShaderPairWithAttributes(const char *szVertexProg,

    const char *szFragmentProg, ...)

    { // Tymczasowe obiekty shadera

    GLuint hVertexShader;

    GLuint hFragmentShader;

    GLuint hReturn = 0;

    GLint testVal;

    // Tworzenie obiektw shadera

    hVertexShader = glCreateShader(GL_VERTEX_SHADER);

    hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    24/102

    253

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    // adowanie obiektw. W razie niepowodzenia naley wszystko usun i zwrci warto NULL // Shader wierzchokw

    if(gltLoadShaderFile(szVertexProg, hVertexShader) == false)

    { glDeleteShader(hVertexShader);

    glDeleteShader(hFragmentShader);

    cout

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    25/102

    254

    Cz I Podstawy

    glAttachShader(hReturn, hVertexShader);

    glAttachShader(hReturn, hFragmentShader);

    // Teraz musimy powiza nazwy atrybutw z odpowiadajcymi im lokalizacjami // Lista atrybutw

    va_list attributeList;

    va_start(attributeList, szFragmentProg);

    // Iteracja przez list argumentw

    char *szNextArg;

    int iArgCount = va_arg(attributeList, int); // Liczba atrybutw

    for(int i = 0; i < iArgCount; i++)

    {

    int index = va_arg(attributeList, int);

    szNextArg = va_arg(attributeList, char*);

    glBindAttribLocation(hReturn, index, szNextArg);

    }

    va_end(attributeList);

    // Prba konsolidacji

    glLinkProgram(hReturn);

    // Te ju nie s potrzebne

    glDeleteShader(hVertexShader);

    glDeleteShader(hFragmentShader);

    // Sprawdzenie, czy konsolidacja si udaa

    glGetProgramiv(hReturn, GL_LINK_STATUS, &testVal);

    if(testVal == GL_FALSE) {

    char infoLog[1024];

    glGetProgramInfoLog(hReturn, 1024, NULL, infoLog);

    cout

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    26/102

    255

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Inne funkcje jzyka C pobierajce zmienn liczb argumentw to np. printfi sprintf. W tejfunkcji pierwszy dodatkowy parametr okrela liczb atrybutw znajdujcych si w shaderzewierzchokw. Po nim znajduje si warto indeksu (liczona od zera) pierwszego atrybutu,a nastpnie nazwa atrybutu w postaci tablicy znakw. Numer gniazda atrybutu i nazwa atrybutus powtarzane tyle razy, ile potrzeba. Aby na przykad wczyta shader majcy atrybuty pooeniawierzchoka i normalnej do powierzchni, wywoanie funkcji gltLoadShaderPairWithAttributesmogoby wyglda nastpujco:

    hShader = gltLoadShaderPairWithAttributes("vertexProg.vp",

    "fragmentProg.fp", 2, 0, "vVertexPos", 1, "vNormal");

    Wartoci 0i 1jako lokalizacje atrybutw zostay wybrane arbitralnie. Naley tylko pamita, abyzawieray si one w przedziale od 0do 15. Rwnie dobrze moglibymy uy wartoci 7i 13.

    Natomiast w klasach biblioteki GLTools GLBatch i GLTriangleBatchstosowany jest spjnyzestaw lokalizacji atrybutw okrelanych za pomoc nastpujcej instrukcji typedef:

    typedef enum GLT_SHADER_ATTRIBUTE { GLT_ATTRIBUTE_VERTEX = 0,

    GLT_ATTRIBUTE_COLOR, GLT_ATTRIBUTE_NORMAL,

    GLT_ATTRIBUTE_TEXTURE0, GLT_ATTRIBUTE_TEXTURE1,

    GLT_ATTRIBUTE_TEXTURE2, GLT_ATTRIBUTE_TEXTURE3,

    GLT_ATTRIBUTE_LAST};

    Uywajc tych identyfikatorw lokalizacji atrybutw, mona zacz uywa wasnych shaderwobok shaderw standardowych dostarczanych w klasie GLShaderManager. To rwnie oznacza,e nadal moemy przesya geometri przy uyciu klas GLBatchi GLTriangleBatch, a do roz-

    dziau 12. Zarzdzanie geometri techniki zaawansowane, w ktrym bardziej szczegowozajmiemy si technikami przesyania atrybutw wierzchokw.

    Pobieranie kodu rdowegoNajpierw trzeba utworzy dwa obiekty shaderw po jednym dla shadera wierzchokw i sha-dera fragmentw.

    hVertexShader = glCreateShader(GL_VERTEX_SHADER);

    hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    Przy uyciu identyfikatorw shaderw moemy wczyta ich kod rdowy. Pominiemy szczegyfunkcji gltLoadShaderFile , poniewa jej gwnym zadaniem jest wczytanie tekstu shaderaz pliku tekstowego o podanej nazwie, zapisanego na dysku. Gdy ju to zostanie zrobione, poniszykod przesya kod rdowy shadera do obiektu shadera. Pamitaj, e musimy to zrobi dwa razy raz dla shadera wierzchokw i raz dla shadera fragmentw.

    GLchar *fsStringPtr[1];

    fsStringPtr[0] = (GLchar *)szShaderSrc;

    glShaderSource(shader, 1, (const GLchar **)fsStringPtr, NULL);

    Zmienna szShaderSrcto wskanik znakowy wskazujcy cay tekst shadera. Natomiast shaderto identyfikator obiektu shadera, ktry jest wczytywany.

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    27/102

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    28/102

    257

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Funkcja ta pobiera identyfikator interesujcego nas shadera, lokalizacj atrybutu, ktra mazosta uyta w wizaniu, oraz nazw zmiennej atrybutu. Na przykad w shaderach standardowychbiblioteki GLTools przyjlimy konwencj, e dla zmiennej atrybutu pooenia wierzchokazawsze stosujemy nazw vVertex, a dla lokalizacji atrybutu warto GLT_ATTRIBUTE_VERTEX(warto 0). Rwnie moesz zastosowa tak konwencj.

    glBindAttribLocation(hShader, GLT_ATTRIBUTE_VERTEX, "vVertex");

    Wizanie lokalizacji atrybutw musi zosta wykonane przed konsolidacj. W poniszym kodzieprzechodzimy iteracyjnie przez list argumentw i wywoujemy funkcj dla kadego atrybutu,ktry chcemy zwiza.

    // Iteracja przez list argumentw

    char *szNextArg;

    int iArgCount = va_arg(attributeList, int); // Liczba atrybutw for(int i = 0; i < iArgCount; i++)

    {

    int index = va_arg(attributeList, int);

    szNextArg = va_arg(attributeList, char*);

    glBindAttribLocation(hReturn, index, szNextArg);

    }

    va_end(attributeList);

    Konsolidacja shaderw

    Nadszed w kocu czas na skonsolidowanie naszych shaderw, po czym bdziemy mogli usunreprezentujce je obiekty.

    glLinkProgram(hReturn);

    // Te ju nie s potrzebne

    glDeleteShader(hVertexShader);

    glDeleteShader(hFragmentShader);

    Podobnie jak w przypadku kompilacji, w pomylnym zakoczeniu konsolidacji moe prze-szkodzi wiele czynnikw. Stanie si tak na przykad wwczas, gdy w shaderze wierzchokwzadeklarujemy zmienn out, a nie zadeklarujemy jej odpowiednika w shaderze fragmentw.

    Nawet jeli o tym nie zapomnimy, musimy jeszcze pamita, e zmienne te musz by tego samegotypu. Dlatego przed powrotem sprawdzamy bdy i w razie ich wystpienia wywietlamy stosownykomunikat diagnostyczny, podobnie jak przy kompilacji.

    Teraz nasz shader jest w peni gotowy do uycia. Powinnimy jeszcze zaznaczy, e jeli utwo-rzymy program cieniujcy i zakoczymy jego uywanie (np. przy zamykaniu programu), powin-nimy go usun za pomoc poniszej funkcji.

    void glDeleteProgram(GLuint program);

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    29/102

    258

    Cz I Podstawy

    Praktyczne wykorzystanie shadera

    Aby uy naszego shadera GLSL, ch zrobienia tego musimy zakomunikowa za pomoc funk-cji glUseProgram:

    glUseProgram(myShaderProgram);

    W ten sposb aktywowalimy naszego shadera, dziki czemu wszystkie nasze obiekty geome-tryczne bd przetwarzane przez nasze shadery wierzchokw i fragmentw. Dane uniformi teksturowe naley utworzy przed przesaniem atrybutw wierzchokw. Jak to zrobi, wyja-nimy ju za chwil. Natomiast przesyanie atrybutw wierzchokw to bardzo obszerny temat,ktry zasuguje na osobne omwienie w rozdziale 12. Na razie pozwolimy zarzdza naszgeometri klasom GLBatchi GLTriangleBatch.

    W pierwszym przykadowym programie, jaki przedstawilimy w tym rozdziale, ShadedTriangle,wczytalimy trjkt do egzemplarza klasy GLBatcho nazwie triangleBatchprzy uyciu naj-prostszego (nazwalimy go ukadem jednostkowym) ukadu wsprzdnych:

    // Wczytywanie trjkta

    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,

    0.5f, 0.0f, 0.0f,

    0.0f, 0.5f, 0.0f };

    GLfloat vColors [] = { 1.0f, 0.0f, 0.0f, 1.0f,

    0.0f, 1.0f, 0.0f, 1.0f,

    0.0f, 0.0f, 1.0f, 1.0f };triangleBatch.Begin(GL_TRIANGLES, 3);

    triangleBatch.CopyVertexData3f(vVerts);

    triangleBatch.CopyColorData4f(vColors);

    triangleBatch.End();

    myIdentityShader = gltLoadShaderPairWithAttributes("ShadedIdentity.vp",

    "ShadedIdentity.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex",

    GLT_ATTRIBUTE_COLOR, "vColor");

    Kademu wierzchokowi ustawilimy inny kolor, odpowiednio czerwony, zielony i niebieski. Nazakoczenie zaadowalimy nasz par shaderw przy uyciu funkcji gltLoadShaderPairWithAttributes, z ktr ju moge si zapozna. Zauwamy, e mamy dwa zbiory atrybutw wartoci wierzchokw i kolorw odpowiadajce zbiorom danych przesyanym do klasy GLBatch.

    Teraz, aby przesa porcj danych, wystarczy wybra shader i pozwoli klasie GLBatchprzekazanasze atrybuty wierzchokw:

    glUseProgram(myIdentityShader);

    triangleBatch.Draw();

    Wynik tych wszystkich naszych dziaa przedstawia rysunek 6.2.

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    30/102

    259

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Wierzchoek prowokujcy

    Program ShadedTriangle stanowi znakomity przykad pynnej interpolacji wierzchokw. Dlakadego wierzchoka zosta zdefiniowany inny kolor, w wyniku czego powsta trjkt (widocznyna rysunku 6.2), na ktrym przejcia midzy kolorami s pynne. wietnie, prawda? Moemy rw-nie przekazywa zmienne z jednego etapu shadera do drugiego jako typ flat. Jeli chcemy,aby jaka warto pozostaa niezmienna dla caej porcji danych, najlepiej zastosowa typ uniform,o czym bya mowa w rozdziale 3. Czasami jednak chcemy, aby jaka warto bya niezmienna nacaej powierzchni danego obiektu podstawowego, np. trjkta, ale moga si zmienia midzyrnymi trjktami. Przesyanie duej liczby trjktw, np. po jednym trjkcie na porcj danych,tak jak w przypadku uycia zmiennych uniform, byoby bardzo nieefektywnym rozwizaniem.W takich przypadkach najlepiej uy kwalifikatora flat. W shaderze ShadedTraiangle.vppyn-

    nie cieniowana wychodzca warto koloru jest zadeklarowana nastpujco:out vec4 vVaryingColor;

    Gdybymy jednak do jej deklaracji dodali kwalifikator flat(i nie zapomnieli wprowadziodpowiedniej poprawki w shaderze fragmentw), trjkt miaby kolor niebieski.

    flat out vec4 vFlatColor;

    W przypadku, gdy dla kadego wierzchoka obiektu zdefiniowana jest inna warto zapisanaw pasko cieniowanej zmiennej, tylko jedna z nich moe zosta zastosowana. Standardowow takich przypadkach stosowana jest warto ostatniego z wierzchokw, a wic w tym przypadkutrjkt bdzie mia kolor niebieski. Konwencja ta nosi nazw wierzchoka prowokujcego(ang.provoking vertex). Ponisza funkcja pozwala zmieni ten sposb dziaania z ostatniego wierzchokana pierwszy:

    void glProvokingVertex(GLenum provokeMode);

    Funkcja provokeModeprzyjmuje wartoci GL_FIRST_VERTEX_CONVENTION i GL_LAST_VERTEX_CONVENTIONS(domylna).

    Jak to dziaa, mona zobaczy w programie ProvokingVertex, ktry stanowi nieznaczniezmodyfikowan wersj programu ShadedTriangle. Naciniciem spacji mona zmieni kon-wencj, co z kolei spowoduje zmian koloru trjkta.

    Dane uniform shaderaPodczas gdy atrybuty su do okrelania pooenia wierzchokw, normalnych do powierzchni,wsprzdnych teksturowych itp., zmienne uniformsu do przekazywania do shadera infor-macji, ktre powinny by stae w caej porcji danych obiektu. Najczciej spotykanym rodzajem

    danych tego typu dla shadera wierzchokw jest macierz przeksztacenia. Wczeniej wszystkorobia za nas klasa GLShaderManagerwykorzystujca wbudowane standardowe shadery i ich dane

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    31/102

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    32/102

    261

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);

    void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);

    Wyobramy sobie na przykad, e mamy w shaderze ponisze cztery deklaracje zmiennych:uniform float fTime;

    uniform int iIndex;

    uniform vec4 vColorValue;

    uniform bool bSomeFlag;

    Kod w jzyku C lub C++ znajdujcy je i ustawiajcy ich wartoci mgby wyglda nastpujco:

    GLint locTime, locIndex, locColor, locFlag;

    locTime = glGetUniformLocation(myShader, "fTime");

    locIndex = glGetUniformLocation(myShader, "iIndex");

    locColor = glGetUniformLocation(myShader, "vColorValue")

    locFlag = glGetUniformLocation(myShader, "bSomeFlag");

    glUseProgram(myShader);

    glUniform1f(locTime, 45.2f);

    glUniform1i(locIndex, 42);

    glUniform4f(locColor, 1.0f, 0.0f, 0.0f, 1.0f);

    glUniform1i(locFlag, GL_FALSE);

    Zwrmy uwag, e do przekazania wartoci logicznej uylimy cakowitoliczbowej wersjifunkcji glUniform. Wartoci logiczne mona rwnie przekazywa jako wartoci zmiennoprze-

    cinkowe, gdzie 0.0oznacza fasz, a 1.0 prawd.

    Tablice uniform

    Istniej rwnie wersje funkcji glUniformpobierajce jako parametr wskanik, ktry moe wska-zywa tablic wartoci.

    void glUniform1fv(GLint location, GLuint count, GLfloat* v);

    void glUniform2fv(GLint location, GLuint count, Glfloat* v);

    void glUniform3fv(GLint location, GLuint count, GLfloat* v);

    void glUniform4fv(GLint location, GLuint count, GLfloat* v);

    void glUniform1iv(GLint location, GLuint count, GLint* v);

    void glUniform2iv(GLint location, GLuint count, GLint* v);

    void glUniform3iv(GLint location, GLuint count, GLint* v);

    void glUniform4iv(GLint location, GLuint count, GLint* v);

    Parametr countokrela liczb elementw w tablicy zawierajcej xskadnikw, gdzie xoznaczaliczb na kocu nazwy funkcji. Jeli np. mamy zmienn uniformzawierajc cztery skadniki:

    uniform vec4 vColor;

    W C i C++ moglibymy j zdefiniowa jako tablic liczb zmiennoprzecinkowych:

    GLfloat vColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    33/102

    262

    Cz I Podstawy

    Poniewa jest to pojedyncza tablica czterech wartoci, do przekazania jej do shadera wykorzy-stalibymy nastpujc konstrukcj:

    glUniform4fv(iColorLocation, 1, vColor);

    Gdybymy jednak mieli w shaderze tak tablic wartoci kolorw:

    uniform vec4 vColors[2];

    Wwczas w C++ dane te moglibymy zdefiniowa i przekaza nastpujco:

    GLfloat vColors[2][4] = {{ 1.0f, 1.0f, 1.0f, 1.0f },

    { 1.0f, 0.0f, 0.0f, 1.0f }};

    ...

    glUniform4fv(iColorLocation, 2, vColors);

    Najprostsze ustawienie jednej zmiennoprzecinkowej wartoci uniformmoe wyglda tak:

    GLfloat fValue = 45.2f;

    glUniform1fv(iLocation, 1, &fValue);

    Macierze uniform

    Na zakoczenie pokaemy, jak si ustawia macierz uniform. W shaderach typy macierzoweprzechowuj tylko wartoci zmiennoprzecinkowe, przez co mamy znacznie mniej rnych wer-sji. Ponisze funkcje aduj odpowiednio macierze 22, 33 oraz 44.

    glUniformMatrix2fv(GLint location, GLuint count, GLboolean transpose,

    const GLfloat *m);

    glUniformMatrix3fv(GLint location, GLuint count, GLboolean transpose,

    const GLfloat *m);

    glUniformMatrix4fv(GLint location, GLuint count, GLboolean transpose,

    const GLfloat *m);

    Zmienna countokrela liczb macierzy we wskaniku m(tak, mona tworzy tablice macierzy!).Znacznik logiczny transposezostaje ustawiony na warto true, jeli macierz jest ustawionaw porzdku kolumnowym (ustawienie to jest preferowane w OpenGL). Ustawienie tej wartocina GL_FALSEpowoduje transpozycj macierzy podczas jej kopiowania do shadera. Moe to by

    przydatne, gdybymy korzystali z biblioteki macierzowej stosujcej porzdek wierszowy macierzy(np. Direct3D).

    Paski shader

    Zobaczmy przykadowy shader wykorzystujcy zmienne uniform. W zestawie shaderw stan-dardowych mamy paski shader, ktry tylko przeksztaca geometri i ustawia jej jaki pojedynczykolor. Uywane s w nim atrybuty pooenia wierzchokw i dwie zmienne uniform macierzprzeksztacenia i warto koloru.

  • 8/6/2019 OpenGL. Ksiga eksperta. Wydanie V

    34/102

    263

    Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania

    Program FlatShader rysuje obracajcy si torus i ustawia jego kolor na niebieski. Renderujemygo w trybie szkieletowym za pomoc funkcji glPolygonMode, aby byo wyranie wida, e jesttrjwymiarowy. Wikszo zastosowanego kodu klienckiego OpenGL jest ju nam dobrzeznana, dlatego nie zamieszczamy tu penego kodu programu. Na listingach 6.4 i 6.5 przedstawiony

    jest peny kod obu shaderw.

    Listing 6.4. Shader wierzchokw FlatShader

    // Shader paski// Shader wierzchokw// Richard S. Wright Jr// OpenGL. Ksiga eksperta

    #version 330

    // Macierz przeksztacenia

    uniform mat4 mvpMatrix;

    // Dane wejciowe wierzchokw

    in vec4 vVertex;

    void main(void)

    { // To wszystko, przeksztacamy geometri

    gl_Position = mvpMatrix * vVertex;

    }

    Listing 6.5.Shader fragmentw FlatShader

    // Shader paski// Shader fragmentw// Richard S. Wright Jr// OpenGL. Ksiga eksperta

    #version 130

    // Tworzenie jednolitej geometrii

    uniform vec4 vColorValue;

    // Wyjcie koloru fragmentu

    out vec4 vFragColor;

    void main(void)

    {

    vFragColor = vColorValue;