Perełki programowania gier. Vademecum profesjonalisty. Tom 2

23
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE Pere³ki programowania gier. Vademecum profesjonalisty. Tom 2 Autor: Mark DeLoura T³umaczenie: Rafa³ Joñca ISBN: 83-7197-837-5 Tytu³ orygina³u: Game Programming Gems 2 Format: B5, stron: 608 Jeli zajmujesz siê lub zamierzasz siê zaj¹æ programowaniem gier komputerowych, nie odk³adaj tej ksi¹¿ki na pó³kê. Znajdziesz w niej siedemdziesi¹t rozwi¹zañ rozmaitych problemów, przed którymi staje programista gier. S¹ to rozwi¹zania do natychmiastowego zastosowania lub pomys³y, które mog¹ znacznie zredukowaæ nak³ad pracy. Ich autorami s¹ najwybitniejsi autorzy gier, wspó³twórcy wielu prawdziwych hitów. Doæ powiedzieæ, ¿e redaktorami ksi¹¿ki „Pere³ki programowania gier” s¹ pracownicy firm takich jak Nintendo czy NVidia Corporation. Autorzy postarali siê, by przedstawiane przez nich pere³ki ukazywa³y praktyczne techniki programistyczne, mo¿liwe do osi¹gniêcia przy u¿yciu aktualnie stosowanych technologii i pomagaj¹ce przy pisaniu gier komputerowych. Przyk³adowe kody ród³owe opieraj¹ siê na uznanych standardach: jêzykach C i C++, interfejsy OpenGL i DirectX i nieodzownym, gdy chcemy uzyskaæ maksymaln¹ wydajnoæ asemblerze procesorów x86. Porady i rozwi¹zania podzielone s¹ na 6 czêci: Programowanie ogólne Matematyka Sztuczna inteligencja Zarz¹dzanie geometri¹ Grafika Programowanie dwiêku Do³¹czony CD-ROM zawiera wszystkie kody ród³owe z ksi¹¿ki, dema wielu przedstawionych technik, bibliotekê DirectX 8, instalator glSetup, bibliotekê narzêdzi GLUT, obrazy z kolorowej wk³adki w wysokiej rozdzielczoci.

description

Jeśli zajmujesz się lub zamierzasz się zająć programowaniem gier komputerowych, nie odkładaj tej książki na półkę. Znajdziesz w niej siedemdziesiąt rozwiązań rozmaitych problemów, przed którymi staje programista gier. Są to rozwiązania do natychmiastowego zastosowania lub pomysły, które mogą znacznie zredukować nakład pracy. Ich autorami są najwybitniejsi autorzy gier, współtwórcy wielu prawdziwych hitów. Dość powiedzieć, że redaktorami książki "Perełki programowania gier" są pracownicy firm takich jak Nintendo czy NVidia Corporation.Autorzy postarali się, by przedstawiane przez nich perełki ukazywały praktyczne techniki programistyczne, możliwe do osiągnięcia przy użyciu aktualnie stosowanych technologii i pomagające przy pisaniu gier komputerowych. Przykładowe kody źródłowe opierają się na uznanych standardach: językach C i C++, interfejsy OpenGL i DirectX i nieodzownym, gdy chcemy uzyskać maksymalną wydajność asemblerze procesorów x86.Porady i rozwiązania podzielone są na 6 części: * Programowanie ogólne (projektowanie systemów testowych, wykorzystanie profilowania, rodzaje baz danych, biblioteki narzędzi, procedury obsługi zrzucania stosu, narzędzia dzienników zdarzeń, samomodyfikujący się kod) * Matematyka (sztuczki z liczbami zmiennoprzecinkowymi w formacie IEEE, szybka interpolacja kwaternionowa, szybkie grupowanie przestrzeni, fraktale, fizyka, sztuczki z wektorami i płaszczyznami, rozwiązywanie przecięć krawędź-krawędź, algorytmy ruchu po krzywej) * Sztuczna inteligencja (znajdowanie drogi, ocena strategiczna, mapy wpływu, systemy wyszukiwania i widoczności, automaty stanów rozmytych, ocena terenu, mikrowątki) * Zarządzanie geometrią (zarządzanie całością geometrii, algorytmy poziomów szczegółowości, skompresowane drzewa prostopadłościanów otaczających wyrównywanych do osi, metody drzew czwórkowych, drzewa kul dla określania widoczności, śledzenie promieni, przeszukiwanie zakresowe, tworzenie teł na sześcianach, postacie rzucające cień na siebie, stosowanie plam na dowolnych powierzchniach) * Grafika (metody renderingu, tworzenie proceduralnych chmur, maskowanie tekstur, metody dynamicznego oświetlania opartego na pikselach, mapowanie tekstur, programowalne shadery wierzchołków) * Programowanie dźwięku (wzorce projektowe w programowaniu dźwięku, metody ponownego użycia głosów i prosty sekwenser muzyki bazujący na próbkach, programowe efekty DSP, interfejs programistyczny niskiego poziomu dla dźwięku)Dołączony CD-ROM zawiera wszystkie kody źródłowe z książki, dema wielu przedstawionych technik, bibliotekę DirectX 8, instalator glSetup, bibliotekę narzędzi GLUT, obrazy z kolorowej wkładki w wysokiej rozdzielczości.

Transcript of Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Page 1: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Wydawnictwo Helion

ul. Chopina 6

44-100 Gliwice

tel. (32)230-98-63

e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

Pere³ki programowaniagier. Vademecumprofesjonalisty. Tom 2 Autor: Mark DeLoura

T³umaczenie: Rafa³ Joñca

ISBN: 83-7197-837-5

Tytu³ orygina³u: Game Programming Gems 2

Format: B5, stron: 608

Je�li zajmujesz siê lub zamierzasz siê zaj¹æ programowaniem gier komputerowych,

nie odk³adaj tej ksi¹¿ki na pó³kê. Znajdziesz w niej siedemdziesi¹t rozwi¹zañ

rozmaitych problemów, przed którymi staje programista gier. S¹ to rozwi¹zania do

natychmiastowego zastosowania lub pomys³y, które mog¹ znacznie zredukowaæ nak³ad

pracy. Ich autorami s¹ najwybitniejsi autorzy gier, wspó³twórcy wielu prawdziwych

hitów. Do�æ powiedzieæ, ¿e redaktorami ksi¹¿ki „Pere³ki programowania gier”

s¹ pracownicy firm takich jak Nintendo czy NVidia Corporation.

Autorzy postarali siê, by przedstawiane przez nich pere³ki ukazywa³y praktyczne

techniki programistyczne, mo¿liwe do osi¹gniêcia przy u¿yciu aktualnie stosowanych

technologii i pomagaj¹ce przy pisaniu gier komputerowych. Przyk³adowe kody �ród³owe

opieraj¹ siê na uznanych standardach: jêzykach C i C++, interfejsy OpenGL i DirectX

i nieodzownym, gdy chcemy uzyskaæ maksymaln¹ wydajno�æ asemblerze

procesorów x86.

Porady i rozwi¹zania podzielone s¹ na 6 czê�ci:

• Programowanie ogólne

• Matematyka

• Sztuczna inteligencja

• Zarz¹dzanie geometri¹

• Grafika

• Programowanie d�wiêku

Do³¹czony CD-ROM zawiera wszystkie kody �ród³owe z ksi¹¿ki, dema wielu

przedstawionych technik, bibliotekê DirectX 8, instalator glSetup, bibliotekê narzêdzi

GLUT, obrazy z kolorowej wk³adki w wysokiej rozdzielczo�ci.

Page 2: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

����������������������������������������������������������������������������������������������������������� �

������������������������������������������������������������������������������������������������� ��

���������������������������������������������������������������������������������������������������� ��

������������������������������������������������������������������������������������������������������ ��

����������� ����������� �������������������������������������������������������������

� �������� ���������������������������������������������������������������������������������������� ��

Rozdział 1.1 � �!�"��#$��������$��!���%&&�����#'���������������������������������������� �(Konstrukcja i destrukcja obiektu ...........................................................................................39Zarządzanie pamięcią ............................................................................................................42Funkcje wirtualne ..................................................................................................................43Rozmiar kodu.........................................................................................................................45Biblioteka STL.......................................................................................................................45Zaawansowane funkcje..........................................................................................................47Dodatkowa lektura .................................................................................................................48

Rozdział 1.2 )����$������#$�������$*#���!������������� ��������������������� +(Zalety funkcji inline...............................................................................................................49Kiedy należy używać funkcji inline.......................................................................................51Kiedy należy używać makr....................................................................................................51Dodatki w kompilatorze Microsoftu......................................................................................52Bibliografia ............................................................................................................................52

Rozdział 1.3 ��������������!����!*������*���#!$!#'�������$*���������� �Abstrakcyjny interfejs............................................................................................................53Dodawanie fabryki.................................................................................................................55Abstrakcyjne klasy jako zbiory cech .....................................................................................56Wszystko ma swoją cenę .......................................................................................................59Wnioski ..................................................................................................................................59Bibliografia ............................................................................................................................60

Rozdział 1.4 ,�* �����"*�%&&������"������-..������������������������������������������������������������� ��Eksport funkcji.......................................................................................................................61Eksport klasy..........................................................................................................................61Eksport funkcji członkowskich klasy ....................................................................................63Eksport funkcji wirtualnych klasy .........................................................................................63Podsumowanie .......................................................................................................................64

Page 3: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

4 ���� � �������� ���������������������������������������

Rozdział 1.5 /��� ��#��*��� ����� ����������"������-..������$0#!#'����#$��*!*������ ��#!$���������������������������������������� � Łączenie jawne i niejawne.....................................................................................................66Funkcje LoadLibrary i GetProcAddress ................................................................................66Obrona przed błędnymi bibliotekami DirectX ......................................................................67Funkcje specyficzne dla systemu operacyjnego ....................................................................68Podsumowanie .......................................................................................................................69

Rozdział 1.6 -!��#�������#$����! �������������������������������������������������������������� ��Wprowadzenie do klasy dynamicznej informacji o typie......................................................71Demaskowanie typu i odpytywanie DTI ...............................................................................72Dziedziczenie oznacza „jest typu”.........................................................................................73Obsługa ogólnych obiektów ..................................................................................................74Implementacja trwałej informacji o typie ..............................................................................75Zastosowanie trwałej informacji o typie w bazie danych zapisów stanu gry ........................77Wnioski ..................................................................................................................................77Bibliografia ............................................................................................................................78

Rozdział 1.7 1"*���2#���2#�����3"���$0#����"!���*�� ���#��������"*�%&& ���������������������������������������������������������������������������� �(Kod.........................................................................................................................................80Inne możliwe wykorzystania klas..........................................................................................82Bibliografia ............................................................................................................................83

Rozdział 1.8 4��!��$���*�������������������������������������������������������������������������������� 5 Komponenty...........................................................................................................................86Klasy waga piórkowa, zachowań i eksportowa .....................................................................86Obiekty wagi piórkowej.........................................................................................................86SAMM-y, gdzie jesteś?..........................................................................................................87Hierarchia klas zachowań ......................................................................................................88Wykorzystanie wzorca szablonu metod w przypisywaniu zachowań ...................................89Klasy eksportowe...................................................................................................................90Fabryka jednostek ..................................................................................................................91Wybór strategii w trakcie działania programu.......................................................................92Uwagi końcowe .....................................................................................................................94Bibliografia ............................................................................................................................94

Rozdział 1.9 -�������"*!�������$0#�$������"�#!#'����#$#'���%&& ����� ( Możliwe rozwiązania .............................................................................................................95Idealne rozwiązanie ...............................................................................................................96Używanie i przypisywanie niezalecanych funkcji.................................................................96Implementacja niezalecania funkcji w C++...........................................................................97Co można poprawić? .............................................................................................................98Podziękowania .......................................................................................................................98Bibliografia ............................................................................................................................98

Rozdział 1.10 6���3��� ���#�� ���#!� ��!���*��������! ����������������������������� ((Zaczynamy.............................................................................................................................99Rejestracja informacji w menedżerze ..................................................................................100Raportowanie zebranych informacji ....................................................................................102O czym należy pamiętać ......................................................................................................104Możliwe rozszerzenia ..........................................................................................................105Bibliografia ..........................................................................................................................105

Page 4: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Rozdział 1.11 6����� ����"�$0#!�������!������������������������������������������������������� �7�Podstawy profilowania programów.....................................................................................107Komercyjne narzędzia .........................................................................................................108Czemu utworzyć własny system? ........................................................................................109Wymagania dotyczące modułu profilującego......................................................................109Architektura i implementacja...............................................................................................110Szczegóły implementacji .....................................................................................................111Analiza danych ....................................................................................................................111Uwagi dotyczące implementacji ..........................................................................................112

Rozdział 1.12 6���"� ���������"������������#'���*!*�����������*������� ���Aktualizacja świata ..............................................................................................................113Rozwiązanie — wielowątkowość........................................................................................114Bibliografia ..........................................................................................................................117

Rozdział 1.13 8��$���*��*� ������������������������������������������������������������������������������������� ��(Prosty tymczasowy powrót ..................................................................................................119Łańcuchy tymczasowych powrotów....................................................................................120Thunking..............................................................................................................................122Rekurencja ...........................................................................................................................123

Rozdział 1.14 9�����!����$0#!�*������ ����������������������������������������������������������������� �: Zasady kodu RAM...............................................................................................................125Szybkie przekształcanie i kopiowanie bitów .......................................................................126

Rozdział 1.15 /��0����� "��������!����!*����� "������*���� ����������������� ���Czym jest plik zasobów? .....................................................................................................133Projekt ..................................................................................................................................134Implementacja......................................................................................................................135Ostatnie słowa na temat implementacji ...............................................................................137Wnioski ................................................................................................................................137Bibliografia ..........................................................................................................................137

Rozdział 1.16 �������������$�*���������$2;���! ���������������������������������������������� ��(Do czego może się przydać rejestracja wejść? ....................................................................139Ile to zajmie?........................................................................................................................141Testowanie rejestracji wejścia .............................................................................................145Wnioski ................................................................................................................................145Bibliografia ..........................................................................................................................145

Rozdział 1.17 ,"*�!#�!�*!*����"��!�*�������$����*�� ����������������������������������� �+�System analizy składniowej.................................................................................................148Makra, nagłówki i magia wcześniejszego przetwarzania ....................................................148Wyjaśnienie systemu analizy składniowej ..........................................................................149Klasa TokenFile ...................................................................................................................152Uwagi końcowe ...................................................................................................................153

Rozdział 1.18 <�����$*������*"�������!�����������2#������!#'������������� � Analiza wymagań ................................................................................................................155Implementacja......................................................................................................................156Użycie ..................................................................................................................................160Uwagi...................................................................................................................................162Podziękowania .....................................................................................................................162

Rozdział 1.19 =���#$����#�!��2#���"�*��!#'�"�#�� �������������������������������������������� ���Pseudolosowość ...................................................................................................................163Rzeczywista losowość .........................................................................................................164

Page 5: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

6 ���� � �������� ���������������������������������������

Źródła losowych wartości ....................................................................................................164Źródła sprzętowe..................................................................................................................165Funkcja mieszająca ..............................................................................................................165Ograniczenia ........................................................................................................................166Implementacja......................................................................................................................166Jak losowe wartości uzyskujemy z GenRand? ....................................................................167Bibliografia ..........................................................................................................................168

Rozdział 1.20 �!����!*������"������"������ � �������!�$�2#����"�#������$ ��������������������������������������� ��(Sposób Blooma ....................................................................................................................169Możliwe zastosowania .........................................................................................................170Jak to działa?........................................................................................................................170Definicje...............................................................................................................................170Pierwszy przykład................................................................................................................171Drugi przykład .....................................................................................................................175Uwagi końcowe ...................................................................................................................175Wnioski ................................................................................................................................176Bibliografia ..........................................................................................................................176

Rozdział 1.21 6�������* ����$0#!� �*�#����� ��������-�9������6�>������������!#�0#����#$����������������������������������������������������������� ���Eksport .................................................................................................................................178Bibliografia ..........................................................................................................................187

Rozdział 1.22 �!����!*�����������������!#'�����#'����������������������������� �5(Inicjalizacja okna przechwytywania danych z kamery........................................................189Manipulacja danymi z kamery.............................................................................................194Wnioski ................................................................................................................................197Bibliografia ..........................................................................................................................198

������������� �����������������������������������������������������������������������������������

� �������� �������������������������������������������������������������������������������������� :7�

Rozdział 2.1 9���#������"�#���������� ���#����!��?� � ����!�$�2#����*��������<,,,��������������������������������������� :7�Wprowadzenie .....................................................................................................................203Format IEEE liczb zmiennoprzecinkowych ........................................................................204Sztuczki liczb zmiennoprzecinkowych................................................................................205Liniowa tablica przeglądowa dla funkcji sinus i kosinus ....................................................210Optymalizacja logarytmiczna pierwiastka kwadratowego ..................................................212Optymalizacja dowolnych funkcji .......................................................................................213Mierzenie wydajności ..........................................................................................................216Wnioski ................................................................................................................................217Bibliografia ..........................................................................................................................217

Rozdział 2.2 9���#����������������� �*�#�!���������������������������������������������������� :�(Wysokość względem płaszczyzny kolizji............................................................................219Szukanie punktu kolizji .......................................................................................................220Odległość do punktu zderzenia............................................................................................221Odbicie od płaszczyzny kolizji ............................................................................................222Zderzenia z tłumieniem .......................................................................................................225Interpolacja w poprzek linii lub płaszczyzny ......................................................................225

Page 6: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Rozdział 2.3 9�!��������"*�!#��� ���#�������$�!�����!#'�"���������������������� ::�Co czyni ten algorytm elastycznym? ...................................................................................228Sformułowanie problemu ....................................................................................................228Wyprowadzenie równań zwięzłego rozwiązania.................................................................230Obsługa odcinków ...............................................................................................................236Opis implementacji ..............................................................................................................239Możliwości optymalizacji....................................................................................................239Wnioski ................................................................................................................................240Bibliografia ..........................................................................................................................240

Rozdział 2.4 ����2"����������$���$������� ���������������������������������������������������������� :+�Szczególne przypadki ..........................................................................................................243Optymalizacja implementacji ..............................................................................................248Podsumowanie .....................................................................................................................249

Rozdział 2.5 )�����* ���������"��������������������������������������������������������������� : �Metoda .................................................................................................................................252Wnioski ................................................................................................................................255Bibliografia ..........................................................................................................................255

Rozdział 2.6 =������2#��3���%�����$0#����������#'������������������������������� : �Wprowadzenie .....................................................................................................................257Interpolacja położenia..........................................................................................................258Interpolacja obrotu ...............................................................................................................259Kierunek obrotu i selektywna negacja.................................................................................260Interpolacja krzywymi sklejanymi dla kwaternionów.........................................................261Osobliwości w wymiernym przekształceniu .......................................................................262Cięcia kamery ......................................................................................................................262Kod.......................................................................................................................................263Bibliografia ..........................................................................................................................263

Rozdział 2.7 )�����#!$����� ������!�����?�*�!����"���!��������#$��������@��������������������������������������������������� :� Inne zastosowania ................................................................................................................266Słaby punkt algorytmu.........................................................................................................270Znajdowanie par będących w kolizji ...................................................................................271Złożoność czasowa ..............................................................................................................273Wnioski ................................................................................................................................274Bibliografia ..........................................................................................................................274

Rozdział 2.8 ���������������"� ������������������������������������������������������������������������ :� Fraktal plazmowy ................................................................................................................276Fraktal błędny ......................................................................................................................276Fraktal ruchu Browna ..........................................................................................................277Implementacja......................................................................................................................278Wykorzystanie FBM............................................................................................................281Bibliografia ..........................................................................................................................282

����������������������������� � �����������������������������������������������������������!"�

� �������� �������������������������������������������������������������������������������������� :5

Rozdział 3.1 9��������� �!�"��#$��*���#��$����"���#$� ������������������������������������ :5�Strategia 1.: Używaj zachowania sterowanego zdarzeniami, a nie odpytywania................287Strategia 2.: Redukuj niepotrzebne obliczenia ....................................................................288Strategia 3.: Centralizuj współdziałanie za pomocą zarządców ..........................................289

Page 7: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

8 ���� � �������� ���������������������������������������

Strategia 4.: Rzadziej uruchamiaj sztuczną inteligencję......................................................289Strategia 5.: Rozłóż przetwarzanie na kilka klatek..............................................................290Strategia 6.: Wprowadź poziomy szczegółowości sztucznej inteligencji............................290Strategia 7.: Rozwiązuj tylko część zagadnienia .................................................................291Strategia 8.: Najcięższą pracę wykonuj poza pętlą czasu rzeczywistego ............................291Strategia 9.: Używaj pojawiających się zachowań, by unikać skryptów.............................292Strategia 10.: Amortyzuj koszty odpytywań za pomocą ciągłego księgowania..................292Strategia 11.: Jeszcze raz przeanalizuj problem ..................................................................293Wnioski ................................................................................................................................293Bibliografia ..........................................................................................................................294

Rozdział 3.2 6�����0����*���#��$����"���#$������������! ������������������������������������ :( Prostszy sposób....................................................................................................................297Mikrowątki...........................................................................................................................297Zarządzanie stosem..............................................................................................................299Problemy..............................................................................................................................300Wniosek ...............................................................................................................................301Bibliografia ..........................................................................................................................301

Rozdział 3.3 /��0�����*���#�0����"���#$0��� ���#0�������0������������� �7�Kawałek po kawałku............................................................................................................303Dobre zachowanie................................................................................................................304Wszystko jest w umyśle.......................................................................................................305Problemy..............................................................................................................................307Wnioski ................................................................................................................................309Bibliografia ..........................................................................................................................310

Rozdział 3.4 ��#'����������"�$����� �"�#�@�����#'�)A9 ����������������������������� ���Polecenia gier RTS ..............................................................................................................311Kolejkowanie poleceń..........................................................................................................312Polecenia cykliczne..............................................................................................................313Wnioski ................................................................................................................................316Bibliografia ..........................................................................................................................316

Rozdział 3.5 �!*����!�$!�*!*��������#��2#����!*�������� ��!��*���#' ����������������������������������������������������� ���Ogólne przedstawienie zagadnienia.....................................................................................317Definicje...............................................................................................................................318Komponent 1.: Mapy widoczności dla poszczególnych graczy ..........................................319Komponent 2.: Szablony linii widoczności .........................................................................319Komponent 3.: Połączona mapa widoczności .....................................................................321Usprawnione wyszukiwanie ................................................................................................322Wnioski ................................................................................................................................324

Rozdział 3.6 6 !�� �!�� ���������������������������������������������������������������������������������������� �: Mapy wpływu ......................................................................................................................325Prosta mapa wpływu............................................................................................................326Dane komórki mapy wpływu...............................................................................................327Obliczanie potrzebnych wartości.........................................................................................328Określanie optymalnego rozmiaru komórki ........................................................................330Rozchodzenie się wpływów.................................................................................................330Branie pod uwagę kształtu terenu........................................................................................331Szczególne okoliczności ......................................................................................................333Odświeżanie mapy wpływu .................................................................................................333Mapy wpływu w trójwymiarowych środowiskach..............................................................334Bibliografia ..........................................................................................................................335

