Opis
ePUB/Mobi ISBN: 978-83-01-18397-4 Programowanie procesorów graficznych (GPU) staje się coraz popularniejsze. Dzieje się tak przede wszystkim z powodu dynamicznie rozwijającego się rynku gier i zapotrzebowania na deweloperów w tej dziedzinie, ale również z powodu wysokich możliwości obliczeniowych dostarczanych przez te układy. Shadery (programy wykonywane przez GPU) w przeciągu kilku ostatnich lat znacząco się rozwinęły. Aktualnie w OpenGL 4.5 dostępnych jest ich sześć, co jest znacznym wzrostem w stosunku do dwóch, w nadal wszechobecnym, choć archaicznym już OpenGL 2.1. Są one wykorzystywane głównie do zadań związanych z odwzorowywaniem fizycznych własności świata w celu wyświetlania realistycznej grafiki trójwymiarowej, ale także coraz częściej do rozwiązywania bardziej ogólnych problemów natury matematycznej i algorytmicznej. Książka ta zawiera wyczerpujący opis języka programowania shaderów GLSL w wersji 4.50. Stanowi ona niezbędnik dla każdego kto zamierza szybko odnaleźć się w nowoczesnej grafice trójwymiarowej. Dowiesz się · Czym są shadery · Jak wygląda architektura współczesnego GPU i jakie ma ona znaczenie od strony programistycznej · Jak programować potok renderujący · Na czym polega i jak działa teselacja · Czym jest i jak programuje się shader obliczeniowy (ang. compute shader) Powinieneś znać · API OpenGL w stopniu przynajmniej podstawowym · Matematyczne podstawy grafiki trójwymiarowej Spis treściRozdział 1. Wstęp 9 1.1. Do kogo jest skierowana ta książka? 10 1.2. Przydatne narzędzia 11 Rozdział 2. Zrozumieć GPU 13 2.1. Co to jest Shader? 13 2.2. Architektura GPU 14 2.2.1. GPU versus CPU 15 2.2.2. Jednostki wykonawcze GPU 16 2.2.3. Przełączanie kontekstu i unikanie opóźnień 19 2.2.4. Przetwarzanie rozgałęzień 20 2.2.5. Model pamięci 22 Rozdział 3. Potok renderujący OpenGL 29 3.1. Najważniejsze etapy potoku grafi cznego 29 3.1.1. Przetwarzanie geometrii 29 3.1.2. Rasteryzacja 30 3.1.3. Przetwarzanie fragmentów 31 3.1.4. Postprocess fragmentów 32 3.2. Wprowadzenie do programowalnego potoku 32 3.2.1. Shader wierzchołków 33 3.2.2. Teselacja 34 3.2.3. Shader geometrii 37 3.2.4. Shader fragmentów 38 3.3. Kompilacja 39 3.3.1. Proces kompilacji, wiązania i linkowania 39 3.3.2. Wielokrotne wiązanie shaderów tego samego typu 42 3.3.3. Rozłączne programy 43 3.3.4. Status kompilacji 46 Rozdział 4. Podstawy programowania 49 4.1. Język programowania shaderów GLSL 49 4.2. Profile 50 4.3. Interpretacja schematów konstrukcji programistycznych 51 4.4. Nazwy identyfi katorów obiektów 52 4.5. Preprocesor 52 4.5.1. Kontrola wersji shadera (#version) 53 4.5.2. Defi niowanie symboli oraz makrodefi nicji (#defi ne, #undef) 54 4.5.3. Kontrola warunkowej kompilacji (#if, #ifdef, #ifndef, #elif, #else, #endif) 58 4.5.4. Wspomaganie warunkowej kompilacji (#error) 59 4.5.5. Wspomaganie diagnostyki kodu źródłowego (#line) 59 4.5.6. Sterowanie działaniem kompilatora (#pragma) 60 4.5.7. Zarządzanie zestawem rozszerzeń języka GLSL (#extension) 61 4.6. Typy danych 64 4.6.1. Bazowe typy numeryczne – skalary 65 4.6.2. Pochodne typy numeryczne – wektory 70 4.6.3. Pochodne typy numeryczne – macierze 76 4.6.4. Typy uchwytów 83 4.6.5. Typ subroutine 83 4.6.6. Struktury 84 4.6.7. Tablice 86 4.7. Zmienne 92 4.7.1. Zmienne wewnętrzne 93 4.7.2. Zmienne interfejsu 94 4.7.3. Blok interfejsu 96 4.7.4. Deklaracja obiektów użytkownika w modułach shadera 98 4.8. Zakres zmiennych 99 4.9. Operatory 101 4.10. Instrukcje kontroli przepływu 102 4.11. Funkcje 104 4.11.1. Deklaracja funkcji 105 4.11.2. Definicja funkcji 106 4.11.3. Przeładowywanie funkcji 106 4.11.4. Parametry funkcji i wartości zwracane 107 Rozdział 5. Dane 112 5.1. Generyczny magazyn danych (obiekt bufora) 113 5.1.1. Tworzenie buforów 114 5.1.2. Wiązanie buforów 114 5.1.3. Zarządzanie stanem obiektów buforowych 117 5.1.4. Swobodny dostęp do danych bufora 122 5.1.5. Kopiowanie buforów 124 5.1.6. Odczytywanie zawartości buforów 124 5.1.7. Usuwanie buforów 125 5.2. Zmienne oraz bloki uniform 125 5.2.1. Domyślny blok uniform 126 5.2.2. Nazwany blok uniform 133 5.3. Zmienne oraz bloki buffer 147 5.3.1. Blok buforowy 148 5.3.2. Kontrola dostępu do pamięci 151 5.3.3. Operacje atomowe na zmiennych buforowych 155 5.3.4. Organizacja danych w bloku 157 5.3.5. Własności stanu zmiennych oraz bloków buforowych 158 5.3.6. Pozyskiwanie lokacji zmiennych buforowych oraz aktualizacja danych 159 5.3.7. Wiązanie bloku buforowego 159 5.4. Sformatowany magazyn danych (obiekt tekstury) 160 5.4.1. Reprezentacja tekstur w OpenGL 161 5.4.2. Struktura magazynu danych 161 5.4.3. Tworzenie oraz usuwanie tekstur 164 5.4.4. Wiązanie tekstur 165 5.4.5. Alokacja oraz aktualizacja magazynu danych dla tekstur 169 5.4.6. Tekstura buforowa 171 5.5. Tekstury w shaderach 173 5.5.1. Mechanizm teksturowania 174 5.5.2. Zmienne sampler 177 5.5.3. Podstawowa metoda dostępu do złożonych typów tekstur 181 5.5.4. Funkcje wbudowane odpytywania tekstur 189 5.5.5. Zaawansowane funkcje wbudowane dostępu do danych tekstury 190 5.6.