Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00424 008107 11002835 na godz. na dobę w sumie
Język Cg. Programowanie grafiki w czasie rzeczywistym - książka
Język Cg. Programowanie grafiki w czasie rzeczywistym - książka
Autor: , Liczba stron: 312
Wydawca: Helion Język publikacji: polski
ISBN: 83-7361-241-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> inne - programowanie
Porównaj ceny (książka, ebook, audiobook).

Cg to kompletne środowisko programistyczne do szybkiego tworzenia efektów specjalnych i grafiki o kinowej jakości w czasie rzeczywistym dla wielu platform. Ponieważ język jest niezależny od sprzętu, programiści mogą pisać kod dla interfejsów OpenGL, DirectX oraz systemów Windows, Linux, Mac OS X, a także platform konsolowych, (Xbox) bez potrzeby korzystania z języka asemblerowego. Język Cg powstał w firmie NVIDIA Corporation przy bliskiej współpracy z firmą Microsoft® Corporation i jest kompatybilny z OpenGL API oraz językiem HLSL dla biblioteki DirectX 9.

Książka jest podręcznikiem przeznaczonym dla średnio zaawansowanych programistów. Opisuje ona zarówno sam język programowania Cg, jak i metody wielu składników nowoczesnych aplikacji bazujących na grafice trójwymiarowej.

Prezentowane w książce zagadnienia to m.in.:

'Książka ważna i na czasie: tworzenie tekstur proceduralnych na poziomie pikseli -- animowanych chmur, ognia, wody i wielu innych sztuczek -- nareszcie z ekranów kin przechodzi pod strzechy. Cała moc jest dostępna dzięki językowi przypominającemu język C, co otwiera nowy rozdział w grafice komputerowej.