Page 8: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Rozdział 3.7 A�#'�����#�!�*������#��$ ��������������������������������������������������������������� ���Drzewo przydziału zasobów................................................................................................337Obliczanie pożądanego przydziału ......................................................................................339Określanie aktualnego przydziału........................................................................................339Podejmowanie strategicznych decyzji .................................................................................340Miary wartości .....................................................................................................................341Graf zależności ....................................................................................................................341Węzły grafu zależności ........................................................................................................342Ekonomiczne planowanie ....................................................................................................342Znajdowanie czułych zależności .........................................................................................343Wnioskowanie strategiczne .................................................................................................343Osobowość postaci ..............................................................................................................344Łączymy wszystko razem....................................................................................................345Bibliografia ..........................................................................................................................345

Rozdział 3.8 �"��������������$�!�����!#'���#'��#$��������������������������������� �+�Reprezentacja terenu, która pozwoli go zrozumieć i przeanalizować .................................348Punkty kontrolne..................................................................................................................348Przykładowy teren i potrzeby sztucznej inteligencji ...........................................................349Analiza taktyczna.................................................................................................................349Od wartości taktycznych do właściwości punktów kontrolnych.........................................350Obliczanie właściwości punktów kontrolnych ....................................................................351Wiedza płynąca z doświadczenia zdobywanego w trakcie gry ...........................................354Umieszczanie analizy terenu w grze....................................................................................354Inne zastosowania ................................................................................................................355Wnioski ................................................................................................................................356Bibliografia ..........................................................................................................................356

Rozdział 3.9 )��*����������������"��$���������������0� �����������"�2#�������������������������������������������������������������� � �Definiowanie modelu zderzeń .............................................................................................358Znajdowanie drogi między wielokątami..............................................................................358Rozszerzaj i zwyciężaj.........................................................................................................359Suma Minkowskiego dla wypukłych wielokątów ...............................................................359Rozszerzanie niewypukłej geometrii ...................................................................................361Dobór kształtu zderzenia .....................................................................................................362Wnioski ................................................................................................................................363Bibliografia ..........................................................................................................................363

Rozdział 3.10 � �!�"��#$��$����������������0� ����������#��2#� ���� �� Znajdowanie drogi za pomocą punktów widoczności .........................................................366Przechowywanie najkrótszej ścieżki do każdego punktu ....................................................366Łączenie narożników ...........................................................................................................367Optymalizacja 2.: Rozważaj tylko ścieżki idące wokół narożników...................................368Strefy zarysu ........................................................................................................................368Używanie stref zarysu z podziałem przestrzeni...................................................................370Wnioski ................................................................................................................................370Bibliografia ..........................................................................................................................371

Rozdział 3.11 9����������B��� ��3�#!�������!��������������������������������������������������� ���Całkowicie nowy świat ........................................................................................................374Stada z zębami .....................................................................................................................377Ograniczenia i możliwe rozszerzenia ..................................................................................377Bibliografia ..........................................................................................................................378

Page 9: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

10 ���� � �������� ���������������������������������������

Rozdział 3.12 ���"!�������*��������!�!#'���$��!���%&& ��������������������������� ��(Dlaczego warto używać FuSM w grach? ............................................................................380Jak używać FuSM w grze? ..................................................................................................381Krótkie wprowadzenie do ogólnego automatu stanów skończonych z pierwszego tomu ......381Dostosowywanie oryginalnego automatu do FuSM w C++................................................382Teraz dodaj logikę rozmytą do własnych gier!....................................................................383Bibliografia ..........................................................................................................................383

Rozdział 3.13 /���$*������* "��$�������#$����*!*���#'�����!�!#'����������� �5 Problem................................................................................................................................385Rozwiązanie.........................................................................................................................386Konkretny przykład .............................................................................................................388Konkretny przykład w metodzie Combsa............................................................................390Wnioski ................................................................................................................................392Bibliografia ..........................................................................................................................392

Rozdział 3.14 C3!����*��#��������!#'�����#'�?�������!� ��!��� �������� �(�Gra .......................................................................................................................................393Wielowarstwowy perceptron ...............................................................................................394Dobór wejść .........................................................................................................................395Zbieranie danych..................................................................................................................396Trenowanie MLP .................................................................................................................397Wyniki .................................................................................................................................398Wnioski ................................................................................................................................399Bibliografia ..........................................................................................................................399

�������#�$��%&�������� ���% �������������������������������������������������������'(�

� �������� �������������������������������������������������������������������������������������� +7�

Rozdział 4.1 ��������������D<6����������������������������������������������������������������������� +7 Czynniki...............................................................................................................................405„Czysta” metoda VIMP .......................................................................................................407Paski pomijane.....................................................................................................................410Wielopoziomowe paski pomijane........................................................................................411Tryb mieszany VIMP...........................................................................................................413Tryb mieszany pasków pomijanych ....................................................................................414Przesuwane okno .................................................................................................................414Podsumowanie .....................................................................................................................418Bibliografia ..........................................................................................................................418

Rozdział 4.2 C �*�#������������ ���#0������������� ������������������������ +�(Zabawa z kratkami...............................................................................................................420Tworzenie mapy ..................................................................................................................421Szablony kratek....................................................................................................................422Brzydko, brzydko, brzydko .................................................................................................422Lepiej, szybciej, silniej ........................................................................................................424Wnioski ................................................................................................................................424Bibliografia ..........................................................................................................................425

Rozdział 4.3 -�������"��"�*�!�����������2"������#��2#�E�!��#��������!*�����������*����� ��������������������������������������� +:�Kule otaczające ....................................................................................................................427Używanie drzew kul ............................................................................................................428Przykładowa aplikacja .........................................................................................................429

Page 10: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Rozdział 4.4 9��� ��*����������*��2#������#�$0#!#'����"���!#'�����*� ����������������������������������������������������������������������������� +��Krótki przegląd sposobów hierarchicznego sortowania ......................................................431Drzewa AABB.....................................................................................................................432Tworzenie drzew AABB .....................................................................................................433Kompresja drzew AABB.....................................................................................................433Aproksymacja wymiarów ....................................................................................................434Wykorzystywanie rekurencji ...............................................................................................435Wydajność w trakcie działania ............................................................................................435Dalsze rozszerzenia..............................................................................................................436Bibliografia ..........................................................................................................................436

Rozdział 4.5 ����*��������������#���������������� �2��������*�� �� ������ +��Gdzie idzie wydajność .........................................................................................................438Usuwanie pośredników........................................................................................................439Warunki i wymagania ..........................................................................................................439Określanie poziomu drzewa.................................................................................................440Dostosowywanie do sytuacji ...............................................................................................442Określanie położenia............................................................................................................443Przemieszczanie się po drzewie czwórkowym....................................................................444Dostosowywanie drzewa czwórkowego..............................................................................444

Rozdział 4.6 � ���*!�#$����@�������#' ����������������������������������������������� ++ Obserwacja akwarium..........................................................................................................445Poprawa realizmu ................................................................................................................448Wniosek ...............................................................................................................................448

Rozdział 4.7 )����������������������!#'���������"#��2#���$0#�$�*������������������������������������������������������� ++(Podstawowy algorytm..........................................................................................................450Uwagi i ewentualne problemy .............................................................................................452Zakończenie .........................................................................................................................452Bibliografia ..........................................................................................................................452

Rozdział 4.8 9��*�����2"�����"�����"!#'� ������#'� ������������������������������ + �Algorytm..............................................................................................................................453Przycinanie trójkątów ..........................................................................................................455Implementacja......................................................................................................................456Bibliografia ..........................................................................................................................456

Rozdział 4.9 )���������"����$�*#������$������ ��������������������������������������������������� + (Podstawowa metoda ............................................................................................................459Rozdzielczość tła .................................................................................................................459Rozmiar sześcianu tła ..........................................................................................................460Rendering sceny...................................................................................................................461Sześcienne mapowanie środowiska .....................................................................................461Tworzenie tekstur tła ...........................................................................................................462Wniosek ...............................................................................................................................462Kod źródłowy ......................................................................................................................462

Rozdział 4.10 ��*�#������#$0#���*������#��@������������������������������������������������������ +��Wcześniejsze metody...........................................................................................................463Podział geometrii postaci.....................................................................................................463Rendering tekstury...............................................................................................................464Rendering postaci ................................................................................................................464Wniosek ...............................................................................................................................465Bibliografia ..........................................................................................................................465

Page 11: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

12 ���� � �������� ���������������������������������������

Rozdział 4.11 9������������#$��� ��!#$������#��$��*��!�������9� ���6�����+ �������������������������������������������������������������������������� +��Ustawienia ...........................................................................................................................467Konwersja wejścia kontrolera..............................................................................................468Obrót postaci........................................................................................................................469Przesuwanie postaci .............................................................................................................470Animacja postaci..................................................................................................................471Analiza animacji Super Mario 64 ........................................................................................473Wniosek ...............................................................................................................................474Bibliografia ..........................................................................................................................474

������#�)��������������*��� ��������������������������������������������������������������'+�

� �������� �������������������������������������������������������������������������������������� +��

Rozdział 5.1 )����������*������?��!��!���������������������*!"��������#�*������#�!��*�!������������������������ +�(Twórca zarysów...................................................................................................................479Ważne krawędzie .................................................................................................................480Metody wykrywania krawędzi sylwetki ..............................................................................481Wyciąganie rysunku w tuszu bazujące na krawędziach ......................................................481Wyciąganie rysunku w tuszu za pomocą programowanego shadera wierzchołków ...........483Wyciąganie rysunku w tuszu za pomocą zaawansowanych funkcji tekstur........................485Wniosek ...............................................................................................................................486Bibliografia ..........................................................................................................................486

Rozdział 5.2 )����������*�������� ���#0�� �������*����� �������!#'�*'�����������#'������������������������������������������ +5�Cieniowanie w kreskówkach ...............................................................................................487Malowanie ...........................................................................................................................488Programowane shadery wierzchołków ................................................................................491Wniosek ...............................................................................................................................493Bibliografia ..........................................................................................................................493

Rozdział 5.3 6����!��!��#������2����"����"� ��*�"���������������������������������� +( Trójwymiarowe tekstury w dynamicznym oświetlaniu.......................................................495Mapowanie nierówności dot3 ..............................................................................................498Normalizacja za pomocą map sześciennych........................................................................501Światła stożkowe bazujące na pikselach .............................................................................502Bibliografia ..........................................................................................................................503

Rozdział 5.4 A�������� ��#����"!#'�#'����� ���#0���������#�!#'����#�"��#$0��-��������������������������������� 7 Właściwości chmur..............................................................................................................505Generator liczb losowych ....................................................................................................506Animacja oktawy szumu......................................................................................................508Mapowanie na geometrię nieba ...........................................................................................511Dodatkowe funkcje ..............................................................................................................511Ograniczenia sprzętowe.......................................................................................................512Uzyskiwanie większej uniwersalności.................................................................................513Wnioski ................................................................................................................................513Bibliografia ..........................................................................................................................514

Page 12: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Rozdział 5.5 6*���������*������#�"�� ��!* ��*�����!*����������*�#������������������������������������������������������������������������������������������ � Zasłanianie efektu soczewki ................................................................................................515Problemy sprzętowe.............................................................................................................516Maskowanie tekstur .............................................................................................................518Uwagi co do wydajności......................................................................................................519Usprawnienia .......................................................................................................................520Przykładowy kod .................................................................................................................520Alternatywne podejścia........................................................................................................521Bibliografia ..........................................................................................................................521

Rozdział 5.6 ����!#���#������ ����������#'� ����!�����!#'�������������������� :�Porównanie buforów priorytetowych z buforami głębi .......................................................525Rozwiązywanie problemów z aliasingiem ..........................................................................526Metody hybrydowe ..............................................................................................................528Podsumowanie .....................................................................................................................529Bibliografia ..........................................................................................................................529

Rozdział 5.7 �*��2#��?��������2���#� ������������������������������������������������������������� ��Cały proces ..........................................................................................................................532Rendering oszusta ................................................................................................................532Heurystyka aktualizacji........................................................................................................536Wydajność ...........................................................................................................................538Przewidywanie.....................................................................................................................538Podsumowanie .....................................................................................................................539

Rozdział 5.8 -�������* ���#��� ���"$0#�� ��#����"0���#$�����*��� ����������������������������������������������������� +�Operacje sprzętowe..............................................................................................................542Dalsza praca .........................................................................................................................551Podziękowania .....................................................................................................................552Przykładowy kod .................................................................................................................552Bibliografia ..........................................................................................................................552

������#����� ������&,�������������������������������������������������������������

� �������� ��������������������������������������������������������������������������������������

Rozdział 6.1 ����#�� ��$��������� �����������F����������#'���������������� �Most .....................................................................................................................................557Fasada ..................................................................................................................................558Złożenie ...............................................................................................................................559Pośrednik .............................................................................................................................559Dekorator .............................................................................................................................560Polecenie ..............................................................................................................................560Pamiątka...............................................................................................................................561Obserwator...........................................................................................................................561Wielka kula błota (zwana także kodem spaghetti) ..............................................................562Wniosek ...............................................................................................................................563Bibliografia ..........................................................................................................................563

Rozdział 6.2 6������!#'��*������� ��������3!#�����*����*!������������$0#!��� ����#'������������������������������������������� � Problem................................................................................................................................565Pomysł na rozwiązanie ........................................................................................................566Rozwiązanie.........................................................................................................................567Wniosek ...............................................................................................................................568

Page 13: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

14 ���� � �������� ���������������������������������������

Rozdział 6.3 ���������������!�-9� ����������������������������������������������������������������������� �(Filtrowanie ...........................................................................................................................569Splot .....................................................................................................................................570Opóźnienie ...........................................................................................................................571Interpolacja ..........................................................................................................................572Bibliografia ..........................................................................................................................572

Rozdział 6.4 <�����!�!� ����� �����������#!����!���F����� ���������������� � Wprowadzenie .....................................................................................................................575Dyskusja...............................................................................................................................578Kod.......................................................................................................................................580Dodatkowy komentarz .........................................................................................................583Wniosek ...............................................................................................................................584

Rozdział 6.5 ���*�!�*����*������!����"����� ������������������������������������������������������� 5 Strumieniowanie kontra sekwencjonowanie .......................................................................585Podstawowe koncepcje komputerowej muzyki ...................................................................586Implementacja komputerowego sekwensera muzyki ..........................................................589Sterowanie syntezą dźwięku................................................................................................596Kod.......................................................................................................................................596Wnioski ................................................................................................................................596Bibliografia ..........................................................................................................................596

Rozdział 6.6 9����*���������!��$����!����"����� ������������������������������������������ (�Powiązania muzyczne..........................................................................................................597Znaczenie muzyki ................................................................................................................598Przejścia ...............................................................................................................................598Rodzaje przejść ....................................................................................................................598Czułość sterowania ..............................................................................................................601Sterowanie docelowe ...........................................................................................................601Przykłady projektów ............................................................................................................602Kod.......................................................................................................................................604Wniosek ...............................................................................................................................604Bibliografia ..........................................................................................................................605

Rozdział 6.7 <�����$*� ������*�!#�!��*������ ��������"��F��������������������� �7�Podstawowe klasy................................................................................................................607

-&������������������������������������������������������������������������������������������������������.(�

9������������������������������������������������������������������������������������������������������� ���

Page 14: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Rozdział 5.4

�������������� ���������� �������������������������������������

������������� ��

[email protected]

W wielu grach akcja rozgrywa się na zewnątrz budynków, a środowisko przypomina

Ziemię. Z tego powodu realistyczny rendering terenu stał się jakby świętym Graalem

dla wielu twórców gier. Niestety, na modelowanie nieba i chmur nie zwraca się tyle

uwagi, ile się im należy. Chmury to przeważnie jedna lub dwie warstwy statycznych,

przesuwanych tekstur. Na pierwszy rzut oka wszystko jest w porządku, ale po dłuższej

chwili zauważamy ich powtarzalność, a po dniu grania zacznie nas ona nudzić.

W tym rozdziale zajmiemy się proceduralnie tworzonymi teksturami chmur, które po-

siadają pewne właściwości rzeczywistych chmur. Ponieważ tekstury przeważnie znaj-

dują się w pamięci podsystemu graficznego, będziemy chcieli je generować prawie

wyłącznie za pomocą procesora graficznego. Dodatkowo omówimy kilka modyfikacji

techniki pod względem zmiany jakości i wydajności, by dostosować ją do różnych sys-

temów.

�������������� �

Dokładnie przyglądając się charakterystyce rzeczywistych chmur, stosunkowo łatwo

można utworzyć listę posiadanych przez nie cech. Oczywiście, jak w każdej metodzie

czasu rzeczywistego, będziemy musieli poświęcić kilka z tych funkcji na rzecz szybko-

ści, ale tym będziemy się przejmować później.

Page 15: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

506 ��� �������� ��� �������������

Oto kilka spraw, które można zauważyć od razu:

� Chmury są animowane. Po niebie przesuwa je wiatr, ale to nie wszystko:ich kształt zmienia się lub „ewoluuje” w czasie (można to łatwo zauważyćna dowolnych zdjęciach wykonanych w stałych odstępach czasu). Co więcej,liczba chmur na niebie cały czas się zmienia. To rozważanie prowadzi naddo trzech zmiennych: szybkość symulacji, szybkość wiatru i dodatkowegoelementu opisującego zachmurzenie.

� Mniejsze elementy zmieniają się szybciej od większych (dotyczy zmiany kształtu).

� Chmury wykazują ogromne samopodobieństwo w swojej strukturze.

� Poziom zachmurzenia zmienia się od pełnego do czystego nieba z tylko kilkomaodosobnionymi chmurkami (lub całkowitym ich brakiem). Gdy zmienia sięzachmurzenie, wygląd chmur także ulega zmianie. Dla zachmurzenia chmurystają się szare i ciemne, a dla pogodnego nieba są białe z przebłyskaminiebieskiego nieba.

� Chmury to trójwymiarowe istoty. Są oświetlane przez słońce z jednej strony, a cieńrzucają z drugiej. W mniejszej skali jest jeszcze trudniej, ponieważ chmury rzucającienie na inne chmury i odbijają promienie świetlne we wszystkich kierunkach.

� Chmury wyglądają całkowicie inaczej przy wschodzie i zachodzie słońca,ponieważ słońce oświetla je z boku, a w skrajnych przypadkach nawet z dołu.

� Chmury mają tendencję do pływania na wspólnej wysokości, formując warstwy.Czasem tych warstw jest kilka. Ponieważ warstwy te zachowują stałą wysokośćnad krzywizną Ziemi, wykorzystamy tę krzywiznę w obliczaniu warstw chmur.

... a to tylko część spostrzeżeń obserwatora patrzącego z Ziemi. W grach takich jak sy-mulator lotu, gdzie możemy wlatywać w chmury, pojawia się wiele dodatkowychutrudnień. W tym rozdziale pozostaniemy na Ziemi.

���������������� �����

Jak w przypadku prawie każdej proceduralnej tekstury, musimy zacząć od określeniageneratora pewnego rodzaju szumu. Szum to termin używany do określenia czegoś, cojest z natury losowe. Szumem może być na przykład funkcja, która po podaniu szeregulicz całkowitych (czyli 1, 2, 3...) utworzy pozornie losowy szereg wyników (na przykład0,52, –0,13, –0,38...). Pozornie losowy, ponieważ dla takiego samego wejścia wyjścioweliczby zawsze będą takie same. Takie funkcje nazywamy pseudolosowymi, ponieważstosując to same ziarno, możemy odtworzyć te same wyniki. Dodatkowo szum ma częstookreślony wymiary (na przykład dwu- lub trójwymiarowy szum). Odnosi się do liczbywejść przekształcanych na losową wartość — tworzymy po prostu wielowymiarową ta-blicę. Jeden z wymiarów jest skalowany przez pewien stosunkowo duży czynnik (prze-ważnie liczbę pierwszą), aby zminimalizować możliwość powtarzania się ciągów liczb.

Tworzenie losowych (lub pseudolosowych) liczb to bardzo rozległy temat. Każde podej-ście to równowaga między złożonością funkcji a jakością wyników. Dobre generatoryliczb losowych dobrze rozkładają losowe wartości po całym przedziale i nie powtarzająsię przez bardzo długi czas.

Page 16: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Na szczęście na potrzeby tego rozdziału wystarczy bardzo prosty generator liczb loso-wych. Gdy poznasz dokładnie tę technikę, dowiesz się, że generator liczb losowych bę-dziemy wywoływali kilka razy na piksel z różnymi wartościami ziarna. Połączenie wy-ników zamaskuje pojawiającą się powtarzalność.

Generator liczb pseudolosowych, od którego zaczniemy, przedstawia wydruk 5.4.1.Wykorzystuje on liczbę podaną jako parametr (x) w wielomianie, którego współczynnikisą mnożone przez duże liczby losowe. W ten sposób uzyskujemy znacznie mniejsząpowtarzalność wartości. Maskujemy bit znaku, dzielimy liczbę do zakresu 0 – 2, a na-stępnie odejmujemy ją od jedynki, by otrzymać przedział od –1 do 1.

��������� Prosty generator liczb pseudolosowych

����������� ���������������������

��� �������������������� ��������������������� ����������������������

����� � ���!"��#�����$����$����������%���������%���������&�����������'��"���(���(!"�)

W przypadkach, w których używamy kilku oktaw, możesz zwiększyć „losowość” gene-ratora, tworząc tablicę liczb pierwszych i używając różnych wartości ������ i ������w zależności od oktawy. Dla naszych celów wykorzystanie tylko jednego zestawu liczbpierwszych jest wystarczające.

Ponieważ chcemy zaimplementować generator w procesorze graficznym, który nie po-zwala na wykonanie całego kodu z wydruku 5.4.1, utworzymy tablicę przeglądową tejfunkcji jako mapę tekstury 512×512. Wykorzystanie takiej mapy daje nam około 260tysięcy wpisów, zanim funkcja zacznie się powtarzać. Wykorzystamy tę teksturę jakogenerator liczb losowych, kopiując fragmenty tej tekstury do docelowej tekstury i uży-wając losowego przesunięcia współrzędnych tekstury wygenerowanego przez oprogra-mowanie. Przedstawia to rysunek 5.4.1. Kopiowanie wykorzystuje kartę graficzną, abyzrenderować na wielokącie losową teksturę ze źródłowej.

�� �������a) Tekstura stanowiącatablicę przeglądowąlosowych liczb;b) Wygenerowanatekstura szumu 32×32

�������������� ������

Ken Perlin po raz pierwszy zastosował szum o ograniczonej zmianie jako metodę renderin-gu. Szum o ograniczonej zmianie jest ograniczony do pewnego zakresu częstotliwości,który można rozumieć jako maksymalną zmianę między próbkami. W naszym przypadku

Page 17: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

508 ��� �������� ��� �������������

oznacza to możliwość utworzenia losowych liczb z maksymalną zmianą miedzy nimi,a co za tym idzie, gładką interpolację losowych próbek. Do interpolacji możemy wyko-rzystać filtrowanie dwuliniowe karty graficznej. W ten sposób pozbędziemy się skła-dowych o wysokich częstotliwościach i uzyskamy gładkie, bardziej naturalne przejścia.Patrz rysunek 5.4.2.

�� �������a) Próbkowanie teksturystanowiącej tablicę przeglądowąlosowych liczb w celu utworzeniatablicy szumu. b), c) Używajączwiększania próbkowaniai filtrowania tworzymy szumo ograniczonej zmianie w docelowejrozdzielczości (docelowymzakresie częstotliwości)

Warto wspomnieć, że w pewnych przypadkach, wykorzystując szum do tworzenia pro-ceduralnej zawartości, interpolacja dwuliniowa nie jest odpowiednia i trzeba skorzystaćz lepszej metody filtrowania, by osiągnąć pożądany wynik. Na szczęście w tym przy-padku niska jakość filtrowania dwuliniowego jest wystarczająca.

Utworzona w ten sposób tablica szumu daje nam pojedynczy podstawowy szum o danejczęstotliwości. Będziemy go nazywać oktawą szumu, ponieważ w dalszej części roz-działu połączymy kilka oktaw (mnożenia o tej samej częstotliwości) razem. Najpierwjednak będziemy musieli zająć się animacją tablicy szumu.

!������������� � �

Jeśli chcemy animować oktawę szumu, pomyślmy o czasie jak o trzecim wymiarze, zapomocą jakiego możemy indeksować generator liczb losowych. Możemy to wykonaćna karcie graficznej, co jakiś czas zapamiętując aktualny szum, tworząc nowy i inter-polując między nimi od jednego uaktualnienia do drugiego. Szybkość uaktualnień tek-stury określa częstotliwość w trzecim wymiarze.

Interpolację przedstawia rysunek 5.4.3. Jest to jedyny przypadek, gdzie wykorzystanieinterpolacji liniowej nie jest idealne, ponieważ szum jest bardziej „skupiony” w rze-czywistych punktach próbkowania. Jak się jednak za chwilę przekonasz, problem tennie jest widoczny w końcowym efekcie, ale warto o nim pamiętać. Jeśli chcemy po-święcić wydajność rysowania, możemy obliczać oktawy dla wielu punktów w czasiei używać lepszej interpolacji w celu uzyskania lepszych wyników.

�� �������Interpolacja między uaktualnieniamiszumu w celu animacji oktawy.Wynik = WcześniejszaAktualizacjia

∗ (1 – (T1 – T0)/(T2 – T0)) +

NowaAktualizacja ∗ (T1 – T0)/(T2– T0). T0 to czas wcześniejszejaktualizacji, T2 to czas nowejaktualizacji, a T1 to aktualny czasmiędzy aktualizacjami

Page 18: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

������ ��������� ������������������ ��������

Popularną metodą używaną przy tworzeniu proceduralnych tekstur jest sumowanie

fraktalne, które polega na sumowaniu skalowanych harmonicznych podstawowej funk-

cji szumu. Z takiej operacji powstaje fraktal ruchu Browna, który jest bardzo popularny

w wielu technikach renderingu, na przykład fraktalnego terenu i wielu typów procedu-

ralnych tekstur. Sumę fraktalną przedstawia równanie 5.4.1. a określa sposób przecho-

dzenia przez spektrum częstotliwości (a ma przeważnie wartość 2, czyli utrzymujemy f,

2f, 4f, ...), a b określa amplitudę dodawanego elementu z szeregu.

∑−

=

=

1

0

)()(

N

k

k

k

b

xaSzumxSzum (5.4.1)

Na szczęście wartość 2 dla a jest zarówno powszechnie używana w generatorach proce-

duralnych tekstur, jak i dobrze obsługiwana przez sprzęt, ponieważ możemy po prostu

zaimplementować oktawy szumu jako szereg map tekstur o rozmiarach będących kolej-

nymi potęgami 2.

Wartość 2 dla b także jest powszechnie używana i upraszcza naszą implementację. Zło-

żenie oktaw szumu można wykonać, przeprowadzając kilka przebiegów renderingu

z prostym mieszaniem (patrz pseudokod z wydruku 5.4.2).

��������� Złożenie oktaw szumu

''�*� +�,-�,��./���0�/�������1��1�2� ��� ��13��4�+3 �5��+�6�1�21�����"�#��!''�*��� ���+�7/����%��'��%��'(�%�!!!)� ����'��%��'(�%�!!!)������./���0�/������"!�������0��/���. ����"!"������������� �8/��9�:���0��/���. ����0��/���. �$"!��%�./���0�/����$���:�8/��9�� �8/��9�:#��)

Rysunek 5.4.4 przedstawia proces animacji różnych oktaw między aktualizacjami i łą-

czenia ich w jedną teksturę burzliwego szumu.

����� � ������������

Mamy teraz mapę tekstury z animowanym szumem z turbulencjami i musimy wykonać

kilka kroków, by przekształcić ją na chmury. Idealnie byłoby wykorzystać szum jako

wejście pewnego rodzaju funkcji wykładniczej, uzyskując ostry „poziom skroplenia”,

powyżej którego chmury są widoczne. Ponieważ jednak nie mamy dostępu do takiej

operacji w procesorze grafiki, skorzystamy z innej metody. Istnieje kilka sposobów po-

radzenia sobie z sytuacją.

Najprostsze podejście to odejmowanie. Odejmujemy określoną wartość od tekstury

i przycinamy wynik od dołu do 0. W ten sposób uzyskujemy pojedyncze chmury (patrz

rysunek 5.4.5).

Page 19: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

510 ��� �������� ��� �������������

�� ������ Połączenie kilku oktaw animowanego szumu

�� �������Odejmowaniestałej wartościw celu otrzymaniapojedynczych chmur

Niestety, w ten sposób tracimy część dynamicznego zakresu dla chmur, które pozostały.

Możemy to skompensować, zwiększając nasycenie i mnożąc kolory wierzchołków. Te-

go sposobu używamy w przykładowym kodzie.

Inna metoda polega na dodaniu kanału krycia do wszystkich omawianych do tej pory

warstw tekstur. Wykonamy tę samą operację odejmowania co wcześniej, ale na kanale

krycia, a następnie wykorzystamy test krycia do zamaskowania niektórych regionów

bez tracenia dynamicznego zakresu. W tej metodzie pojawia się jednak inny rodzaj pro-

blemu. Ponieważ test krycia jest wykonywany przed filtrowaniem, pojawią się ostre

krawędzie, jeśli nie skorzystamy z tekstury o naprawdę wysokiej rozdzielczości.

Page 20: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

Jeszcze jedną metodą jest pewnego rodzaju przeglądanie tekstury, gdzie kolor teksturywpływa na położenie, w którym teksel jest umieszczany w kolejnym etapie. Przykłademtakiego zachowania może być tryb renderingu ���� �� obsługiwany przez niektórekarty w bibliotece DirectX. W przyszłości, gdy więcej kart będzie obsługiwało ten tryb,stanie się możliwe zakodowanie wykładniczej funkcji w mapie tekstury i przeglądaniejej w celu otrzymania wyniku.

"�����������������#�����

Po przygotowaniu tekstury chmury z rysunku 5.4.5 możemy ją mapować na geometrięnieba. Wybór geometrii zależy od aplikacji. W przykładowym programie używamy tzw.płaszczyzny nieba, która jest po prostu prostokątną siatką trójkątów z wierzchołkamiprzesuniętymi tak, że stanowią wycinek kuli. Wyobraź to sobie jak rzucenie skrawkapłachty na powierzchnię piłki plażowej. Nie jest to idealne rozwiązanie, ale mapowanietekstury jest proste. Płaszczyznę nieba przedstawia rysunek 5.4.6.

�� �������Geometria terenui płaszczyznanieba używanadla tekstury nieba

���������� �����

W tym momencie możemy wykonać wiele rzeczy z chmurami, w zależności od tego,jak wiele czasu procesora i karty graficznej możemy na to poświęcić. Kilka z tych pro-pozycji zostało zaimplementowanych w przykładowym kodzie; pozostałe to propozycjedalszych usprawnień dla Twoich implementacji. Oto kilka funkcji, które możesz dodać:

� Sterowany szumem kierunek wiatru i zachmurzenie. Pewne interesujące wynikimożna uzyskać, korzystając z innych funkcji szumu do modyfikacji pozostałychzmiennych w czasie, więc na przykład wiatr może zmieniać kierunek, a poziomchmur obniżać się i podwyższać w ciągu kilku godzin lub dni.

� Wytłaczać chmury, dodając wrażenie trójwymiarowości. Wymaga to jednakdodatkowego przebiegu i pewnych modyfikacji w wartościach UV wierzchołków.Wierzchołkom dodajemy drugi zbiór współrzędnych tekstury przesuwanychw zależności od kierunku słońca. Chmury są ciemniejsze po stronie przeciwnejdo słońca, a jaśniejsze po tej samej.

Page 21: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

512 ��� �������� ��� �������������

� Chmury mogą rzucać cień na ziemię. Wystarczy użyć wynikowej tekstury

z mieszaniem odejmującym. Teren musi posiadać inny zestaw współrzędnych

tekstury lub używać rzutowania tekstury.

� Modyfikować oświetlenie i (lub) intensywność efektu soczewki (lens flare).

Ponieważ wiemy, jak tekstura jest mapowana na geometrię i znamy kąt

nachylenia słońca, możemy policzyć dokładnie teksel lub grupę tekseli, które

znajdują się na linii widoczności względem słońca. Możemy w ten sposób

zmniejszać oświetlenie terenu lub czasowo wyłączać efekt soczewki. Zauważ,

że modyfikacja oświetlenia spowodowana większym zachmurzeniem zmniejsza

intensywność światła kierunkowego słońca, ale zwiększa oświetlenie ogólne,

ponieważ chmury rozpraszają promienie słońca we wszystkich kierunkach.

$����������� ��#����

Pozwolenie karcie graficznej na przeprowadzenie większości operacji w tej technice

umożliwia osiągnięcie większej wydajności niż w przypadku, w którym musielibyśmy

ręcznie blokować i modyfikować teksturę w każdej klatce. Niestety, takie podejście ma

także wady. Oto one:

� Obsługa renderingu do tekstury. Metoda przedstawiona w tym rozdziale

intensywnie korzysta z tej funkcji. Niestety, obsługa tej funkcji nie występuje

we wszystkich kartach graficznych. Wykrywanie obsługi staje się łatwiejsze

przy nowoczesnych interfejsach programistycznych, ale nadal nie jest pewne.

W przypadkach, gdy rendering do tekstury nie jest obsługiwany, można

skorzystać z kopiowania bufora ramki do tekstury, ale prawdopodobnie ucierpi

na tym wydajność.

� Ograniczona precyzja. Aktualnie istniejący sprzęt graficzny przechowuje

tekstury i renderuje docelowe wartości jako liczby całkowite, przeważnie 16

lub 32 bity na piksel. Ponieważ w zasadzie działamy na skali szarości, jesteśmy

ograniczeni do 8 bitów na piksel, a w najgorszym przypadku do 4! Ta druga

wartość jest bardzo mała, więc na pewno pojawią się błędy. Zauważ, że oznacza

to, że oktawy o wysokiej częstotliwości z tego powodu dodają tylko kilka bitów

do końcowego wyniku.

� Ograniczony dynamiczny zakres. Ponieważ liczby całkowite muszą

reprezentować dane z zakresu 0 – 1, jesteśmy zmuszeni wcześniej przeskalować

i przesunąć te wartości do odpowiedniego zakresu. Ponieważ nasza funkcja

szumu zwraca wartości w przedziale od –1 do 1, musimy je zmodyfikować,

by uzyskać pożądany zakres. Jest to dodatkowa praca, która powiększa błędy

powodowane przez ograniczoną precyzję.

� Ograniczone możliwości i polecenia procesora grafiki. Ubogie w instrukcje

procesory grafiki ograniczają nas co do tego, co możemy zrobić. Dobrze byłoby

prowadzić zaburzoną teksturę szumu do funkcji potęgowej, na przykład

wykładniczej, ale jesteśmy ograniczeni do prostych operacji arytmetycznych. Poza

tym intensywnie wykorzystujemy rendering do tekstury, który nie jest dostępny

na wszystkich kartach graficznych. Ponieważ jest pewne, że w przyszłości karty

graficzne będą bardziej zaawansowane, będziemy mieli mniej problemów.

Page 22: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

%�� ���������#� ��� ����� �������

Jeśli chcemy skorzystać z tej techniki w komercyjnym projekcie, a docelową platformą

jest komputer klasy PC (gdzie wydajność może się znacznie różnić), musimy zastano-

wić się nad uniwersalnością tego rozwiązania. Nawet jeśli docelowa platforma jest stała,

ale inne elementy gry wymagają większej uwagi, musimy mieć możliwość zmiany wy-

dajności kosztem jakości dla takich przypadków.

Oto kilka sposobów na modyfikację wydajności przedstawionej metody:

� Rozdzielczość tekstury. Rozdzielczość tekstury na różnych pośrednich etapach

można zmniejszyć, oszczędzając na pamięci i szybkości wypełniania trójkątów.

Zauważ, że nie chcemy zmniejszać głębi kolorów, ponieważ przy 16 bitach

na kolor jakość drastycznie spada.

� Częstość aktualizacji tekstury. Nie każda tekstura musi być aktualizowana

w każdej klatce. Szczególnie gdy szybkość symulacji nie jest duża, można

zrezygnować z aktualizacji w każdej kratce przedstawionej w przykładowym

kodzie.

� Liczba używanych oktaw. Przykładowy kod używa czterech oktaw szumu,

ale nawet trzy zapewniają dosyć dobre wyniki. Na bardzo szybkich systemach

można skorzystać z pięciu oktaw, by podnieść jakość grafiki.

���� ��

Rysunek 5.4.7 przedstawia wynikowe proceduralne chmury w przykładowym programie.

�� �������Wynik przykładowegoprogramu tworzącegoproceduralne chmury

Mamy nadzieję, że ten rozdział przybliżył Ci nieco techniki tworzenia proceduralnych

tekstur na przykładzie chmur oraz metody zrzucenia większości obliczeń na procesor

karty graficznej.

Page 23: Perełki programowania gier. Vademecum profesjonalisty. Tom 2

514 ��� �������� ��� �������������

Sprzęt graficzny staje się coraz szybszy i powoli możemy generować proceduralne tek-

stury w czasie rzeczywistym. Mamy nadzieję, że wyniki własnych eksperymentów

przedstawisz społeczności twórców gier.

&�����������

[Ebert98] Ebert D. S. i inni: Texturing and Modeling: A Procedural Approach, AP Pro-

fessional Inc., 1999.

[Elias99] Elias H.: Cloud Cover, dostępne w witrynie http://freespace.virgin.net/hugo.

elias/models/m_clouds.htm, zawiera czysto programową metodę podobną do przedsta-

wionej tutaj.

[Pallister99] Pallister K.: Rendering to Texture Surface Using DirectX 7, dostępne

w witrynie www.gamasutra.com/features/19991112/pallister_01.htm.