Ken Perlin, Uniwersytet w Nowym Jorku

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Jêzyk Cg. Programowanie grafiki w czasie rzeczywistym Autorzy: Randima Fernando, Mark J. Kilgard T³umaczenie: Rafa³ Joñca ISBN: 83-7361-241-6 Tytu³ orygina³u: The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics Format: B5, stron: 308 Cg to kompletne ġrodowisko programistyczne do szybkiego tworzenia efektów specjalnych i grafiki o kinowej jakoġci w czasie rzeczywistym dla wielu platform. Poniewa¿ jêzyk jest niezale¿ny od sprzêtu, programiġci mog¹ pisaæ kod dla interfejsów OpenGL, DirectX oraz systemów Windows, Linux, Mac OS X, a tak¿e platform konsolowych, (Xbox) bez potrzeby korzystania z jêzyka asemblerowego. Jêzyk Cg powsta³ w firmie NVIDIA Corporation przy bliskiej wspó³pracy z firm¹ Microsoft® Corporation i jest kompatybilny z OpenGL API oraz jêzykiem HLSL dla biblioteki DirectX 9. Ksi¹¿ka jest podrêcznikiem przeznaczonym dla ġrednio zaawansowanych programistów. Opisuje ona zarówno sam jêzyk programowania Cg, jak i metody wielu sk³adników nowoczesnych aplikacji bazuj¹cych na grafice trójwymiarowej. Prezentowane w ksi¹¿ce zagadnienia to m.in.: • Historia jêzyka Cg • Ďrodowisko programistyczne Cg • Sk³adnia Cg i s³owa kluczowe • Przekszta³cenia w przestrzeni trójwymiarowej • Oġwietlenie bazuj¹ce na wierzcho³kach i pikselach • Interpolacja ujêæ kluczowych i system koġci • Mapowanie ġrodowiska • Mapowanie nierównoġci • Mg³a, ġwiat³a reflektorowe, cienie • Zwiêkszanie wydajnoġci „Ksi¹¿ka wa¿na i na czasie: tworzenie tekstur proceduralnych na poziomie pikseli — animowanych chmur, ognia, wody i wielu innych sztuczek — nareszcie z ekranów kin przechodzi pod strzechy. Ca³a moc jest dostêpna dziêki jêzykowi przypominaj¹cemu jêzyk C, co otwiera nowy rozdzia³ w grafice komputerowej”. — Ken Perlin, Uniwersytet w Nowym Jorku Spis treści Przedmowa..................................................................................................... 13 Wstęp.............................................................................................................. 15 Rozdział 1. Wprowadzenie................................................................................ 21 1.1.Czym jest Cg? ...................................................s...................................................s....... 21 1.1.1. Języki dla programowalnego sprzętu graficznego...................................................d.....22 1.1.2. Model przepływu danych w Cg...................................................d...................................22 1.1.3. Specjalizacja a generalizacja procesorów graficznych .................................................23 1.1.4. Wydajność języka Cg ...................................................d....................................................24 1.1.5. Współdziałanie z konwencjonalnymi językami ...................................................d.......24 1.1.6. Inne aspekty języka Cg...................................................d..................................................26 1.1.7. Ograniczone środowisko wykonywania programów Cg............................................27 1.2. Wierzchołki, fragmenty i potok grafiki ...................................................s.............28 1.2.1. Ewolucja sprzętu graficznego ...................................................d......................................28 1.2.2. Cztery generacje sprzętu graficznego ...................................................d.........................29 1.2.3. Sprzętowy potok graficzny ...................................................d.......................................... 33 1.2.4. Programowalny potok graficzny ...................................................d................................37 1.2.5. Język Cg zapewnia możliwość programowania jednostek wierzchołków i fragmentów...................................................d.......................40 1.3. Historia powstania Cg ...................................................s..........................................40 1.3.1. Współpraca firm NVIDIA i Microsoft w celu określenia języków Cg i HLSL........42 1.3.2. Nieinteraktywne języki cieniowania...................................................d...........................42 1.3.3. Interfejsy programistyczne w grafice trójwymiarowej ................................................45 1.4. Środowisko Cg...................................................s...................................................s.... 45 1.4.1. Standardowe interfejsy programistyczne 3D: OpenGL i Direct3D ..........................45 1.4.2. Kompilator i biblioteka wykonywania Cg...................................................d................47 1.4.3. Narzędzia CgFX i format pliku...................................................d...................................49 1.5. Ćwiczenia......................................s...................................................s.......................... 53 6 Język Cg. Programowanie grafiki w czasie rzeczywistym Rozdział 2. Najprostsze programy......................................................................55 2.1. Prosty program wierzchołków...................................................s............................. 55 2.1.1. Struktura wyjścia...................................................d...................................................d. ........56 2.1.2. Identyfikatory...................................................d...................................................d.... .........57 2.1.3. Elementy struktur ...................................................d...................................................d. .....58 2.1.4. Wektory ...................................................d...................................................d........... ............58 2.1.5. Macierze...................................................d...................................................d.......... .............58 2.1.6. Semantyka ...................................................d...................................................d......... ..........59 2.1.7. Funkcje ...................................................d...................................................d........... .............60 2.1.8. Różnice w semantyce wejścia i wyjścia ...................................................d....................... 61 2.1.9. Ciało funkcji...................................................d...................................................d..... ..........62 2.2. Kompilacja przykładu...................................................s.......................................... 64 2.2.1. Profile programu wierzchołków ...................................................d.................................64 2.2.2. Klasy błędów kompilacji programów Cg...................................................d..................66 2.2.3. Błędy wynikające ze złego profilu...................................................d...............................66 2.2.4. Norma — kilka funkcji wejścia ...................................................d..................................68 2.2.5. Pobieranie i konfiguracja programów wierzchołków i fragmentów........................68 2.3. Prosty program fragmentów...................................................s................................70 2.3.1. Profile dla programów fragmentów ...................................................d........................... 71 2.4. Rendering przykładowych programów wierzchołków i fragmentów...............72 2.4.1. Rendering trójkąta w OpenGL ...................................................d...................................73 2.4.2. Rendering trójkąta w Direct3D ...................................................d..................................74 2.4.3. Uzyskanie tych samych wyników...................................................d...............................74 2.5. Ćwiczenia ...................................................s...................................................s............ 76 Rozdział 3. Parametry, tekstury i wyrażenia......................................................77 3.1. Parametry...................................................s...................................................s.............77 3.1.1. Parametry jednolite ...................................................d.......................................................77 3.1.2. Kwalifikator typu const...................................................d................................................80 3.1.3. Różnorodność parametrów ...................................................d.........................................80 3.2. Próbkowanie tekstur...................................................s.............................................82 .......82 3.2.1. Obiekty próbek...................................................d...................................................d.... 3.2.2. Próbki tekstur...................................................d...................................................d.... .........83 3.2.3. Wysyłanie współrzędnych tekstury w trakcie próbkowania tekstury.......................84 3.3. Wyrażenia matematyczne ...................................................s.................................... 85 3.3.1. Operatory ...................................................d...................................................d......... ...........85 3.3.2. Typy danych uzależnione od profilu...................................................d.........................86 3.3.3. Funkcje wbudowane w standardową bibliotekę Cg ...................................................d.90 3.3.4. Skręcanie w dwuwymiarze ...................................................d...........................................93 3.3.5. Efekt podwójnego widzenia ...................................................d........................................96 3.4. Ćwiczenia ...................................................s...................................................s.......... 100 Spis treści 7 Rozdział 4. Przekształcenia ............................................................................ 101 4.1. Układy współrzędnych ...................................................s........................................101 4.1.1. Przestrzeń obiektu...................................................d...................................................d....102 4.1.2. Współrzędne homogeniczne...................................................d..................................... 103 4.1.3. Przestrzeń świata...................................................d...................................................d. ...... 103 4.1.4. Przekształcenie modelu...................................................d..............................................104 4.1.5. Przestrzeń oka...................................................d...................................................d.... ....... 105 4.1.6. Przekształcenie widoku ...................................................d.............................................. 105 4.1.7. Przestrzeń przycięcia ...................................................d.................................................. 106 4.1.8. Przekształcenie rzutowania...................................................d........................................ 106 4.1.9. Znormalizowane współrzędne urządzenia ...................................................d.............107 4.1.10. Współrzędne okna ...................................................d...................................................d.108 4.2. Zastosowanie teorii...................................................s............................................. 108 4.3. Ćwiczenia ...................................................s...................................................s.......... 109 Rozdział 5. Oświetlenie....................................................................................111 5.1. Oświetlenie i związane z nim modele...................................................s................ 111 5.2. Implementacja podstawowego modelu oświetlenia opartego na wierzchołkach...113 5.2.1. Podstawowy model oświetlenia...................................................d..................................113 5.2.2. Program wierzchołków dla prostego oświetlenia opartego na wierzchołkach ..... 119 5.2.3. Program fragmentów dla modelu oświetlenia wykorzystującego wierzchołki.....128 5.2.4. Efekt modelu oświetlenia opartego na wierzchołkach.............................................128 5.3. Model oświetlenia oparty na fragmentach ...................................................s...... 129 5.3.1. Implementacja modelu oświetlenia opartego na fragmentach ............................... 130 5.3.2. Program wierzchołków dla modelu oświetlenia opartego na fragmentach ...........131 5.3.3. Program fragmentów dla modelu oświetlenia opartego na fragmentach ..............131 5.4. Tworzenie funkcji modelu oświetlenia ...................................................s.............133 5.4.1. Deklarowanie funkcji ...................................................d.................................................133 5.4.2. Funkcja oświetlenia ...................................................d.................................................... 134 .......... 135 5.4.3. Struktury ...................................................d...................................................d......... 5.4.4. Tablice ...................................................d...................................................d........... ............ 136 5.4.5. Sterowanie wykonywaniem programu ...................................................d.................... 137 5.4.6. Obliczenie modelu oświetlenia rozproszenia i rozbłysku....................................... 138 5.5. Rozszerzenie modelu podstawowego ...................................................s............... 138 5.5.1. Zanik światła wraz z odległością ...................................................d............................... 139 5.5.2. Dodanie efektu reflektora...................................................d..........................................140 5.5.3. Światła kierunkowe ...................................................d...................................................d.. 145 5.6. Ćwiczenia ...................................................s...................................................s.......... 145 Rozdział 6. Animacja ...................................................................................... 147 6.1. Ruch w czasie ...................................................s...................................................s.... 147 6.2. Pulsujący obiekt...................................................s...................................................s 148 6.2.1. Program wierzchołków...................................................d...............................................149 6.2.2. Obliczanie przemieszczenia...................................................d...................................... 150 8 Język Cg. Programowanie grafiki w czasie rzeczywistym 6.3. Systemy cząsteczek ...................................................s.............................................. 152 6.3.1. Warunki początkowe ...................................................d.................................................. 153 6.3.2. Wektoryzacja obliczeń ...................................................d............................................... 153 6.3.3. Parametry systemu cząsteczek ...................................................d................................... 154 6.3.4. Program wierzchołków ...................................................d.............................................. 154 6.3.5. Ubieramy system cząsteczek...................................................d...................................... 156 6.4. Interpolacja ujęć kluczowych ...................................................s............................ 157 6.4.1. Teoria ujęć kluczowych ...................................................d.............................................. 157 6.4.2. Rodzaje interpolacji ...................................................d................................................... 160 6.4.3. Prosta interpolacja ujęć kluczowych ...................................................d........................ 160 6.4.4. Interpolacja ujęć kluczowych z oświetleniem...................................................d......... 162 6.5. System skóry dla wierzchołków...................................................s..........................163 6.5.1. Teoria systemu skóry dla wierzchołków ...................................................d.................. 163 6.5.2. System skóry w programie wierzchołków ...................................................d............... 166 6.6. Ćwiczenia ...................................................s...................................................s.......... 167 Rozdział 7. Mapowanie środowiska..................................................................169 7.1. Mapowanie środowiska ...................................................s...................................... 169 7.1.1. Tekstury map sześciennych...................................................d........................................170 7.1.2. Generowanie map sześciennych ...................................................d............................... 171 7.1.3. Koncepcja mapowania środowiska ...................................................d.......................... 171 7.1.4. Obliczenie wektorów odbicia...................................................d....................................172 7.1.5. Założenia mapowania środowiska...................................................d............................ 173 7.2. Mapowanie odbić ...................................................s............................................... 174 7.2.1. Parametry określane przez aplikację ...................................................d........................ 175 7.2.2. Program wierzchołków ...................................................d.............................................. 175 7.2.3. Program fragmentów ...................................................d.................................................179 7.2.4. Mapy sterujące ...................................................d...................................................d.... .....180 7.2.5. Program wierzchołków a program fragmentów...................................................d.....180 7.3. Mapowanie załamań...................................................s............................................181 7.3.1. Zjawisko załamania światła...................................................d........................................182 7.3.2. Program wierzchołków ...................................................d..............................................184 7.3.3. Program fragmentów...................................................d.................................................. 186 7.4. Efekt Fresnela i rozszczepienie chromatyczne...................................................s 187 7.4.1. Efekt Fresnela ...................................................d...................................................d.... .......187 7.4.2. Rozszczepienie chromatyczne...................................................d..................................188 7.4.3. Parametry zależne od aplikacji ...................................................d.................................189 7.4.4. Program wierzchołków ...................................................d..............................................190 7.4.5. Program fragmentów ...................................................d................................................. 191 7.5. Ćwiczenia ...................................................s...................................................s.......... 193 Spis treści 9 Rozdział 8. Mapowanie nierówności ................................................................. 195 8.1. Mapowanie nierówności ceglanej ściany ...................................................s......... 195 8.1.1. Mapa normalnych ceglanej ściany...................................................d............................ 196 8.1.2. Przechowywanie map nierówności jako map normalnych .....................................197 8.1.3. Proste mapowanie nierówności dla ceglanego muru................................................200 8.1.4. Mapowanie nierówności dla rozbłysku...................................................d...................203 8.1.5. Mapowanie nierówności na innej geometrii...................................................d...........206 8.2. Mapowanie nierówności ceglanej podłogi ...................................................s......208 8.2.1. Program wierzchołków dla renderingu obrazu ceglanej podłogi ...........................210 8.3. Mapowanie nierówności dla torusa...................................................s.................. 213 8.3.1. Matematyka dotycząca torusa...................................................d................................... 213 8.3.2. Program wierzchołków dla torusa z mapowaniem nierówności ............................ 216 8.4. Mapowanie nierówności dla teksturowanych siatek wielokątnych ................ 218 8.4.1. Algorytm dla pojedynczego trójkąta...................................................d........................218 8.4.2. Możliwe problemy ...................................................d...................................................d..220 8.4.3. Uogólnienie do siatek z wielokątów ...................................................d........................222 8.5. Połączenie mapowania nierówności z innymi efektami ..................................223 8.5.1. Standardowe tekstury ...................................................d.................................................223 8.5.2. Mapy połysku...................................................d...................................................d...... .....223 8.5.3. Rzucanie cieni na samego siebie...................................................d...............................224 8.6. Ćwiczenia ...................................................s...................................................s..........225 Rozdział 9. Zagadnienia zaawansowane............................................................227 9.1. Mgła ...................................................s...................................................s...................227 ...228 9.1.1. Mgła jednorodna ...................................................d...................................................d... ......229 9.1.2. Atrybuty mgły...................................................d...................................................d..... 9.1.3. Matematyka mgły...................................................d...................................................d... ..229 9.1.4. Dostosowanie równań do zachowania zgodnego z intuicją....................................232 9.1.5. Tworzenie jednorodnej mgły w programie Cg ...................................................d.......233 9.2. Rendering nierealistyczny ...................................................s................................. 235 9.2.1. Cieniowanie jak w kreskówkach ...................................................d...............................235 9.2.2. Implementacja cieniowania kreskówkowego ...................................................d.........236 9.2.3. Łączymy wszystko razem ...................................................d...........................................239 9.2.4. Problemy związane z tym rozwiązaniem ...................................................d................241 9.3. Rzutowanie tekstur ...................................................s............................................. 241 9.3.1. W jaki sposób działa rzutowanie tekstur?...................................................d................242 9.3.2. Implementacja rzutowania tekstury ...................................................d........................244 9.3.3. Kod rzutowania tekstury ...................................................d...........................................245 9.4. Mapowanie cieni...................................................s.................................................248 9.5. Łączenie ...................................................s...................................................s.............250 9.5.1. Mapowanie pikseli z wejścia na wyjście ...................................................d................... 251 9.5.2. Podstawowe operacje dotyczące łączenia ...................................................d................252 9.6. Ćwiczenia ...................................................s...................................................s..........254 10 Język Cg. Programowanie grafiki w czasie rzeczywistym Rozdział 10. Profile i wydajność.......................................................................257 10.1. Opis profili...................................................s...................................................s......257 10.1.1. Profil shadera wierzchołków dla DirectX 8...................................................d............257 10.1.2. Podstawowy profil programu wierzchołków dla kart NVIDIA i OpenGL .........258 10.1.3. Profil programu wierzchołków ARB dla OpenGL..................................................259 10.1.4. Profil shadera wierzchołków dla DirectX 9 ...................................................d...........259 10.1.5. Zaawansowany profil programu wierzchołków dla kart NVIDIA i OpenGL ....259 10.1.6. Profile shadera pikseli dla DirectX 8 ...................................................d......................260 10.1.7. Podstawowy profil programu fragmentów NVIDIA dla OpenGL....................... 261 10.1.8. Profile shadera pikseli dla DirectX9 ...................................................d....................... 261 10.1.9. Profil programu fragmentów ARB dla OpenGL...................................................d..262 10.1.10. Zaawansowany profil programu fragmentów NVIDIA dla OpenGL................262 10.2. Wydajność ...................................................s...................................................s....... 263 10.2.1. Korzystanie ze standardowej biblioteki Cg...................................................d...........263 10.2.2. Zalety parametrów jednorodnych...................................................d..........................264 10.2.3. Program fragmentów a program wierzchołków...................................................d...264 10.2.4. Typy danych i ich wpływ na wydajność...................................................d.................265 10.2.5. Wykorzystanie zalet wektoryzacji...................................................d...........................265 10.2.6. Kodowanie funkcji w teksturach ...................................................d............................266 10.2.7. Intensywnie wykorzystanie przemieszania i negacji...............................................267 10.2.8. Cieniujemy tylko te fragmenty, które musimy ...................................................d....267 10.2.9. Krótszy kod asemblerowy nie zawsze jest szybszy...................................................d268 10.3. Ćwiczenia ...................................................s...................................................s........268 Dodatek A Narzędzia Cg................................................................................. 269 A.1. Pobieranie przykładów prezentowanych w niniejszej książce.........................269 A.2. Pobieranie narzędzia Cg Toolkit ...................................................s.....................269 Dodatek B Biblioteka wykonywania Cg .............................................................. 271 B.1. Czym jest biblioteka wykonywania Cg?...................................................s........... 271 B.2. Dlaczego warto używać biblioteki wykonywania Cg? ...................................... 271 B.2.1. Dostosowanie do nowszych procesorów graficznych..............................................271 B.2.2. Brak problemów z zależnościami ...................................................d............................272 B.2.3. Zarządzanie parametrami wejściowymi...................................................d..................272 B.3. W jaki sposób działa biblioteka wykonywania Cg? ..........................................273 ...274 B.3.1. Pliki nagłówkowe...................................................d...................................................d.. B.3.2. Tworzenie kontekstu ...................................................d.................................................274 B.3.3. Kompilacja programu ...................................................d...............................................274 B.3.4. Wczytanie programu ...................................................d.................................................275 B.3.5. Modyfikacja parametrów programu ...................................................d.......................276 B.3.6. Wykonanie programu...................................................d................................................276 B.3.7. Zwalnianie zasobów...................................................d...................................................d277 B.3.8. Obsługa błędów ...................................................d...................................................d.... ...277 B.4. Dodatkowe informacje ...................................................s......................................278 Spis treści 11 Dodatek C Format pliku CgFX ...........................................................................279 C.1. Czym jest CgFX?...................................................s.................................................279 C.2. Opis formatu...................................................s...................................................s...280 ..........280 C.2.1. Techniki...................................................d...................................................d.......... ..........281 C.2.2. Przebiegi...................................................d...................................................d......... C.2.3. Stany renderingu...................................................d...................................................d.. ...281 C.2.4. Zmienne i semantyka...................................................d................................................282 C.2.5. Przypisy ...................................................d...................................................d.......... ..........282 C.2.6. Przykładowy plik CgFX ...................................................d............................................283 C.3. Moduły Cg obsługujące format CgFX ...................................................s............284 C.4. Dodatkowe informacje o CgFX ...................................................s.......................285 Dodatek D Słowa kluczowe języka Cg ...............................................................287 D.1. Lista słów kluczowych języka Cg ...................................................s.....................287 Dodatek E Funkcje standardowej biblioteki Cg .................................................... 289 E.1. Funkcje matematyczne...................................................s.......................................290 E.2. Funkcje geometryczne ...................................................s.......................................293 E.3. Funkcje mapowania tekstur ...................................................s..............................294 E.4. Funkcje pochodnych ...................................................s.........................................295 E.5. Funkcja testowania ...................................................s.............................................296 Skorowidz.................................................................................................... 297 Rozdział 5. Oświetlenie W tym rozdziale opiszemy, w jaki sposób symulować oświetlenie obiektów na scenie za pomocą źródeł światła. Zaczniemy od utworzenia uproszczonej wersji powszechnie stosowanego modelu oświetlenia. Następnie stopniowo będziemy dodawali coraz to nowe funkcje do modelu podstawowego, aby był bardziej użyteczny. Niniejszy rozdział składa się z pięciu podriozdziałów. ♦ ♦ 5.1. Oświetlenie i związane z nim modele — wyjaśnia znaczenie oświetlenia oraz opisuje koncepcję modeli oświetlenia. 5.2. Implementacja podstawowego modelu oświetlenia opartzego na wierzchołkach — przedstawia uproszczoną wersję modelu oświetlenia iużywanego w OpenGL i Direct3D. Opisuje także krok po kroku wykonaniie tego modelu w programie wierzchołków. 5.3. Oświetlenie oparte na fragmentach — omawia różnicę między oświetleniem opartym na wierzchołkach i fragmentach oraz przedstawiia sposób implementacji oświetlenia dla fragmentów. 5.4. Tworzenie funkcji oświetlenia — wyjaśnia sposób tworzenia własnej funkcji modelowania oświetlenia. 5.5. Rozszerzenie modelu podstawowego — wprowadza kilka udogodnień do podstawowego modelu oświetlenia: teksturowanie, zianik i efekty świateł reflektorowych. Przy okazji wprowadzimy kilkai kluczowych koncepcji języka Cg, na przykład tworzenie funkcji, taiblic i struktur. ♦ ♦ ♦ 5.1. Oświetlenie i związane z nim modele Do tej pory omawiane przykłady były proste i dotyczyły podstawowych kon- cepcji potrzebnych do napisania programu. W kilku następnych rozdziałach przedstawimy kilka interesujących efektów. W tym rozdziale zajmiemy się mo- delowaniem oświetlenia. 112 Język Cg. Programowanie grafiki w czasie rzeczywistym Dodanie do sceny oświetlenia pozwala na uzyskanie zróżnicowanego cienio- wania a tym samym bardziej interesujących obrazów. Właśnie z tego powodu reżyserzy zwracają dużą uwagę na oświetlenie — wpływa ono na sposób odbie- rania opowiadanej historii. Ciemne obszary sceny wzmagają uczucie tajemni- czości i stopniują napięcie (niestety w grafice komputerowej cieni nie dostaje się „za darmo”, gdy tylko doda się oświetlenie. W rozdziale 9. dokładnie opisu- jemy tworzenie cieni). Oświetlenie i właściwości użytego materiału definiują wygląd obiektu. Model oświetlenia definiuje sposób, w jaki światło wchodzi w interakcję z obiektem. Wykorzystywana jest przy tym charakterystyka światła i materiału obiektu. W ciągu ostatnich lat powstało wiele różnych modeli oświetlenia, od prostych aproksymacji po bardzo dokładne symulacje. Na rysunku 5.1 przedstawiono obiekty zrederowane za pomocą różnych mode- li oświetlenia. Warto zauważyć, w jaki sposób modele symulują materiały z rze- czywistego świata. Rysunek 5.1. Różne modele oświetlenia W przeszłości potok graficzny z na stałe ustalonymi funkcjami był ograniczo- ny do jednego modelu cieniowania. Model ten jest nazywany modelem oświetlenia o stałej funkcji. Model ten bazuje na modelu Phong, ale posiada kilka modyfika- cji i dodatków. Model oświetlenia o stałej funkcji ma kilka zalet: wygląda za- dowalająco, nie jest kosztowny obliczeniowo oraz udostępnia kilka parame- trów, które można wykorzystać do sterowania wyglądem. Problem polega na tym, że model ten wygląda odpowiednio tylko dla ograniczonej liczby materia- łów. Obiekty wydają się być wykonane z plastiku lub gumy, więc obrazy kom- puterowe nie wyglądają zbyt realistycznie. Aby obejść ograniczenia modelu oświetlenia stałej funkcji, programiści grafiki zaczęli wykorzystywać inne cechy potoku graficznego. Na przykład sprytnie napisane programy używały odpowiednich tekstur, aby lepiej symulować nie- które materiały. Dzięki językowi Cg i programowalnym jednostkom graficznym można napi- sać własny, złożony model cieniowania w języku wysokiego poziomu. Nie mu- simy już konfigurować ograniczonego zbioru stanów potoku graficznego lub Rozdział 5.  Oświetlenie 113 programować w niewygodnym języku asemblerowym. Najważniejsze jest jednak to, że nie jesteśmy ograniczeni do jednego, stałego modelu oświetlenia. Możemy napisać własny model, który zostanie wykonany w proicesorze graficznym. 5.2. Implementacja podstawowego modelu oświetlenia opartego na wierzchołkach W tym podrozdziale opiszemy, w jaki sposób zaimplementować uproszczoną wersję modelu cieniowania stałej funkcji za pomocą programu wierzchołków. Popularność i prostota tego modelu powodują, że idealnie nadaje się on do roz- poczęcia nauki opisu oświetlenia. Najpierw zajmiemy się opisem samego modelu. Jeśli Czytelnik dobrze zna ten model, może przejść do podrozdziału 5.2.2. 5.2.1. Podstawowy model oświetlenia OpenGL i Direct3D stosują prawie identyczny model oświetlenia o stałej funk- cji. W naszym przykładzie zastosujemy wersję uproszczoną, którą będziemy nazywać modelem podstawowym. Model podstawowy, podobnie jak modele OpenGL i Direct3D, modyfikują i rozszerzają klasyczny model Phong. W mo- delu podstawowym kolor powierzchni jest sumą współczynników oświetlenia: emisyjnego, otoczenia, rozproszenia i rozbłysku. Każdy z współczynników za- leży od kombinacji właściwości materiału obiektu (na przykład połyskliwości i koloru materiału) i właściwości światła (na przykład położenie i kolor świa- tła). Każdy ze współczynników stanowi wektor HNQCV zawierający komponenty koloru czerwonego, zielonego i niebieskiego. Ogólne równanie opisujące ten model można napisać nasitępująco. kolor powierzchni = emisja + otoczenie + dyfuzja + rozbłysk Współczynnik emisji Współczynnik emisji określa światło emitowane lub oddawane przez powierzch- nię i jest niezależny od wszystkich źródeł światła. Współczynnikiem emisji jest wartość RGB wskazująca kolor emitowanego światła. Jeśli oglądamy materiał emi- tujący światło w ciemnym pokoju, zobaczymy właśnie ten kolor. Współczynnik emisji umożliwia symulację świecenia. Na rysunku 5.2 przedstawiono koncepcję współczynnika emisji a na rysunku 5.3 — rendering obiektu z uwzględnieniem 114 Język Cg. Programowanie grafiki w czasie rzeczywistym Rysunek 5.2. Współczynnik emisji Rysunek 5.3. Rendering obiektu z uwzględnieniem współczynnika emisji tylko współczynnika emisji. Rendering jest nieciekawy, ponieważ cały obiekt pokrywa jeden kolor. W odróżnieniu od rzeczywistego świata, obiekty emitujące światło na scenie nie oświetlają pobliskich obiektów. Taki obiekt nie jest źródłem światła — niczego nie oświetla i nie rzuca cieni. Współczynnik emisji można traktować jako kolor dodawany po obliczeniu wszystkich innych współczyn- ników oświetlenia. Bardziej zaawansowane modele oświetlenia ogólnego symu- lują sposób, w jaki wyemitowane światło wpływa na resztę sceny, ale tymi mo- delami nie będziemy zajmowali się w tej książce. Oto wzór matematyczny wykorzystywany do obliczania współczynnika emisji (emissive). emissive = Ke gdzie Ke to kolor emisji dla materiału. Współczynnik otoczenia Współczynnik otoczenia dotyczy światła, które jest tak rozproszone w scenie, że wydaje się, iż pochodzi ze wszystkich stron. Oświetlenie otoczenia nie ma jakiegoś określonego kierunku, wydaje się pochodzić ze wszystkich kierunków. Oznacza to, że współczynnik ten nie zależy od położenia światła. Rysunek 5.4 obrazuje koncepcję a na rysunku 5.5 przedstawiono rendering obiektu, który otrzymuje tylko światło otoczenia. Współczynnik otoczenia zależy od współ- czynnika odbicia materiału obiektu a także koloru światła rzucanego na mate- riał. Podobnie jak w przypadku współczynnika emisji, współczynnik otoczenia to jeden stały kolor. Różnica polega na tym, że współczynnik otoczenia jest modyfikowany przez globalną wartość oświetlenia ogólniego. Rozdział 5.  Oświetlenie 115 Rysunek 5.4. Współczynnik otoczenia Rysunek 5.5. Rendering obiektu z uwzględnieniem współczynnika otoczenia Oto wzór matematyczny dla współczynnika otoczenia (ambient) ambient = Ka × globalAmbient gdzie: ♦ ♦ Ka to współczynnik odbicia materiału, globalAmbient to kolor oświetlenia ogólnego. Współczynnik rozproszenia Współczynnik rozproszenia dotyczy promienia światła odbijanego przez po- wierzchnię w równym stopniu dla wszystkich kierunków. Powierzchnie, dla których stosuje się współczynnik rozproszenia są chropowate w skali mikro- skopijnej, więc odbijają światło we wszystkich kierunkach w równym stopniu. Gdy promień światła dochodzi do zakamarków powierzchni, odbija się we wszystkich możliwych kierunkach (patrz rysunek 5.6). Rysunek 5.6. Rozproszenie światła Natężenie światła odbitego od obiektu jest proporcjonalne do kąta padania światła na powierzchnię. Powierzchnie niewygładzone nazywane są często po- wierzchniami rozpraszającymi światło. Współczynnik rozproszenia dla każdego 116 Język Cg. Programowanie grafiki w czasie rzeczywistym punktu powierzchni jest taki sam, niezależnie od tego, gdzie znajduje się punkt widzenia. Rysunek 5.7 ilustruje znaczenie współczynnika rozproszenia a rysu- nek 5.8 — rendering obiektu rozpraszającego światło. Rysunek 5.7. Współczynnik rozproszenia Rysunek 5.8. Rendering obiektu z uwzględnieniem współczynnika rozproszenia Oto wzór matematyczny używany do obliczenia współczynnika rozproszenia (diffuse) — patrz rysunek 5.9. diffuse = Kd × lightColor × max(N L, 0) gdzie: ♦ ♦ ♦ Kd to kolor rozproszenia materiału, lightColor to kolor padającego światła, N to znormalizowana normalna powierzchni, L to znormalizowany wektor skierowany w stronę źródłia światła, P to cieniowany punkt. ♦ ♦ Rysunek 5.9. Obliczanie natężenia światła rozproszonego Iloczyn skalarny znormalizowanych wektorów N i L jest miarą kąta między tymi wektorami. Im mniejszy kąt między wektorami, tym większa będzie war- tość iloczynu skalarnego a tym samym także ilość odbijanego światła będzie większa. Powierzchnia, której normalna jest zwrócona w tym samym kierunku, Rozdział 5.  Oświetlenie 117 co wektor światła, spowoduje powstanie ujemnej wartości iloczynu skalarnego, więc max(N L, 0) z równania zapewnia, że dla tej powierzchni nie pojawi się ko- lor rozproszenia. Współczynnik rozbłysku Współczynnik rozbłysku reprezentuje światło odbite od powierzchni w po- dobny sposób, jak to się dzieje w przypadku lustra. Współczynnik ten ma duże znaczenie dla reprezentacji gładkich i lśniących powierzchni, na przykład wy- polerowanego metalu. Rysunek 5.10 ilustruje koncepcję współczynnika rozbły- sku a rysunek 5.11 — rendering obiektu z rozbłyskiem. Rysunek 5.10. Współczynnik rozbłysku Rysunek 5.11. Rendering obiektu z uwzględnieniem współczynnika rozbłysku W odróżnieniu od współczynników emisji, otoczenia i rozproszenia, współ- czynnik rozbłysku zależy od punktu widzenia obserwatora. Jeśli patrzący nie znajduje się w położeniu, które otrzymuje odbite promienie, nie zauważy roz- błysku na powierzchni. Na współczynnik rozbłysku wpływa nie tylko kolor powierzchni i źródła światła, ale także ustawienie połyskliwości powierzchni. Bardziej błyszczące obiekty posiadają mniejszy i węższy rozbłysk, natomiast materiały o mniejszej połyskliwości mają większy, łagodniejszy rozbłysk. Na ry- sunku 5.12 przedstawiono ten sam obiekt z różnymi ustiawieniami połyskliwości. Rysunek 5.12. Przykłady różnych wartości połyskliwości 118 Język Cg. Programowanie grafiki w czasie rzeczywistym Oto wzór matematyczny, którego używamy do obliczenia współczynnika roz- błysku (specular) — ilustracja wzoru na rysunku 5.13). specular = Ks × lightColor × facing × (max(N H,0))shininess gdzie: ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Ks to kolor rozbłysku dla materiału, lightColor to kolor promieni świetlnych, N to znormalizowana normalna powierzchni, V to znormalizowany wektor zwrócony w stronę widza, L to znormalizowany wektor zwrócony w stronę źródła iświatła, H to znormalizowany wektor w połowie między V i L, P to analizowany punkt powierzchni, facing (skierowanie) jest równe 1, jeśli N L jest większe od zera, w przeciwnym razie wynosi 0. Rysunek 5.13. Obliczanie współczynnika rozbłysku Gdy kąt między wektorem widoku V i wektorem połowy kąta H jest niewielki, na powierzchni obiektu pojawia się rozbłysk. Obliczanie wykładnika z iloczy- nu skalarnego N i H zapewnia szybki zanik rozbłysku, gdy wektory N i H za- czynają się rozchodzić. Dodatkowo wymuszamy wyzerowanie współczynnika, jeśli współczynnik roz- proszenia jest równy zero z powodu ujemnej wartości iloczynu skalarnego N i L. W ten sposób mamy pewność, że rozbłysk nie pojawi się na powierzchni, której normalna jest odwrócona tyłem do źródła światła. Dodanie współczynników do siebie Połączenie współczynników otoczenia, rozproszenia i rozbłysku daje nam wy- nikowy model oświetlenia, co przedstawiono na rysunku 5.14. Nie zastosowali- śmy współczynnika emisji, ponieważ jest on stosowany w zasadzie tylko w efek- tach specjalnych. Rozdział 5.  Oświetlenie 119 Rysunek 5.14. Łączenie współczynników Uproszczenia Czytelnik, który zna model stosowany w interfejsach OpenGL i Direct3D, za- pewne zauważył wiele uproszczeń podstawowego modelu oświetlenia. Używa- my globalnego modelu oświetlenia otoczenia zamiast osobnego modelu dla każdego źródła światła. Stosujemy także tę samą wartość dla kolorów rozpro- szenia i rozbłysku, choć powinno to być rozdzielone. Poza tym nie bierzemy pod uwagę zaniku i efektów świateł reflektorowych. 5.2.2. Program wierzchołków dla prostego oświetlenia. opartego na wierzchołkach W tym podrozdziale omówimy program Cg dla wierzchołków, który imple- mentuje podstawowy model oświetlenia opisany w podriozdziale 5.2.1. Program wierzchołków  XADCUKE.KIJV z przykładu 5.1 wykonuje dwa zadania: ♦ ♦ przekształca położenie wierzchołków z przestrzeni obiiektu do przestrzeni przycięcia; oblicza kolor wierzchołka, używając współczynników eimisji, otoczenia, rozproszenia i rozbłysku dla jednego źródła światłai. Przykład 5.1. Program wierzchołków C5E1v_basicLight XQKF  XADCUKE.KIJV HNQCVRQUKVKQP215+6+10 HNQCVPQTOCN014/#. QWVHNQCVQ2QUKVKQP215+6+10 QWVHNQCVEQNQT 1.14 WPKHQTOHNQCVZOQFGN8KGY2TQL WPKHQTOHNQCVINQDCN#ODKGPV WPKHQTOHNQCVNKIJV QNQT WPKHQTOHNQCVNKIJV2QUKVKQP WPKHQTOHNQCVG[G2QUKVKQP WPKHQTOHNQCV-G WPKHQTOHNQCV-C 120 Język Cg. Programowanie grafiki w czasie rzeczywistym WPKHQTOHNQCV-F WPKHQTOHNQCV-U WPKHQTOHNQCVUJKPKPGUU ] Q2QUKVKQPOWN OQFGN8KGY2TQLRQUKVKQP  HNQCV2RQUKVKQPZ[\ HNQCV0PQTOCN 1DNKE\CPKGYURÎđE\[PPKMCGOKULK HNQCVGOKUUKXG-G 1DNKE\CPKGYURÎđE\[PPKMCQVQE\GPKC HNQCVCODKGPV-C INQDCN#ODKGPV 1DNKE\CPKGYURÎđE\[PPKMCTQ\RTQU\GPKC HNQCV.PQTOCNK\G NKIJV2QUKVKQP2  HNQCVFKHHWUG.KIJVOCZ FQV 0.   HNQCVFKHHWUG-F NKIJV QNQT FKHHWUG.KIJV 1DNKE\CPKGYURÎđE\[PPKMCTQ\Dđ[UMW HNQCV8PQTOCNK\G G[G2QUKVKQP2  HNQCV*PQTOCNK\G . 8  HNQCVURGEWNCT.KIJVRQY OCZ FQV 0*  UJKPKPGUU  KH FKHHWUG.KIJV URGEWNCT.KIJV HNQCVURGEWNCT-U NKIJV QNQT URGEWNCT.KIJV EQNQTZ[\GOKUUKXG CODKGPV FKHHWUG URGEWNCT EQNQTY _ W tym przykładzie wykonujemy obliczenia oświetlenia w przestrzeni obiektu. Można je także wykonać w innych przestrzeniach, jeśli przekształcimy do niej wszystkie potrzebne układy współrzędnych. Na przykład interfejsy OpenGL i Direct3D wykonują obliczenia w przestrzeni oka. Przestrzeń oka jest bardziej użyteczna w przypadku wielu źródeł światła, ale przestrzeń obiektu jest łatwiej- sza w implementacji. Ćwiczenia na końcu tego rozdziału wyjaśniają wady i zalety obliczania oświe- tlenia w przestrzeni oka i przestrzeni obiektu. Dane dostarczane przez aplikacje W tabeli 5.1 zamieszczono listę danych, które aplikacja musi dostarczyć do potoku graficznego. Dana oznaczona jest jako zmienna, jeśli zmienia się dla każdego wierzchołka i jako jednorodna, jeśli zmienia się rzadko (na przykład raz na obiekt). Rozdział 5.  Oświetlenie 121 Tabela 5.1. Dane przekazywane do potoku graficznego przez aplikalcję Parametr Nazwa zmiennej Typ Kategoria PARAMETRY GEOMETRYCZNE położenie wierzchołka w przestrzeni obiektu normalna wierzchołka w przestrzeni obiektu RQUKVKQP PQTOCN HNQCV HNQCV połączone macierze model-widok i perspektywy położenie światła w przestrzeni obiektu położenie oka w przestrzeni obiektu PARAMETRY ŚWIATŁA kolor światła globalny kolor otoczenia PARAMETRY MATERIAŁU wartość emisji wartość otoczenia wartość rozproszenia wartość rozbłysku połyskliwość OQFGN8KGY2TQL HNQCVZ NKIJV2QUKVKQP G[G2QUKVKQP NKIJV QNQT INQDCN#ODKGPV -G -C -F -U UJKPKPGUU HNQCV HNQCV HNQCV HNQCV HNQCV HNQCV HNQCV HNQCV HNQCV zmienna zmienna jednorodna jednorodna jednorodna jednorodna jednorodna jednorodna jednorodna jednorodna jednorodna jednorodna Wskazówka dotycząca testowania Łatwo zauważyć, że kod obliczający model oświetlenia jest bardziej skompli- kowany od wszystkich poprzednich programów opisanych w niniejszej książce. Gdy pracujemy nad złożonym programem, warto tworzyć go fragment po fragmencie. Sprawdzamy program po dodaniu każdej nowej funkcji lub ele- mentu, by przekonać się, że działa tak, jak tego oczekujemy. Podejście polegające na napisaniu całego kodu i dopiero późniejszym jego testowaniu nie jest zbyt rozsądne. W przypadku popełnienia błędu jego odnalezienie będzie znacznie łatwiejsze, gdy zna się poprzednią poprawną wersję priogramu. Wskazówka ta w szczególności dotyczy kodu oświetlenia, ponieważ obliczanie modelu oświetlenia można podzielić na kilka etapów (emisja, otoczenie, roz- proszenie, rozbłysk). Z tego powodu warto najpierw obliczyć współczynnik GOKUUKXG a następnie ustawić EQNQT na GOKUUKXG. Następnie obliczyć CODKGPV i ustawić EQNQT na CODKGPV plus GOKUUKXG. Tworząc program Cg w ten sposób można uniknąć wielu błędów i problemów. 122 Język Cg. Programowanie grafiki w czasie rzeczywistym Kod programu wierzchołków Obliczanie położenia w przestrzeni przycięcia Zaczynamy od obliczenia położenia wierzchołka w przestrzeni przycięcia w celu przekazania jej do rasteryzera (opisywaliśmy to zadianie w rozdziale 4.). Q2QUKVKQPOWN OQFGN8KGY2TQLRQUKVKQP  Następnie tworzymy kopię zmiennej, aby zapamiętać położenie wierzchołka w przestrzeni obiektu, ponieważ ta informacja będzie nam potrzebna w przy- szłości. Stosujemy zmienną tymczasową typu HNQCV, ponieważ wszystkie pozo- stałe wektory oświetlenia (normalna powierzchni, położenie światła i położenie oka) także są typu HNQCV. HNQCV2RQUKVKQPZ[\ Warto zauważyć specjalny rodzaj składni: RQUKVKQPZ[\. To pierwsza wzmianka w tej książce o cesze języka Cg zwanej przemieszaniem. Przemieszanie Przemieszanie umożliwia zmianę kolejności komponentów i utworzenie no- wego wektora zawierającego komponenty w takiej kolejności, jaką określi pro- gramista. W przypadku przemieszania używa się tego samego operatora kropki, co w przypadku dostępu do elementów struktury oraz informacji o nowej ko- lejności komponentów. Po znaku kropki może się znaleźć dowolna kombina- cja liter Z, [, \ i Y. W przypadku kolorów RGB można też zastosować litery iT, I, D i C. Litery te wskazują, które komponenty oryginalnego wektora posłużą do utworzenia nowego wektora. Litery Z i T odpowiadają pierwszemu komponen- towi, [ i D drugiemu itd. W poprzednim przykładzie RQUKVKQP była zmienna ty- pu HNQCV. Zastosowanie Z[\ powoduje wydobycie komponentów x, y i z ze zmiennej RQUKVKQP i umieszczenie ich w nowym wektorze. Nowy wektor przypi- sywany jest do zmiennej 2 typu HNQCV. Języki C i C++ nie obsługują przemieszania, ponieważ nie zawierają wbudowa- nej obsługi typów wektorowych. Przemieszanie jest ważnym elementem języka Cg, gdyż zwiększa wydajność kodu. Oto kilka innych przykładów zastosowania przemieszaniia. HNQCVXGEHNQCV   HNQCVXGEXGE[ZXGE  HNQCVUECNCTXGEYUECNCT HNQCVXGEUECNCTZZZXGE  Rozdział 5.  Oświetlenie 123 Warto dokładnie przyjrzeć się tym czterem wierszom kodu. Pierwszy wiersz deklaruje zmienną XGE typu HNQCV. Drugi wiersz przypisuje komponenty [ i Z z XGE do nowego wektora typu HNQCV. Wektor jest następnie przypisany do XGE. W trzecim wierszu komponent Y z XGE jest przypisywany do typu HNQCV (zmiennej o nazwie UECNCT). W ostatnim wierszu tworzymy wektor HNQCV, trzy- krotnie kopiując wartość zmiennej UECNCT. Jest to nazywane rozmazywaniem i pozwala zauważyć, że Cg traktuje wartości skalarne jak wektory jednokompo- nentowe (wartości skalarne odczytujemy końcówką Z). Możliwe jest także przemieszczanie macierzy w celu tworzenia wektorów bazu- jących na ciągu elementów macierzy. W tym celu używamy notacji AOYKGT åU\ MQNWOPC . Można połączyć ze sobą kilka przemieszczeń macierzy, aby otrzymać wektor o odpowiednim rozmiarze. Oto przykłiad. HNQCVZO[/CVTKZ HNQCVO[(NQCV5ECNCT HNQCVO[(NQCV8GE 7UVCYKCO[(NQCV5ECNCTPCO[/CVTKZ=?=? O[(NQCV5ECNCTO[/CVTKZA 2T\[RKUWLGIđÎYPæRT\GMæVPæOCEKGT\[O[/CVTKZFQO[(NQCV8GE O[(NQCV8GEO[/CVTKZAOAOAOAO Dodatkowo można uzyskać dostęp do poszczególnych wierszy macierzy za pomocą operatora tablicy =?. Używając zmiennej zadeklarowanej w poprzed- nim kodzie, możemy napisać. 7UVCYKCO[O[(NQCV8GEVQTPCRKGTYU\[YKGTU\O[/CVTKZ O[(NQCV8GEO[/CVTKZ=? Maskowanie zapisu Język Cg obsługuje także inną operację, związaną z przemieszaniem, nazywaną maskowaniem zapisu, która umożliwia aktualizację tylko niektórych komponen- tów wektora w trakcie zapisu. Możemy na przykład zapisać wartości tylko do komponentów x i w wektora HNQCV, używając wektora HNQCV.  CMđCFCO[ľGPCRQE\æVMWYGMVQT[OCLæYCTVQħEK XGE  XGE   XGEZYXGE6GTC\XGE  Operator maskowania zapisu może zawierać komponenty Z, [, \ i Y (lub T, I, D i C) w dowolnej kolejności. Każda z liter może wystąpić co najwyżej raz w danym maskowaniu zapisu. Nie można mieszać liter Z[\Y i TIDC w jednym operatorze. 124 Język Cg. Programowanie grafiki w czasie rzeczywistym W większości nowoczesnych procesorów graficznych operracje przemieszania i maskowania nie wpływają na wydajność wykonywanychr działań. Warto więc z nich korzystać, gdy tylko pozwalają zwiększyć szybkość drziałania i czytelność kodu. Obliczanie emitowanego światła W przypadku emitowanego światła w zasadzie nie wykonujemy żadnych obli- czeń. Aby zwiększyć czytelność kodu, tworzymy zmienną o nazwie GOKUUKXG zawierającą współczynnik emisji światła. 1DNKE\GPKGYURÎđE\[PPKMCGOKULK HNQCVGOKUUKXG-G Gdy kompilator Cg przekształca kod do postaci wykonyrwalnej, optymalizuje go, aby nie pojawił się spadek wydajności wynikający z rkorzystania ze zmiennych tymczasowych, na przykład GOKUUKXG. Zastosowanie tej zmiennej czyni kod czytelniejszym, zatem warto stosować kopie niektórycrh zmiennych. Nie będzie to miało żadnego wpływu na wydajność kodu wykonywalrnego. Współczynnik oświetlenia otoczenia Czytelnik zapewne przypomina sobie, że w przypadku potrzeby obliczenia współczynnika oświetlenia należy pomnożyć kolor otoczenia materiału (-C) przez globalny kolor otoczenia. Jest to wymnażanie poszczególnych elemen- tów wektora, czyli poszczególne komponenty koloru -C mnożymy przez od- powiednie komponenty globalnego oświetlenia. Zadanie to wykona poniższy kod, który korzysta z maskowania i przemieszania. /CđQY[FCLP[URQUÎDQDNKE\GPKCYURÎđE\[PPKMCQVQE\GPKC HNQCVCODKGPV CODKGPVZ-CZ INQDCN#ODKGPVZ CODKGPV[-C[ INQDCN#ODKGPV[ CODKGPV\-C\ INQDCN#ODKGPV\ Przedstawiony kod jest poprawny, ale nie jest elegancki ani wydajny. Język Cg obsługuje operacje na wektorach, zatem możemy tego rodzaju operację wyrazić w spójniejszy sposób. Poniżej przedstawiamy bardziej elegancki sposób skalo- wania wektora przez wektor. 1DNKE\GPKGYURÎđE\[PPKMCQVQE\GPKC HNQCVCODKGPV-C INQDCN#ODKGPV Proste, prawda? Wbudowana w język Cg obsługa podstawowych operacji na wektorach i macierzach jest bardzo pomocna. Rozdział 5.  Oświetlenie 125 Współczynnik światła rozproszenia Powoli przechodzimy do coraz bardziej interesujących obliczeń przydatnych w opisywaniu modelu oświetlenia. W przypadku koloru rozproszenia potrze- bujemy wektora skierowanego od wierzchołka do źródła światła. Aby zdefinio- wać wektor, od punktu końcowego odejmuje się jego początek. W tym przypad- ku wektor kończy się w położeniu NKIJV2QUKVKQP a zaczyna w 2. 1DNKE\CPKGYGMVQTCħYKCVđC HNQCV.PQTOCNK\G NKIJV2QUKVKQP2  Jesteśmy zainteresowani tylko kierunkiem a nie wartością, więc normalizujemy wektor. Standardowa biblioteka Cg zawiera funkcję PQTOCNK\G, która zwraca znormalizowany wektor. Jeśli nie znormalizujemy wektora, otrzymane oświe- tlenie obiektu będzie zbyt jasne lub zbyt ciemne. PQTOCNK\G X zwraca znormalizowaną wersję wektora X Następnie wykonuje się rzeczywiste obliczenia oświetlenia. Jest to złożone równanie, więc warto przeanalizować je fragment po fragmencie. Najpierw po- jawia się iloczyn skalarny. Przypomnijmy, że iloczyn skalarny to prosta funkcja matematyczna, która oblicza jedną wartość reprezentującą cosinus kąta między dwoma wektorami jednostkowymi. W języku Cg do obliczania iloczynu ska- larnego używamy funkcji FQV. FQV CD zwraca iloczyn skalarny wektorów C i D Z tego powodu fragment kodu, który znajduje iloczyn skalarny między 0 i . ma postać. FQV 0.  Pojawia się jednak pewien problem. Powierzchnia ustawiona tyłem do światła otrzyma oświetlenie ujemne, ponieważ iloczyn skalarny zwróci wartość ujemną, gdy normalna jest odwrócona od źródła światła. Ujemne wartości oświetlenia nie mają żadnej podstawy fizycznej i spowodują powstanie błędów w równaniu oświetlenia. Aby uniknąć problemów, musimy wartości ujemne zamienić na zero, czyli dla wartości ujemnych iloczynu skalarnego do dalszych obliczeń przekazać wartość zero. Operację przycięcia łatwo przeprowadzići, używając funkcji OCZ. OCZ CD zwraca maksimum z C i D Połączenie dwóch poprzednich operacji spowoduje powstanie następującego kodu. 126 Język Cg. Programowanie grafiki w czasie rzeczywistym OCZ FQV 0.   Cały kod obliczający światło rozproszenia ma postaći. HNQCVFKHHWUG.KIJVOCZ FQV 0.   Następnie musimy jeszcze pomnożyć ze sobą kolor rozproszenia materiału (-F) z kolorem rozproszenia światła (NKIJV QNQT). Obliczona wartość FKHHWUG.KIJV to wartość skalarna. Warto zapamiętać, że w języku Cg można pomnożyć wektor przez skalar. Spowoduje to przeskalowanie wszystkich elementów wektora przez skalar. Możemy więc połączyć obliczenia dla wszystkich kolorów w dwóch operacjach mnożenia. HNQCVFKHHWUG-F NKIJV QNQT FKHHWUG.KIJV Współczynnik światła rozbłysku Obliczenie współczynnika światła rozbłysku wymaga największej liczby opera- cji. Warto przyjrzeć się jeszcze raz rysunkowi 5.13, który przedstawia różne po- trzebne wektory. Wektor . obliczyliśmy już wcześniej dla koloru rozproszenia, ale potrzebujemy jeszcze wektorów 8 i *. Uzyskanie ich nie jest trudne, ponie- waż znamy położenie oka (G[G2QUKVKQP) i położenie wierzchołka (2). Zaczynamy od znalezienia wektora od wierzchołka do położenia oka. Wektor ten typowo nazywany jest wektorem widoku (w naszym przykładzie jako zmienna 8). Jako że interesuje nas tylko kierunek, powinniśmy znormalizować wektor. Za- danie to wykonuje poniższy kod. HNQCV8PQTOCNK\G G[G2QUKVKQP2  Następnie obliczamy *, czyli wektor znajdujący się w połowie między wektorem światła . i wektorem widoku 8. Wektor ten nazywany jest wektorem połowy kąta. Musimy znormalizować *, gdyż interesuje nas tylko kierunek. /CđQY[FCLP[URQUÎDQDNKE\GPKC* HNQCV*PQTOCNK\G  .  8  Skoro wykonujemy operację normalizacji, skalowanie 8 i . przez 0.5 nie ma żadnego sensu (normalizacja i tak zniesie te mnożenie). Z tego powodu możemy skrócić kod do następującego. HNQCV*PQTOCNK\G . 8  Teraz można już przystąpić do obliczeń współczynnika rozbłysku. Podobnie jak w przypadku współczynnika rozproszenia, będziemy budowali wyrażenie krok po kroku. Zaczniemy od iloczynu skalarnego * i 0. FQV *0 Rozdział 5.  Oświetlenie 127 Musimy zastosować ograniczenie od dołu do zera, podobnie jak podczas obli- czania współczynnika oświetlenia rozproszonego. OCZ FQV *0  Wynik musimy podnieść do potęgi określonej parametrem UJKPKPGUU. Powodu- je to zmniejszanie się rozbłysku wraz ze zwiększaniem wartości połyskliwości (UJKPKPGUU). Aby podnieć wartość do potęgi, stosujemy funkcję RQY. RQY Z[ zwraca Z[ Po dodaniu funkcji potęgowania uzyskujemy następujące iwyrażenie. RQY OCZ FQV *0  UJKPKPGUU Po połączeniu wszystkiego razem otrzymujemy: HNQCVURGEWNCT.KIJVRQY OCZ FQV 0*  UJKPKPGUU  Musimy jeszcze zapewnić, by rozbłysk nie pojawiał się wtedy, gdy oświetlenie rozproszenia wynosi 0 (wtedy powierzchnia jest ustawiona tyłem do źródła światła). Innymi słowy, gdy oświetlenie rozproszenia jest równe 0, oświetlenie rozbłysku także ustawiamy na zero. W tym celu musimy wykorzystać instruk- cje warunkowe języka Cg. Instrukcje warunkowe Podobnie jak w języku C, w języku Cg można wykorzystywać instrukcje wa- runkowe, słowa kluczowe KH oraz GNUG. Oto przykład. KH XCNWG ] EQNQTHNQCV  MQNQTE\GTYQP[ _GNUG] EQNQTHNQCV  MQNQT\KGNQP[ _ Podobnie jak w języku C możemy stosować notację !, aby w zwięzły sposób za- implementować instrukcje warunkowe. URTCYF\CPGY[TCľGPKG ! KPUVTWMELGLGħNKRTCYFC  KPUVTWMELGLGħNKHCđU\ Poprzedni przykład można więc zapisać następująco. EQNQT XCNWG !HNQCV  
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Język Cg. Programowanie grafiki w czasie rzeczywistym
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: