Wybrzeże Wyspiańskiego 27, 50-370 Wrocław

POLITECHNIKA WROCŁAWSKA WYDZIAŁOWY ZAKŁAD INFORMATYKI WYDZIAŁ INFORMATYKI I ZARZĄDZANIA

Zastosowanie technik teksturowania proceduralnego do modelowania zjawisk naturalnych i własności powierzchni
Tomasz Kustrzyński

Promotor: dr inż. Jerzy Sas

Ocena:

Wrocław 2002

Streszczenie
Niniejsza praca ma na celu przedstawienie niezależnej od systemów do grafiki fotorealistycznej biblioteki, zawierającej funkcje służące do symulacji zjawisk rzeczywistych przy użyciu tekstur proceduralnych. Opracowany został system do szybkiej i prostej edycji złożonych tekstur proceduralnych wykorzystujący stworzoną bibliotekę. System został zintegrowany z pakietem do grafiki fotorealistycznej LightWorks.

Abstract
The aim of this work is to present library that is independent on photorealistic graphics systems which contains functions used to simulate real-world phenomena by means of procedural texturing. The system using defined library have been designed that allows for quick and easy edition of complex procedural textures. The system have been integrated with LightWorks – photorealistic graphics package.

2

Spis treści
1. 2. WSTĘP ......................................................................................................................................................... 7 ELEMENTY GRAFIKI KOMPUTEROWEJ.......................................................................................... 9 2.1. PODSTAWOWE POJĘCIA GRAFIKI KOMPUTEROWEJ................................................................................. 9 2.2. HISTORIA TEKSTUR PROCEDURALNYCH .............................................................................................. 11 2.3. DEFINIOWANIE TEKSTUR PROCEDURALNYCH...................................................................................... 13 2.3.1. Definiowanie bibliotek tekstur proceduralnych............................................................................. 13 2.4. JAKOŚĆ TEKSTUR PROCEDURALNYCH ................................................................................................. 14 3. PRZEGLĄD STOSOWANYCH METOD SYMULACJI ZJAWISK NATURALNYCH .................. 17 3.1. KATEGORIE TEKSTUR PROCEDURALNYCH ROZWAŻANE W PRACY ....................................................... 17 3.2. TECHNIKI ZAAWANSOWANE................................................................................................................ 21 3.2.1. Szum Perlina ................................................................................................................................. 21 3.2.2. Wzory kamiennych murów............................................................................................................. 22 3.2.3. Wzory na skórze ssaków ................................................................................................................ 23 3.2.4. Komórkowe funkcje bazowe tekstur (cellular texture basis function) ........................................... 26 3.2.5. Podsumowanie .............................................................................................................................. 29 3.3. DOSTĘPNE KOMERCYJNIE BIBLIOTEKI DO TWORZENIA WZORÓW PROCEDURALNYCH ......................... 29 4. METODY I TECHNIKI WYKORZYSTANE W PRACY.................................................................... 33 4.1. FUNKCJA TEKSTURUJĄCA JAKO ZŁOŻENIE FUNKCJI BAZOWYCH ......................................................... 33 4.2. DRZEWA CIENIOWANIA ....................................................................................................................... 35 4.3. OPIS ZAIMPLEMENTOWANYCH ALGORYTMÓW .................................................................................... 35 4.3.1. Odwzorowanie nierówności powierzchni...................................................................................... 35 4.3.2. Szum Perlina ................................................................................................................................. 37 4.3.3. Podział przestrzeni według diagramu Voronoi ............................................................................. 40 4.4. AUTOMATYZACJA POSZUKIWANIA UŻYTECZNYCH WZORÓW PROCEDURALNYCH ............................... 49 4.4.1. Losowe parametry ......................................................................................................................... 49 4.4.2. Przeszukiwanie domeny parametrów ............................................................................................ 49 5. BIBLIOTEKA DO TWORZENIA TEKSTUR PROCEDURALNYCH TEXLIB.............................. 50 5.1. ARCHITEKTURA .................................................................................................................................. 50 5.1.1. Interfejs ......................................................................................................................................... 50 5.1.2. Moduły funkcjonalne systemu renderującego ............................................................................... 50 5.1.3. Biblioteka ...................................................................................................................................... 50 5.1.4. Interfejs graficzny.......................................................................................................................... 51 5.2. IMPLEMENTACJA - DIAGRAM KLAS...................................................................................................... 51 5.2.1. Diagramy klas ............................................................................................................................... 51 5.2.2. Opisy najważniejszych klas ........................................................................................................... 56 5.3. PROCESU RENDERINGU Z WYKORZYSTANIEM INTERFEJSU BIBLIOTEKI TEXLIB ................................... 58 5.3.1. Fazy procesu renderingu w bibliotece TexLib............................................................................... 59 5.4. INTERFEJS PROGRAMISTYCZNY-ROZSZERZANIE BIBLIOTEKI O NOWE WZORY...................................... 63 5.5. ZAWARTOŚĆ KONTEKSTU CIENIOWANIA W POPULARNYCH SYSTEMACH GRAFIKI FOTOREALISTYCZNEJ 64 5.5.1. 3dsMAX release3........................................................................................................................... 65 5.5.2. LightWorks .................................................................................................................................... 66 5.5.3. RenderMan .................................................................................................................................... 67 5.5.4. LightWave...................................................................................................................................... 68 5.5.5. Kontekst w bibliotece TexLib......................................................................................................... 68 5.6. WYBRANE SZCZEGÓŁY IMPLEMENTACYJNE ........................................................................................ 70 5.6.1. Wzory definiowane w bibliotekach DLL........................................................................................ 70 5.6.2. Ewaluacja drzewa cieniowania..................................................................................................... 71 5.6.3. Zapobieganie cyklom..................................................................................................................... 72 5.7. INTEGRACJA Z PAKIETEM LADS DO RENDERINGU FOTOREALISTYCZNEGO ......................................... 73 5.7.1. System do renderingu fotorealistycznego LightWorks................................................................... 73 5.7.2. Wykorzystanie biblioteki TexLib w procesie cieniowania systemu LightWorks ............................ 76 5.7.3. Przykładowa implementacja shadera LADS wykorzystującego TexLib ........................................ 77

3

............. Edytor drzew cieniowania ............................................ Spękana ziemia........ FORMAT PLIKU ZAPISU DRZEWA CIENIOWANIA (*.....1....2........... PROPOZYCJA ĆWICZENIA LABORATORYJNEGO.....1.......... OCENA JAKOŚCI ............2..........................................................6.. 102 7..................................................................2.........................................................R....................................... CEL I ZAKRES EKPERYMENTÓW.................................................5...............................................................................................................1.............................................2......................... 113 A...... 124 4 .................................................. Cel ćwiczenia........................................... Zadania .........................1...... 91 7..............................................................................................2..........3. PODSUMOWANIE .... 86 6................................... Warunki eksperymentu ..............1............. FUNKCJONALNOŚĆ APLIKACJI EDYTORA ............. 118 A...........2.................1...............................................................6............................................................1...............................................2..................... 113 DODATEK B..................... 123 Definicja powiązań.................... SYMULACJE ZJAWISK WYSTĘPUJĄCYCH W NATURZE ......................................................... 100 7.................. B...............................1........................................................ 90 7.....................3..... Rezultaty liczbowe ............................ 112 A.......................1.................................................1.. WYBRANE SZCZEGÓŁY IMPLEMENTACYJNE ................................................... 89 6.... 102 7......................................... B.....................1.............................................2........................Giger’a................................................................................2.....................................................................................................................................................3................................. 103 7.............. Format pliku *.......... Możliwe modyfikacje ćwiczenia ..........................1.............1................................................................................ 80 6........2............... 80 6.................. 92 7........................................................................................ 121 A............ 121 A................. 123 Definicja wartości ................................................ ZALECENIA DLA PROWADZĄCEGO .......................................5..... 90 6......... 118 A...............................2.....................................1.......6........3........................................... 113 A.................................................... Skóra wyprawiona......................................2...............................................................................1........................................ 91 7............. 121 A........ 104 7........................................... INSTRUKCJA DLA STUDENTÓW...................... 81 6........................................... Ocena ...................................................... BADANIA EKSPERYMENTALNE.................4..tree........... Skóra węża........................................................... B...........1........................... 87 6.................3.......................2.......................................................... Serializacja drzew cieniowania...... 123 Definicja wzorów.......................................................................................................................... Biblioteka do tworzenia drzew cieniowania ........................ 9.................. EDYTOR DRZEW CIENIOWANIA ...............2............................................................. Dodawanie i usuwanie wzorów i wartości ....... 123 B.............................3.............4................ 109 8.. Opis scen trójwymiarowych ........................ 81 6......... PODSUMOWANIE........................................................................ 91 7.5.............................7..................... 95 7................................2..................... Cienie kaustyczne ....PORÓWNANIA....................2................................................................................................2...................2.................... 113 A....2.......................................tekstury proceduralne....................................... Literatura .......3........................................................ 107 7.................... Skóra salamandry.................................................. OCENA EFEKTYWNOŚCI ......4................. 110 LITERATURA. Rendering ..... 120 A............4................................3...............................................3....................1..................................................2...........2.................2............... Wprowadzenie .. Twórczość H...... 99 7.........................1................................................................................................................................................................ 122 DODATEK A.......... INTERFEJS UŻYTKOWNIKA ...................................................................... Rendering ................ 97 7........................................................................................................................................................ 84 6...................................3...................................................................................2.......3... Czynniki wpływające na czas generowania obrazu..................1..................... Właściwości wzorów..... 89 6........................................................4..................................................................TREE) ......... 93 7..1........5.1.............. 113 A...................3........ Tworzenie połączeń między wzorami ........................................................................... Sprawozdanie .........

.......................... 20 RYSUNEK 3-7 WZORY ABSTRAKCYJNE ...... SZUM JAKO FUNKCJA PRZEŁĄCZAJĄCA.......... DREWNO...... 83 RYSUNEK 6-6 WŁAŚCIWOŚCI WARTOŚCI STAŁYCH ZWIĄZANE Z LOSOWOŚCIĄ (WŁAŚCIWOŚCI WARTOŚCI TYPU FLOATARRAY). 82 RYSUNEK 6-4 OKIENKO DIALOGOWE DODAWANIA NOWEJ WARTOŚCI STAŁEJ ..... OD LEWEJ: POWIERZCHNIA PLANETY................................................................................................................................................................................................................................................................................................... 120 5 ............................... 2-PARAMETRY WYJŚCIOWE ............................................................................. 22 RYSUNEK 3-12 K...................... KRA .................................. 27 RYSUNEK 3-18 S................................................................................................. 12 RYSUNEK 3-1 WZORY NA SKÓRZE ZWIERZĄT . 87 RYSUNEK 6-11 OKIENKO DIALOGOWE Z USTAWIENIAMI PARAMETRÓW SCENY ........ 84 RYSUNEK 6-7 PROCES TWORZENIA POŁĄCZENIA MIĘDZY PARAMETRAMI – WYBIERANIE PARAMETRU WEJŚCIOWEGO ............................................. 85 RYSUNEK 6-9 WIDOK WŁAŚCIWOŚCI WZORÓW........................................................... 42 RYSUNEK 4-9 ILUSTRACJA FRAKTALNEGO PODPODZIAŁU PRZESTRZENI ................ SZUM UŻYTY Z TECHNIKĄ ODWZOROWANIA NIERÓWNOŚCI DO WIZUALIZACJI NIERÓWNOŚCI POWIERZCHNI............................................................................................................................................................. 85 RYSUNEK 6-8 PROCES TWORZENIA POŁĄCZENIA MIĘDZY PARAMETRAMI – WYBIERANIE PARAMETRU WYJŚCIOWEGO .... TURK.................................................................................................... WORLEY – PRZYKŁAD WYKORZYSTANIA KOMÓRKOWEJ FUNKCJI BAZOWEJ .....TEKSTURY SKÓRY...... 82 RYSUNEK 6-5 WŁAŚCIWOŚCI WARTOŚCI STAŁYCH ............................................................................................................................... 21 RYSUNEK 3-9 KEN PERLIN............................. WYSCHNIĘTA ZIEMIA........................... 22 RYSUNEK 3-11 K.......................... 89 RYSUNEK 9-1 PRZYKŁADOWY DIAGRAM FUNKCJI BAZOWYCH ....................................................................................................................... WZORY WYPRODUKOWANE ZA POMOCĄ NAKŁADANIA KILKU SYSTEMÓW REACTION – DIFFUSION...................................................... 38 RYSUNEK 4-6 PRZYKŁADY SZUMU FRAKTALNEGO .. 81 RYSUNEK 6-2 MENU KONTEKSTOWE DODAWANIA WZORÓW I WARTOŚCI ....................................................................................................................... 26 RYSUNEK 3-16 S.............. ................................................................ 19 RYSUNEK 3-4 PIANA I STYROPIAN...................... ....................................................................................................................................................................... TURK........................................... 31 RYSUNEK 4-1 PRZYKŁADY POŁĄCZEŃ MIĘDZY FUNKCJAMI BAZOWYMI ................................ 37 RYSUNEK 4-4 OBLICZANIE SZUMU PERLINA 2D METODĄ GRADIENTOWĄ ................ ......................................................................................................... 28 RYSUNEK 3-19 J........................ ........................... 19 RYSUNEK 3-5 KAMIENNE MURY.................... 87 RYSUNEK 6-12 MENU RENDERINGU ..... ZASTOSOWANIE TECHNIKI GENEROWANIA POWIERZCHNIOWEJ TEKSTURY MURU............... 18 RYSUNEK 3-2 SKÓRA I PAPIER ................ 119 RYSUNEK 9-3 RYBIA ŁUSKA ....................................................................................................................................... 24 RYSUNEK 3-15 M...................... 30 RYSUNEK 3-21 PRZYKŁADY TEKSTUR KOMÓRKOWYCH WYGENEROWANYCH ZA POMOCĄ CORELTEXTURE ........................... WORLEY .......... ................................................................................................................................................................................................................ 29 RYSUNEK 3-20 OBRAZ WYGENEROWANY PRZY POMOCY BIBLIOTEKI PIXELLOOM .............................................................................................................................................................................................................................................................. 41 RYSUNEK 4-8 TYPY WYNIKÓW ZWRACANYCH PRZEZ FUNKCJĘ NOISEV................................ MARMUR...... 47 RYSUNEK 6-1 WIDOK OGÓLNY EDYTORA DRZEW CIENIOWANIA ................................................................................................................................ 88 RYSUNEK 6-13 OKIENKO DIALOGOWE Z PARAMETRAMI RENDERINGU ................. 18 RYSUNEK 3-3 KORA I DREWNO ................... 24 RYSUNEK 3-14 G.............................................................................................................................................................................................................. PRZEKRÓJ PRZEZ PRZESTRZEŃ R3..................... 22 RYSUNEK 3-10 K........................ 114 RYSUNEK 9-2 PRZYKŁADOWY DIAGRAM DRZEWA CIENIOWANIA ................................................................................................ 34 RYSUNEK 4-2 GEOMETRIA ODWZOROWANIA NIERÓWNOŚCI POWIERZCHNI ................................................... 120 RYSUNEK 9-4 PIANA NA POWIERZCHNI PIWA ..................................................................................................................................... 36 RYSUNEK 4-3 PSEUDO MODEL OŚWIETLENIA ...................................................................................................................... 23 RYSUNEK 3-13 G... 44 RYSUNEK 4-10 WPŁYW ZASTOSOWANIA RÓŻNYCH METRYK ODLEGŁOŚCI ................MIYATA TEKSTURA MURU .................................................................................... 20 RYSUNEK 3-6 CIENIE KAUSTYCZNE RZUCANE PRZEZ WODĘ............................................................. 38 RYSUNEK 4-5 WYKRES FUNKCJI SMOOTHSTEP(X)..... MIYATA – POŁĄCZENIA MIĘDZY KAMIENIAMI MURU ................................. 27 RYSUNEK 3-17 DIAGRAM VORONOI ................... WZORY REACTION – DIFFUSION NA OBIEKTACH .............................. 20 RYSUNEK 3-8 ZASTOSOWANIE SZUMU PERLINA DO GENERACJI TEKSTUR............................... WALTER........................ 1-PARAMETRY WEJŚCIOWE............................................... KUKLA ..................... 81 RYSUNEK 6-3 OKIENKO DIALOGOWE DODAWANIA NOWEGO WZORU ....... TEKSTURY WYGENEROWANE METODĄ CELL DIVISION I ICH NATURALNE ODPOWIEDNIKI....................... MIYATA – EDO CASTLE..................................................................................................................................................Spis ilustracji RYSUNEK 2-1 SHADE TREE REALIZUJĄCE MODEL OŚWIETLENIA .......... .................................................................................. 86 RYSUNEK 6-10 MENU PARAMETRÓW SCENY....................... 88 RYSUNEK 6-14 WIZUALIZACJA POSTĘPU PROCESU RENDERINGU .. 39 RYSUNEK 4-7 WYNIKI DZIAŁANIA FUNKCJI NOISEV........................................................................................PRZYKŁADY TEKSTUR UZYSKANYCH DZIĘKI ZASTOSOWANIU RÓŻNYCH KOMBINACJI LINIOWYCH FUNKCJI FN...........................................................................................................

........... 55 DIAGRAM 5-6 FAZA CIENIOWANIA Z UWZGLĘDNIENIEM BIBLIOTEKI TEXLIB ...... 58 DIAGRAM 5-7 PRZYKŁAD KOLEJNOŚCI EWALUACJI PARAMETRÓW DRZEWA CIENIOWANIA .................................. 50 DIAGRAM 5-2 DIAGRAM KLAS TYPÓW WARTOŚCI ........................................................................................................................................................................Spis diagramów DIAGRAM 2-1 PRZEBIEG PROCESU RENDERINGU DLA OŚWIETLENIA LOKALNEGO ..................................................................................................... 10 DIAGRAM 3-1 LIBTEX – EWALUACJA TEKSTUR PRZESTRZENNYCH ........................... 72 DIAGRAM 5-8 ARCHITEKTURA SYSTEMU LADS.......... 9 DIAGRAM 2-2 PRZEBIEG PROCESU CIENIOWANIA .................................................... 74 DIAGRAM 5-10 PRZEBIEG PROCESU EWALUACJI WŁASNOŚCI POWIERZCHNI W SYSTEMIE LADS .. 30 DIAGRAM 5-1 ARCHITEKTURA BIBLIOTEKI TEXLIB (MODUŁY FUNKCJONALNE).. 52 DIAGRAM 5-3 DIAGRAM KLAS ZWIĄZANYCH ZE WZORAMI .................................................................................... 53 DIAGRAM 5-4 DIAGRAM KLAS FUNKCJI ZARZĄDZAJĄCYCH WZORAMI ........ 75 6 ........................................................................................................................................ 73 DIAGRAM 5-9 ARCHITEKTURA PROCESU RENDERINGU W SYSTEMIE LADS.......................... 54 DIAGRAM 5-5 DIAGRAM KLAS PODSTAWOWYCH IMPLEMENTACJI ALGORYTMÓW SZUMÓW .......................................................................................................................................................................

Przykładami badanych zjawisk mogą być kamienie naturalne. różne rodzaje skóry zwierząt. Spotykamy się z nią na każdym kroku. które dają najlepsze rezultaty w dziedzinie interesujących nas typów wzorów. Coraz częściej spotykamy się z pełnometrażowymi filmami stworzonymi bez użycia standardowych kamer. W oparciu o tę aplikację opracowano metodę automatycznego generowania wzorów proceduralnych poprzez zestawianie różnych wartości parametrów procedur generujących wzór. Interesuje go tylko to. Wspólną cechą tych zjawisk jest to. medycynę. można proces tworzenia tekstur proceduralnych porównać do procesu tworzenia realistycznego obrazu. wystroju wnętrz. Większość z tych realistycznych efektów grafiki fotorealistycznej uzyskuje się dzięki proceduralnym technikom opisu własności płaszczyzny. kora drzewa. po architekturę. jaka część obrazów. Patrząc z tej perspektywy. gazetach. Na użytek badań proponowanych metod został stworzony interaktywny program pozwalający na łatwe tworzenie szerokiej klasy wzorów oraz eksperymentowanie z nimi. aby doprowadzić do pożądanego efektu. Stała się ona w dzisiejszych czasach na tyle doskonała. Stosując te metody możemy zasymulować wygląd niemal każdego materiału i powierzchni.1. począwszy od rozrywki. reklamy. przypomina rolę oraz historię proceduralnych technik teksturowania. 7 . Na bazie opracowanych i zbadanych technik oraz zrealizowanego oprogramowania opracowano również ćwiczenie laboratoryjne do laboratorium Zaawansowanych Metod Grafiki Komputerowej zapoznające studentów z możliwościami zastosowania proceduralnych technik teksturowania. scenografii ani żywych aktorów. można je uogólnić i zaklasyfikować do grupy tzw. reprodukcję ich właściwości wizualnych. Wizualizacje architektoniczne trudno odróżnić od zdjęć. Celem pracy jest opracowanie spójnej metody generowania możliwie szerokiej klasy wzorów. które widzimy w kinie. roślinności. którą będzie można zintegrować z dowolnym pakietem oprogramowania do tworzenia grafiki fotorealistycznej udostępniającym interfejs programistyczny wspomagający programowanie tekstur proceduralnych. która stara się jak najwierniej zasymulować zjawiska naturalne. bądź bliskie ujęcia twarzy. Wstęp Grafika komputerowa ciągle zyskuje na znaczeniu w wielu dziedzinach życia. że zawierają dokładne symulacje faktur materiałów budowlanych. w jaki sposób dzieło zostanie odebrane przez publiczność i w jaki sposób kontrolować proces. czy ulicznych reklamach. Celem pracy nie jest symulacja poprawna fizycznie. nieba. wzorów komórkowych. Zawarte są w nim wybrane techniki. zapierające dech krajobrazy. Artysta malarz prawie nigdy nie posługuje się wiedzą na temat fizyki odtwarzanego obiektu. (choć nie wyklucza się zastosowania podstaw fizycznych). projektowanie wspomagane komputerowo. zbadanie jej własności i możliwości zastosowań praktycznych oraz implementacja w postaci uniwersalnej biblioteki. Rozdział 2 stanowi wprowadzenie do procesu renderingu. że przy pewnej dozie wyobraźni. dzięki temu. Szczególną rolę odgrywa grafika fotorealistyczna. dzielących powierzchnię na mniej lub bardziej regularne siatki. po fantastyczne obrazy planet widocznych z przestrzeni kosmicznej. W Rozdziale 3 zawarty jest przegląd zaawansowanych technik symulacji zjawisk naturalnych. od stosowanych w architekturze kamieni naturalnych. pełnymi scen zawierających rozległe. czy szczegółów przedmiotów. Jest nim jedynie stworzenie wzorów jak najbardziej przypominających naturalne. skóra ludzka. że czasem nie zdajemy sobie nawet sprawy z tego. powstała dzięki niej.

interfejs do komunikacji z systemami do renderingu. 8 . Znajdują się tam dokładne opisy zastosowanych algorytmów oraz ich analiza. Dodatek B przedstawia format opisu drzew cieniowania zapisywany i odczytywany przez bibliotekę TexLib. Opisano również i przeanalizowano wprowadzone przez autora usprawnienia metod zaczerpniętych z literatury. sposoby na wykorzystanie osiągniętych rezultatów. Ocenie podlegają zarówno wartości wizualne budowanych wzorów jak i wydajność algorytmów i procesu ich tworzenia. Podsumowanie w Rozdziale 8 zawiera ocenę wyników pracy.Opis opracowanych metod tworzenia wzorów przebadanych i zaimplementowanych w stworzonym oprogramowaniu umieszczono w Rozdziale 4. 6 rozdział prezentuje system stworzony na bazie biblioteki TexLib. Opis zawiera wstęp teoretyczny oraz wskazówki na temat implementacji. Rozdział 5 opisuje uniwersalną bibliotekę TexLib stworzoną na potrzeby tej pracy. umożliwiający tworzenie realistycznych wzorów przy posiadaniu minimum wiedzy na temat technik grafiki komputerowej i teksturowania proceduralnego. Opisane zostało środowisko jej działania. opis potencjalnych kierunków dalszego rozwoju systemu. Ćwiczenie wykorzystuje opracowany system i proponuje uczestnikom zajęć wykonanie modułów rozszerzających go. Następny. System wykorzystuje profesjonalne narzędzie do budowy aplikacji wykorzystujących grafikę trójwymiarową LightWorks Application Development System. Rozdział 7 jest poświęcony badaniom eksperymentalnym oraz ocenie wyników. W Dodatku A znajduje się propozycja ćwiczenia laboratoryjnego na zajęcia z zaawansowanych metod grafiki komputerowej. oraz niektóre szczegóły implementacyjne.

Pierwszą jest przygotowanie geometrii. druga to cieniowanie. 9 . płaszczyzn określonych równaniami parametrycznymi. Po obcięciu wielokątów (w tej fazie geometria składa się z wielokątów. od tego czy renderer używa nadpróbkowania. przekształcenia geometryczne przekształcenia modelowania przekształcenia rzutowania rasteryzacja określenie powierzchni widocznych rasteryzacja cieniowanie Diagram 2-1 Przebieg procesu renderingu dla oświetlenia lokalnego Proces tworzenia obrazu podzielony jest na 2 niezależne części. jak np. REYES (zmodyfikowana metoda scanline. związanych głównie z procesem teksturowania. Definiowanie obiektów sceny odbywa się zwykle w ich lokalnym układzie współrzędnych. który jest jednym z elementów potoku renderingu. Fragmenty. Omówiono tutaj także pobieżnie proces renderingu dla metod biorących pod uwagę oświetlenie lokalne.: odbicia). ilości płaszczyzn ‘widocznych’ przez obliczany piksel obrazu itp. czyli nie biorącego pod uwagę światła odbitego i rozproszonego. wielokątów. zostały już zamienione na wielokątny) do piramidy widzenia. Przykładami algorytmów wykorzystujących ten potok są rendering scanline. Z-buffer.2. podlegających zniekształceniom wynikającym z animacji itd. raytracing itd. Podstawowe pojęcia grafiki komputerowej Poniżej przedstawiony został schemat typowego potoku renderingu dla oświetlenia lokalnego. Faza rasteryzacji operuje na trójwymiarowym układzie współrzędnych ekranu. związane z pewnymi zagadnieniami oświetlenia globalnego. wszystkie płaszczyzny opisane parametrycznie. Z-buffer. visibility processing – wynikają z metody renderingu i różnią się dla metod scanline. Faza przekształceń modelowania określa przekształcenia wszystkich elementów geometrii opisanych za pomocą hierarchii. Tutaj jest używany globalny układ współrzędnych.). Następująca po tym faza przekształceń rzutowania przechodzi za pomocą transformacji zależnej od zdefiniowanego wcześniej widoku na układ współrzędnych widoku. W trakcie tej fazy geometria jest obcinana do piramidy widzenia zależnej od aktualnego widoku.1. W tym układzie odbywa się określenie powierzchni widocznych (algorytmy określania powierzchni widocznych – ang. algorytm rasteryzacji określa które płaszczyzny znajdą się w kolejnych pikselach obrazu. bryły proceduralne itp. 2. Elementy grafiki komputerowej Ten rozdział zawiera definicje pojęć grafiki komputerowej. wykorzystywana przez system RenderMan). które nie będą widoczne na wygenerowanym obrazie są usuwane z dalszego procesu (oczywiście są sytuacje wyjątkowe. Geometria sceny może być opisana w różny sposób: za pomocą trójkątów. Następujące po tym cieniowanie jest odpowiedzialne za przygotowaniu kontekstu oraz obliczeniu właściwości powierzchni dla próbek (liczba próbek zależy np. brył opisanych proceduralnie.).

Czynnikiem wpływającym na zwiększenie zajętości pamięci przez tę fazę jest dążenie do uzyskania jak najbardziej realistycznych obrazów poprzez wykorzystanie dobrej jakości tekstur. określające lokalne wartości atrybutów powierzchniowych. Jest on wyrażony w postaci równania oświetlenia uwzględniającego w swojej najbardziej popularnej postaci składowe oświetlenia pochodzące ze wszystkich źródeł znajdujących się na scenie w następujący sposób [Foley]: i I = I a k a + ∑ I ip * k d ( N * Li ) . zostanie umieszczony bezpośrednio na obrazie lub wykorzystany jako część składowa koloru aktualnie cieniowanego piksela. Poniższy diagram pokazuje relacje modułu cieniującego z modułem określania powierzchni widocznych. ka – współczynnik odbicia światła rozproszonego (z przedziału [0. Ia – natężenie światła otoczenia (równe dla wszystkich obiektów). Ip – natężenie światła (światłość) źródła światła. N – wektor normalny do danej płaszczyzny (znormalizowany) L – wektor określający kierunek do źródła światła (znormalizowany) Wartość koloru jest zwracana jako wynik. zależnie od algorytmu rasteryzacji. Szczególnym rodzajem tekstur są tekstury proceduralne.Z naszego punktu widzenia jest to najbardziej interesujący proces. że na jeden piksel może być pobieranych kilka próbek z kilku płaszczyzn nań się składających). co więcej. kd – współczynnik odbicia rozproszonego dla danego materiału. Obliczenie koloru dla danego kontekstu cieniowania może być bardzo złożonym procesem. połyskliwość). który stosuje odpowiedni model cieniowania. które można określić jako funkcje współrzędnych układu odwzorowania tekstury s. w nowoczesnych systemach grafiki fotorealistycznej jest fazą zajmującą najwięcej zasobów systemu. ale nie tylko. który. Model cieniowania opisuje między innymi model oświetlenia. Zasoby te to głównie czas jednostki obliczeniowej.1]).. 10 . jako. gdzie: i i – indeks źródła światła. Tekstura w grafice komputerowej to wzór opisany na obiekcie. bądź globalnego – Pw.t lub współrzędnych układu lokalnego obiektu P. Kontekst cieniowania jest przekazywany algorytmowi odpowiedzialnemu za określenie własności cieniowanej powierzchni i wynikającego z nich koloru. definiujący atrybuty powierzchni (takie jak kolor. przezroczystość. Oryginalne znaczenie tekstury to układ włókien w materiale. moduł rasteryzacji i cieniowania określanie widoczności (visibility processor) tworzenie kontekstu cieniowania obliczenie koloru dla próbki Diagram 2-2 Przebieg procesu cieniowania Kontekst cieniowania jest zbiorem informacji identyfikujących i opisujących aktualnie cieniowaną próbkę (próbka nie koniecznie jest jednoznaczna z pikselem.

takich jak drewno. szybko w związku z tym pojawiły się ulepszenia techniki Catmulla wykorzystujące tekstury także do innych niż modyfikacja koloru powierzchni celów.Problem teksturowania przedstawiony został dokładniej w następnym punkcie. Obiekty zyskały wiele na realizmie przy niewielkim wysiłku i zwiększeniu złożoności obliczeniowej. zawodzą. chmur. Obrazy tworzone syntetycznie – proceduralnie – były wykorzystywane od początku istnienia pojęcia tekstury. opisanie tekstury na kuli spowoduje wystąpienie zniekształceń w obszarach biegunowych). Funkcje o dużych okresach przekształcał dodając wartości funkcji o dużych częstotliwościach. Geoffrey Gardner produkował tekstury sumując funkcje sinus o różnych okresach. Znaczącym krokiem naprzód było użycie w 1974 przez E. reprezentujących kolejne przekroje obiektu. więc można z jego pomocą produkować tekstury przestrzenne – nie wymagające w 11 . strona 66). Było to jedno z pierwszych podejść do tworzenia realistycznych tekstur proceduralnych. Mowa o funkcji noise.E. Stosuje się w tych przypadkach przekształcenia z trójwymiarowej przestrzeni obiektu (x. Noise może być zdefiniowany w trzech i większej ilości wymiarów. t). Otrzymywał w ten sposób wzory przypominające naturalne chmury. y. Dla tego typu obiektów tradycyjne metody rzutowania dwuwymiarowych. definiuje trójwymiarowe tekstury. Jest ona dzisiaj określana jako „funkcja która dała początek tysiącu tekstur” („the function. górzystych krajobrazów itp.2. hadow mapping). nie można łatwo przeprowadzić odwzorowania punktu na powierzchni w punkt tekstury. wykorzystywanej do generacji naturalnie wyglądających tekstur. Jeśli jednak geometria jest reprezentowana za pomocą siatki trójkątów. z). Ken Perlin zdefiniował najintensywniej obecnie używaną do produkcji tekstur proceduralnych funkcję. Nie sposób uczynić tego w efektywny sposób dysponując jedynie płaskimi obrazami (Choć istnieją takie podejścia. W obydwu sposobach znajdowania współrzędnych (s. Zaraz po nim. fazach i amplitudach. that launched a thousand textures” [T&M 1998]. za pomocą uporządkowanej pary (u. Objętość takiej definicji jest jednak na tyle duża. Historia tekstur proceduralnych Charakterystyczną cechą obrazów powstających w początkach grafiki komputerowej był niewielki stopień ich realizmu. skanowanych obrazów. Catmulla tekstur – skanowanych obrazów – nałożonych na geometrię i modyfikujących jej kolor . które umożliwiły wygodne korzystanie z tekstur. w tym samym roku. wykorzystano do produkcji realistycznych cieni. 2. czy marmur. drewna. Jedyną metodą całkowitej eliminacji deformacji tekstur jest zastosowanie tekstur zdefiniowanych w przestrzeni trójwymiarowej. Lata 80 przyniosły kilka innowacji. reflection mapping lub environment mapping). czyli symulacja zniekształceń powierzchni za pomocą zmian normalnych powierzchni wprowadzony przez Blinna w 1978 oraz odwzorowanie cieni (ang. Pierwsze sceny przedstawiały modelowane za pomocą siatek trójkątów lub powierzchni parametrycznych obiekty cieniowane z wykorzystaniem mało realistycznych modeli oświetlenia. przy pomocy której stała się możliwa symulacja powierzchni lustrzanych. t) jednak zawsze pojawiają się zniekształcenia (np. v). Z pomocą przychodzą tutaj przestrzenne tekstury proceduralne. Wkrótce pojawiły się kolejne zastosowania tekstur w grafice komputerowej: odwzorowanie nierówności powierzchni (ang. W ten sposób każdemu punktowi powierzchni odpowiada punkt dwuwymiarowej tekstury (s. tworzone przy ustawieniu obserwatora w punkcie źródła światła. także do opisu zjawisk przestrzennych. Korzystają z niej między innymi procedury generujące realistyczne obrazy marmurów. W 1976 Blinn i Newell przedstawili metodę odwzorowania środowiskowego (ang. w których duża ilość płaskich obrazów. że stosowanie takiego rozwiązania na szerszą skalę jest niepraktyczne). bump mapping) . gdzie tekstury głębokości. Minimalizacja tych zniekształceń do dziś jest problemem w przypadkach bardzo skomplikowanych modeli. Catmull w swoim pierwszym podejściu teksturował powierzchnie zdefiniowane parametrycznie.

wymiar opisuje czas). Ci=Os*( Cs*(Ka*ambient()+Kd*diffuse(Normal)+ Ks*specular(Normal. Największymi zaletami teksturowania proceduralnego są: • niezależność od docelowej rozdzielczości – większość procedur potrafi wygenerować dowolną ilość detali wraz z przybliżaniem się obserwatora do powierzchni.5. np. Cooka na podstawie którego powstał potem system grafiki fotorealistycznej RenderMan. L. przezroczystość. że nie sposób ich odróżnić od naturalnych odpowiedników. Koszty stworzenia funkcji. ale warunki oświetlenia w czasie robienia zdjęć (na powierzchniach chropowatych mogą występować cienie pochodzące od bocznych świateł). Oi=Os. wpływ otoczenia na własności powierzchni (np. Rysunek 2-1 przedstawia przykładowe shade tree Cooka realizujące prosty model oświetlenia (plastic): Rysunek 2-1 Shade tree realizujące model oświetlenia Oto odpowiadający mu kod shadera systemu RenderMan: surface plastic (float Ka=1.Viewer.czasie tworzenia obrazu stosowania przekształcenia do współrzędnych (s. Shade trees dawały między innymi możliwość przypisywania powierzchniom własnych procedur opisujących kolor.5. Powstały też systemy. obrazów skanowanych. jednak dzięki kilku wyróżniającym je cechom ich stosowanie jest opłacalne. Najbardziej znanym przykładem jest system drzew cieniowania shade trees R. Poza tym obrazy skanowane rzadko mają dobrą jakość. • możliwość generowania tekstur wielowymiarowych – przy adresowaniu standardowych tekstur. point Viewer = normalize(-I). które je generują są oczywiście zwykle bardzo duże w porównaniu z dostarczeniem zdjęć.1. tzw. następuje przekształcenie z trójwymiarowej 12 . shading languages. definicji świateł itp.Roughness=0. model cieniowania itp. Chodzi tutaj nie tylko o ostrość czy czystość kolorów. atmosfery. Postęp w grafice komputerowej sprawił jednak. Kd=0. tekstur są łatwość wykonania i realistyczny wygląd. przy czym 4. Ks=0. odbicia przedmiotów znajdujących się w pobliżu). że realizm obrazów proceduralnych jest często na tyle duży. } Niewątpliwie zaletami tradycyjnych.I). zaczęto tworzyć języki opisu funkcji je generujących.) { point Normal=faceforward(normalize(N). skanowanych bądź tworzonych ręcznie. Odkąd tekstury proceduralne udowodniły swoją użyteczność.Rougness)) ). t). które umożliwiały definiowanie funkcji teksturujących (shaders) do opisu różnych właściwości powierzchni. a także animacje (4wymiarowy noise.

wykorzystujących złożone typy danych oraz operacje wejścia/wyjścia. jednak same funkcje nie mogą używać shadeops ani żadnych innych dostarczanych przez renderer danych. 3dsMAX).). który do zastosowania w wielu teksturach wymaga jedynie małych modyfikacji. co umożliwia właśnie teksturowanie proceduralne mały rozmiar definicji (w porównaniu ze skanowanymi obrazami w wysokiej rozdzielczości lub teksturami trójwymiarowymi) parametryczny interfejs umożliwiający generację wielu różniących się obrazów za pomocą jednej procedury. Interfejs modułów rozszerzeń LightWave. pisane w języku C. to brak możliwości • definiowania własnych typów. Definiowanie tekstur proceduralnych Definiowanie tekstur proceduralnych odbywa się zazwyczaj w konkretnym środowisku. 3dStudioMAX udostępnia obiektowy interfejs C++ służący do pisania modułów rozszerzeń. • stosowania rekurencji. istnieje możliwość tworzenia dowolnie skomplikowanych tekstur.• • przestrzeni sceny do dwuwymiarowej przestrzeni obrazu co jest przyczyną zniekształceń naniesionych na obiekty tekstur. które ułatwiają zadanie programisty tekstur. inne 13 . punkty. transformacje współrzędnych itp. wektory) oraz operacje na nich (operacje na wektorach. • używania operacji wejścia/wyjścia (np. Wszystkie dane związane z kontekstem aktualnie cieniowanego punktu muszą zostać przekazane za pomocą parametrów w czasie wywołania zewnętrznej funkcji wewnątrz funkcji teksturującej zdefiniowanej w Shading Language. Biblioteki takich funkcji mogą być używane z poziomu Shading Language. • predefiniowane funkcje matematyczne. bibliotek procedur teksturujących.3. jest zdefiniowany w C. Posiadają: • predefiniowane typy (np. Języki opisu tekstur proceduralnych to specjalizowane narzędzia. • stosowania wskaźników. Są to tzw. W ten sposób. brak obsługi plików). Interfejs taki to zwykle język opisu tekstur proceduralnych (np. Podobnymi możliwościami dysponuje wiele innych systemów. również umożliwiający pisanie tekstur proceduralnych. Także w tych przypadkach umożliwia to łatwą integrację z zewnętrzną biblioteką. Shading Language w RenderMan i Blue Moon Rendering Tool). mimo ograniczeń języka teksturowania. Istnieje też możliwość wykorzystania uniwersalnych. używanym w systemie RenderMan. Dla konkretnego rodzaju wzorów istnieje zwykle jeden algorytm. Definiowanie bibliotek tekstur proceduralnych Wiele tekstur proceduralnych używa podobnych metod do generacji wzorów. System. • przenaszalność w przypadku języków interpretowanych Wady takich języków.3. problem znika jeśli tekstura jest zdefiniowana w odpowiedniej przestrzeni. funkcje bazowe tekstur. definiujące modele cieniowania itp. którego używamy dostarcza pewnego interfejsu za pomocą którego mamy możliwość umieszczenia w scenie nowych funkcji teksturujących. nie związanych z konkretnym systemem do renderingu. W Shading Language. 2. 2. opisujące kolor.1. Najpopularniejsze funkcje bazowe są często predefiniowane w systemach do renderingu. bądź interfejs za pomocą którego definiowane są moduły rozszerzeń (np. istnieje możliwość rozszerzenia podstawowego zbioru funkcji (zwanych tam shadeops) o nowe.

dx. • Nie możemy zakładać. 2. na podstawie których trudno zdefiniować przydatną miarę jakości. Idąc jeszcze dalej. Po pierwsze. natomiast LightWorks potrafi obliczyć wielokąt. Danymi wejściowymi adaptera będzie kontekst cieniowania systemu renderującego. miarą. Aby zapewnić przenaszalność biblioteki takich funkcji między systemami do renderingu należy stosować się do kilku reguł: • Funkcje nie mogą korzystać z żadnych danych ani funkcji. która może zastąpić subiektywne estetyczne wrażenia. np. Dv ). bądź udostępniane za pośrednictwem języka teksturowania. Ocenę tekstur przeprowadza się także na podstawie kilku innych parametrów. aby uniknąć aliasingu. ponieważ te są zwykle podawane w inny sposób dla każdego programu. danymi wyjściowymi zaś parametry odpowiednich funkcji zdefiniowanych w bibliotece. w systemie RenderMan funkcje zdefiniowane zewnętrznie nie mają dostępu do zmiennych globalnych ani funkcji shadeops). który jest cieniowany ( Du. który powstaje przez rzut aktualnie obliczanego piksela na cieniowaną powierzchnię. Równie dobrze jednak można funkcją bazową nazwać dwuargumentową funkcję generującą dwuwymiarową szachownicę: chess(x. że zwykle wynikiem działania funkcji teksturującej jest obraz. y. Po drugie. gdzie dx.4. Funkcje bazowe mogą być definiowane na różnym poziomie. często używana funkcja szumu Perlina – noise – jest stosunkowo wolna. Niniejsza praca ma na celu symulację pewnych zjawisk naturalnych. 3dStudioMAX dostarcza bezpośrednio zakres u i v w którym należy policzyć kolor średni. aby zapewnić odpowiednią uniwersalność. Kolejny adapter przyjmie wyniki zwrócone przez funkcję i umieści je w odpowiednich zmiennych systemu. tak. Oczywistą pomocą przy ocenie jakości. Wchodzą tutaj w grę wrażenia estetyczne. jakimi dokładnie możliwościami dysponuje renderer i przy budowie funkcji należy przyjąć jakieś założenia. y). Na przykład antialiasing tekstur powierzchniowych jest przeprowadzany w RenderManie przy pomocy wartości pochodnych powierzchni w punkcie. a ocena tego może być bardzo subiektywna. które są używane. Dwa z nich to wydajność oraz jakość obrazu mierzona ilością zniekształceń spowodowanych aliasingiem (próbkowaniem wzorów o częstotliwościach większych od częstotliwości wynikającej z ograniczenia Nyquista). Najprostszym przykładem takiej funkcji może być sin(x). nie można stosować wartości udostępnianych przez system. dy to rozmiary prostokąta otaczającego punkt x. Są dwa tego powody. aby funkcja zwracała uśrednioną wartość koloru z pewnej powierzchni. przez renderer. których zdolności naśladowania zjawisk naturalnych są mocno ograniczone. Wydajność to ważny w teksturach proceduralnych czynnik przesądzający o ich przydatności do użycia. będzie więc porównanie zjawisk generowanych z występującymi w naturze. chess(x. Wynika to z poprzednich spostrzeżeń na temat sposobu realizacji antialiasingu. LightWave posługuje się pojedynczą wartością ( spotSize ). Jakość tekstur proceduralnych Ocena jakości nie jest oczywista ze względu na to. W szczególności. • W celu udostępnienia informacji o kontekście cieniowania należy zbudować odpowiedni adapter. można zażądać. Najczęściej dokładne modele fizyczne są zbyt skomplikowane implementacyjnie bądź zbyt złożone obliczeniowo a w zamian stosuje się uproszczone modele. nie jest to zwykle możliwe technicznie (np. Efektywność działania można poprawić stosując kilka metod: 14 . t. aby uniknąć wielokrotnego ich definiowania i zwiększyć czytelność nowo powstających tekstur. dy).warto umieścić w bibliotece. Skomplikowane tekstury zwykle są kosztowne obliczeniowo. y i wyrównanego do osi zdefiniowanych przez układ współrzędnych tekstury s.

Generalnie metody antialiasingu (czyli przeciwdziałania artefaktom) można podzielić na: • realizowane przez system renderującym niezależne od funkcji teksturującej. jak nadpróbkowanie. zależy w dużej mierze od tego. Ponadto nawet wysoki stopień nadpróbkowania może w pewnych przypadkach nie być wystarczający. Część wartości obliczanych wewnątrz funkcji teksturującej może być niezmienna dla kilku kolejnych wywołań jeśli odbywają się one dla punktów położonych blisko siebie (a można założyć. na niekorzyść tych pierwszych. Stosowanie antialiasingu analitycznego wiąże się zazwyczaj ze znacznym nakładem obliczeniowym i wymaga dostarczenia przez renderer pewnych dodatkowych informacji o wielkości obszaru dla którego mają się odbyć obliczenia. Optymalizacje algorytmu. w której wielkość filtra jest uzależniona od oszacowania wielkości projekcji piksela do przestrzeni tekstury o antialiasing analityczny. co sprzyja ignorowaniu tego zjawiska na poziomie tworzenia tekstury. a które pozostają niezmienne w trakcie całego procesu renderingu. Różnica stopnia skomplikowania tekstur generujących te same wzory z zastosowaniem antialiasingu analitycznego i bez niego często jest bardzo duża. ale generalną zasadą jest stosowanie cache’owania tam. nie przytłaczając jednocześnie nadmiernym skomplikowaniem. gdzie jest to możliwe. w którym oszacowywany jest kolor średni tekstury na obszarze będącym projekcją cieniowanego piksela do przestrzeni tekstury Algorytmy renderingu potrafią do pewnego stopnia korygować artefakty powstające z powodu aliasingu za pomocą technik nadpróbkowania. które można obliczyć na podstawie parametrów wejściowych. Złożoność funkcji cieniujących rośnie jednak często do tego stopnia. którego znaczenie było przez długi czas niedoceniane a który ma bardzo duże znaczenie dla tekstur pisanych z myślą o udostępnianiu szerokiemu gronu użytkowników. Jakość wygenerowanego obrazu. • realizowane przez funkcje teksturujące: o redukcja wysokich częstotliwości w obrazie realizowana za pomocą rozmywania ostrych krawędzi z użyciem stałego filtra o adaptacyjna redukcja wysokich częstotliwości. Możliwość wykorzystania tego spostrzeżenia istnieje w większości dostępnych systemów udostępniających interfejs teksturowania proceduralnego. Mimo tego jednak dodatkowy wysiłek włożony w implementację procedur produkujących wysokiej jakości antialiasowane obrazy w większości przypadków jest opłacalny. że 15 . Często istnieją wartości. Przyczyną jest to. Oprócz już wymienionych czynników wpływających na ocenę tekstury proceduralnej istnieje jeszcze jeden. Tekstury proceduralne obliczają zwykle kolor powierzchni dla danego punktu w przestrzeni. że sam algorytm produkcji tekstury bez wbudowanego mechanizmu antialiasingu będzie najczęściej działał dużo szybciej niż wersja z antialiasingiem. Optymalizacje na poziomie języka programowania. że tak jest w większości przypadków). Jest nim łatwość obsługi. Łatwość obsługi tekstur zależy od ich parametryzacji. że aby uzyskać obraz dobrej jakości renderer będzie najprawdopodobniej nadpróbkowywał piksele całego obrazu zamiast tylko te zajęte przez teksturę.• • • Obliczanie wartości niezmiennych. Te optymalizacje są oczywiście zależne od konkretnych tekstur. Czasem warto porównywać aktualne parametry wejściowe z poprzednimi i w miarę możliwości odzyskiwać wyniki poprzednich obliczeń. W rzeczywistości to zagadnienie traktowane jest często jako mało istotne. Poleganie na nadpróbkowaniu prowadzi do końcowej nieefektywności mimo tego. jak rozwiązany został w teksturze problem aliasingu. a szczególnie sekwencji obrazów tworzących animację. Tekstura powinna dawać użytkownikowi dużą swobodę w kontroli efektów.

można powiedzieć. Parametry są przeważnie wyrażane liczbami. o ile nie zna się algorytmów zastosowanych w konkretnym przypadku i nie wie jak każdy z parametrów na nie wpływa. że tracimy kolejne stopnie swobody. Dobranie właściwych wartości parametrów w takich przypadkach jest trudne. to parametry powinny być intuicyjne i nie powinno ich być wiele. którzy nie chcą poświęcać wiele czasu na poznawanie fizycznych czy jakichkolwiek innych podstaw działania procedury (często będą to artyści. Ponieważ korzystać mają z tekstur ludzie. nie mający wielkiego pojęcia o zasadach działania technik proceduralnych). które odpowiadają intuicji i konwertować wewnątrz procedury (zastępując na przykład kilka parametrów mających wpływ na ilość detali jednym. Powyższe kryteria ocena zostaną zastosowane w czasie projektowania tekstur oraz do ich końcowej oceny.spotyka się tekstury kontrolowane za pomocą kilkudziesięciu parametrów. Posługując się za Kentonem Musgrave [T&M 1998] pojęciem wielowymiarowej przestrzeni estetycznej. 16 . Problem polega na tym.: wszystkim poza autorem procedury) mogą sprawiać kłopoty. Jeśli nadto algorytm posługuje się mało intuicyjnymi parametrami. można je zastąpić takimi. Aby pogodzić łatwość obsługi z zachowaniem odpowiedniej elastyczności często ukrywa się przed użytkownikiem część parametrów przyjmując jakieś ustalone wartości i dostarczając procedurę w kilku wersjach. że redukując liczbę parametrów tracimy elastyczność procedury. które niedoświadczonym użytkownikom (czyt. opisanym jako stopień szczegółowości).

ogień. bądź opartej tylko na wrażeniach estetycznych. piana. Kategorie tekstur proceduralnych rozważane w pracy Tekstury proceduralne mogą być tworzone dwoma sposobami: implicit i explicit. inne. Cechą wspólną tych wzorów jest sposób. granity). W przypadku tekstur. 3. cienie kaustyczne rzucane przez wodę(Rysunek 3-6). Definicja explicit wymagałaby prawdopodobnie wygenerowania całej tekstury przed rozpoczęciem renderingu i zapamiętania jej. przed renderingiem nie znamy ich położenia na wynikowym obrazie. leopard. wzory powstające na skórze niektórych zwierząt (żyrafy. w jaki dzielą przestrzeń. mury kamienne. kamienia naturalnego (marmury. Tekstury proceduralne pozwalają na symulację bardzo szerokiego zakresu zjawisk naturalnych. Funkcje implicit odpowiadają natomiast na pytanie o jakiś konkretny punkt. Podobnie z pozostałymi przykładami. ocelot) (Rysunek 3-1 Wzory na skórze zwierząt). po chmury. kamienie naturalne. bądź to uzasadnionej fizycznie. Funkcje produkujące wzory tego typu to tekstury komórkowe. zmięty papier (Rysunek 3-2). Przykładami interesujących mnie wzorów są kamienne mury. wzory tworzące się na wyschniętej ziemi (Rysunek 3-5). kora drzew(Rysunek 3-3). skóra ludzka. Kolejność pikseli tekstury o jakie renderer pytałby byłaby bowiem najczęściej różna od kolejności w jakiej generuje je funkcja. styropian. 17 . Informacje zawarte w rozdziale stanowiły punkt wyjścia do opracowania metod symulacji dających realistyczne obrazy zjawisk podobnych do opisywanych.3. Tutaj interesować nas będą jedynie tekstury generowane w sposób implicit. W przypadku explicit funkcja generuje cały obraz. jaguar. struktura gąbki (Rysunek 3-4).1. Przegląd stosowanych metod symulacji zjawisk naturalnych W tym rozdziale przedstawione zostały fotografie wzorów występujących w naturze oraz różne podejścia do ich symulacji. stosując dowolną kolejność tworzenia kolejnych pikseli. które są obliczane w trakcie renderingu (tzn. duże koty – gepard. abstrakcyjne wzory (Rysunek 3-7). od struktury drewna. nie możemy więc określić stopnia szczegółowości ani rozmiarów tekstury) najlepszym rozwiązaniem są właśnie tekstury implicit. Zarówno wzory na żyrafie jak kora niektórych drzew dzielą powierzchnię na komórki o mniej lub bardziej regularnych kształtach. wężę. W tej pracy zajmę się pewnym podzbiorem tekstur proceduralnych. wodę.

jaguar leopard ocelot pantera wąż Rysunek 3-1 Wzory na skórze zwierząt żyrafa skóra Rysunek 3-2 Skóra i papier zmięty papier 18 .

Rysunek 3-3 Kora i drewno piana styropian piana na powierzchni piwa Rysunek 3-4 Piana i styropian gąbka – symulacja 19 .

wyschnięta ziemia.kamienny mur kamienny mur spękana powierzchnia wyschniętej ziemi kra lodowa Rysunek 3-5 Kamienne mury. kra Rysunek 3-6 Cienie kaustyczne rzucane przez wodę Rysunek 3-7 Wzory abstrakcyjne 20 .

3.2. Techniki zaawansowane
Poniżej przytaczam wyniki badań nad zjawiskami, które mogą być symulowane za pomocą tekstur komórkowych. Szereg podejść wzorowało się na fizycznych podstawach powstawania wzorów (teorie Reaction-Diffusion oraz Cell Division powstawania wzorów na skórze ssaków), pozostałe, o ile wiadomo, nie mają nic wspólnego z rzeczywistymi procesami.

3.2.1. Szum Perlina
Największą rewolucją w symulacji naturalnych zjawisk przy pomocy teksturowania proceduralnego było wprowadzenie w 1985 przez Kena Perlina funkcji generującej szum (tzw. Perlin noise), której charakterystycznymi cechami są: • powtarzalność (dla określonych parametrów ma zawsze tę samą wartość) • ograniczenie wartości do przedziału [-1, 1] • skończona częstotliwość (maksymalna częstotliwość równa 1) W odróżnieniu od szumu Perlina, szum biały nie ma ograniczenia częstotliwości, nie jest też powtarzalny. Dla teksturowania proceduralnego jest praktycznie bezużyteczny. Pierwszym powodem jest to, że wzory wygenerowane za jego pomocą byłyby za każdym razem inne. Niemożliwe stałoby się odtworzenie wzoru, a co za tym idzie generowanie animacji ani różnych widoków tego samego obiektu. Drugim, fakt, że biały szum wprowadza nieskończoną liczbę szczegółów. Uniemożliwiłoby to przeprowadzenie antialiasingu, ponieważ próbkowanie nigdy nie mogłoby mieć wystarczającej częstotliwości. Oryginalny szum Perlina jest implementowany jako funkcja interpolująca między losowymi wartościami generowanymi w węzłach wielowymiarowej dyskretnej siatki. Perlin noise jest narzędziem wykorzystywanym przy bardziej zaawansowanych algorytmach i jako taki jest podstawą większości tekstur proceduralnych. Pozwala na symulację zjawisk, które mają charakter fraktalny, czy takich, gdzie można zaobserwować nałożone na siebie wzory o różnych wielkościach. Większość zjawisk naturalnych, czy to ruch gałęzi na wietrze czy struktura chmur bądź kamienia, ma właśnie charakter fraktalny. Rysunek 3-8 przedstawia kilka zjawisk, których podstawą jest fraktalna wersja Perlin noise. Na Rysunek 3-9 widać wykorzystanie szumu do zniekształcenia powierzchni obiektu.

Rysunek 3-8 Zastosowanie szumu Perlina do generacji tekstur. Od lewej: powierzchnia planety, szum jako funkcja przełączająca, marmur, drewno.

21

Rysunek 3-9 Ken Perlin. Szum użyty z techniką odwzorowania nierówności do wizualizacji nierówności powierzchni.

Ze pomocą tej metody nie można wygenerować większości wzorów komórkowych, jednak z powodzeniem można jej używać do produkcji np. granitu, czy powierzchni styropianu, widzianych z dostatecznie dużej odległości (tzn. takiej, z której nie można dostrzec wyraźnych szczegółów).

3.2.2. Wzory kamiennych murów
K. Miyata na konferencji SIGGRAPH 1990 zaprezentował metodę generacji tekstur przypominających kamienne mury. Jego metoda produkuje tekstury powierzchniowe (zdefiniowane w przestrzeni st obiektu). Obliczany jest kolor oraz odchylenie normalnej wizualizujące nierówności powierzchni (bump mapping). Miyata zauważył, że do stworzenia tekstury muru potrzebne są dwa modele: struktura połączeń między kamieniami oraz tekstura pojawiająca się na kamieniach. W ten sposób wyodrębnił dwa etapy produkcji tekstury. W pierwszym, na podstawie parametrów określających średnią wielkość kamieni, ich zróżnicowanie oraz sposób rozłożenia na powierzchni generuje wzór imitujący połączenia między kamieniami. W ten sposób powierzchnia zostaje podzielona na nieregularne komórki (Rysunek 3-10). Drugi etap polega na nałożeniu tekstury kamienia, wygenerowanej przy pomocy fraktalnej turbulencji. Dla każdej komórki parametry tekstury (kolor, stopień szczegółowości) nieznacznie się różnią, w ten sposób obraz nabiera większego realizmu (Rysunek 3-11).

Rysunek 3-10 K. Miyata – połączenia między kamieniami muru

Rysunek 3-11 K.Miyata tekstura muru

Rozwiązanie Miyaty posiada cztery podstawowe wady: • Tekstura jest zdefiniowana na powierzchni, więc jest narażona na zniekształcenia związane z przekształceniami do dwuwymiarowej przestrzeni parametrów tekstury st. • Nie jest możliwa poprawna wizualizacja styku oddzielnych powierzchni (dla których odwzorowanie w przestrzeń s,t jest zdefiniowane oddzielnie). Jest to widoczne na Rysunek 3-12 na rogu budynku – „kamienie” na sąsiednich ścianach są od siebie niezależne, gdy tymczasem po obu stronach powinny być widoczne części tych samych kamieni. • Dwuetapowy sposób generacji tekstury wymaga znacznego nakładu obliczeń przed rozpoczęciem renderingu.

22

Generacja struktury połączeń odbywa się w sposób explicite, więc dla ustalonej wielkości i szczegółowości muru. Miyata nie przedstawia innych zastosowań tej techniki, więc jej uniwersalność nie jest duża.

Rysunek 3-12 K. Miyata – Edo Castle. Zastosowanie techniki generowania powierzchniowej tekstury muru.

3.2.3. Wzory na skórze ssaków Reaction - Diffusion
Reaction–Diffusion to proces, opisany po raz pierwszy przez Alana Turinga (1952), w którym dwa lub więcej związków chemicznych (zwanych morfogenami, ang. morphogenes) rozpraszają się na powierzchni i reagują ze sobą produkując stabilne wzory. Dyfuzja i reakcje są opisane za pomocą układu nieliniowych równań różniczkowych cząstkowych. W systemie Reaction–Diffusion muszą zawsze występować przynajmniej dwa morfogeny, różniące się prędkościami dyfuzji. Jedna z tych substancji musi być ponadto zdolna do zwiększania szybkości produkcji. Pozostałe substancje pomagają lub usiłują zahamować ten proces. Reaction–Diffusion może generować różnorodne wzory złożone z plam lub pasów, przypominające te spotykane na skórze ssaków (koty, zebry). Biologowie są zdania, że część wzorów spotykanych w naturze może być właśnie wynikiem procesów symulowanych za pomocą Reaction–Diffusion, jednak nie zostało to dotychczas udowodnione. Jako pierwszy zaimplementował Reaction–Diffusion Greg Turk [Turk 1991]. Jego metoda umożliwia tworzenie wzoru bezpośrednio na modelu geometrycznym. Przebiega ona w kilku fazach: 1. Powierzchnia modelu dzielona jest na komórki o zbliżonych polach

23

Każdej komórce przypisywana jest początkowa zawartość morfogenów i przeprowadzana jest symulacja Reaction–Diffusion. wzór rozetkowy leoparda. W trakcie symulacji zawartości substancji w komórkach zmieniają się zgodnie z zasadami dyfuzji (przechodzenie związków do komórek zawierających mniejsze ich stężenia) oraz reakcji (na przykład wysoka zawartość pewnego związku chemicznego może spowodować zniszczenie związku. Przykłady wzorów powstałych w ten sposób widoczne są na Rysunek 3-13 (dolny rząd). Turk wprowadził możliwość generacji także bardziej skomplikowanych wzorów (np. Po zakończeniu symulacji i uzyskaniu stabilnych zawartości morfogenów. Wzory reaction – diffusion na obiektach 24 . rybach) stosując szereg systemów. Turk. koncentracja jednego z nich decyduje o zabarwieniu komórki. górny rząd). która wprowadza dodatkowe szczegóły. 3. Wzory wyprodukowane za pomocą nakładania kilku systemów reaction – diffusion. zawartość związków chemicznych w nich nie może się już zmieniać) i przeprowadzana jest kolejna symulacja. Systemy Reaction–Diffusion produkują z reguły bardzo proste wzory (Rysunek 3-13.2. Teraz znowu pewne komórki mogą zostać zablokowane i proces może być powtarzany. który występuje w mniejszym stężeniu). Pewne komórki zostają „zablokowane” (tzn. Rysunek 3-13 G. Końcowy kolor w każdym punkcie jest kolorem średnim sąsiadujących komórek. Turk. Pierwszy system tworzy wzór wyjściowy. wzory na wężach. Rysunek 3-14 G. siatka na żyrafie.

Do generacji wzorów przypominających cętki stosowany jest przez Turka inny model niż do generacji pasków zebry. W Reaction–Diffusion kolor jest kontrolowany za pomocą związków chemicznych. Z kolei dopiero połączenie obydwu modeli pozwala na stworzenie wzoru skóry żyrafy. jak poprzednio Atrakcyjność tego podejścia polega na tym. skóra naturalna wzór wygenerowany jaguar 25 . Podane przez autorów wyniki numerycznych porównań wzorów wygenerowanych z naturalnymi pokazują 7% błąd. aby każda mogła zająć taką samą powierzchnię. w którym używa 2 parametrów do produkcji wzorów większości zwierząt z rodziny kotów. że efekty są zaskakująco dobre dla zwierząt należących do rodziny kotów. Jest to następny model inspirowany obserwacjami biologicznymi. Do produkcji cętków jaguara i leoparda (tzw. że w ten sposób można wygenerować dużą liczbę wzorów zwierzęcych stosując niewielką liczbę parametrów. Reaction–Diffusion są także bardzo wymagające obliczeniowo. Oto założenia algorytmu: 1. Złożoność obliczeniowa zależy od ilości komórek na których przeprowadzana jest symulacja. Początkowo model pokrywany jest komórkami 2. ang. a co za tym idzie przydatność samej metody maleje. którym przypisane są ciemniejsze kolory mają większą prędkość reprodukcji niż te jaśniejsze 4. oraz dla żyraf (Rysunek 3-15). Walter w swoim referacie opisuje system. Komórki różnią się liczbą pochodnych lub szybkością reprodukcji 3. Kolory włosów są rezultatem różnych typów komórek. Ten model został stworzony do generacji powtarzających się cętkowanych wzorów występujących w przypadku kilku gatunków ssaków (duże koty. zebry i żyrafy). Komórki mogą zmieniać swój rodzaj (kolor). Nowo podzielone komórki rozszerzają się tak. Cell Division Walter zaproponował model Cell Division [Walter 1998]. rosette) Walter używa dodatkowych 5 parametrów. Uzyskanie pożądanego wzoru nie jest dzięki temu zadaniem trywialnym. Nie istnieje też jeden model Reaction–Diffusion pozwalający na uzyskanie wszystkich wzorów. Parametry te są jednak mało intuicyjne – podobnie jak w przypadku Reaction-Diffusion trudno je dobrać tak. Ilość zmian może być ograniczona. Trzeba przyznać. Jest to duża zaleta w porównaniu z Reaction-Diffusion. a składa się na nią głównie symulacja numeryczna układu równań różniczkowych cząstkowych (w rozwiązaniu Turka dodatkowe koszty wnoszą podział powierzchni na komórki oraz obliczanie wynikowego koloru z przyległych komórek).Problemem związanym z systemami Reaction–Diffusion ograniczającym ich szerokie zastosowanie jest duża ilość parametrów. w Cell Division wzory odzwierciedlają sposób ułożenia komórek. Ich wpływ na wynikowy wzór jest trudny do przewidzenia. Komórki. rozety. 5. aby otrzymać wzór jakiegoś konkretnego zwierzęcia.

Wynikający stąd sposób działania algorytmów praktycznie dyskwalifikuje je w naszych zastosowaniach.4. Podsumowanie Istnieje jeszcze wiele modeli tłumaczących powstawanie wzorów na skórach zwierząt. Walter. Model mechaniczno-chemiczny wyjaśnia powstawanie wzorów siłami działającymi na komórki. Renderer musi być bowiem zdolny do dostarczenia geometrii teksturowanego modelu.gepard (wzór rozetkowy) żyrafa Rysunek 3-15 M. powierzchni pokrytych górami i kraterami. Zarówno Reaction-Diffusion. która daje możliwości generacji dosyć szerokiego zakresu tekstur. ewoluując wzór przed rozpoczęciem renderingu.2. Wszystkie wspomniane metody generowania wzorów na skórze ssaków używają podstaw. zmiętego papieru. Cell Division jak i pozostałe metody działają w sposób explicite. Przykładowe tekstury autorów generowane były na wysokiej wydajności wieloprocesorowych maszynach. które są uważane za zgodne z naturalnymi (a przynajmniej za prawdopodobnie zgodne). Autor wykorzystał ją do symulacji nieregularnych powierzchni przypominających płyty. 26 . Wzory ssaków są także generowane za pomocą automatów komórkowych. jak i Cell Division są bardzo wymagające obliczeniowo. skał. w którym przeprowadzany jest rendering. skóry. ale wprowadza dodatkowe koszty obliczeniowe (podział geometrii na komórki). Turk w swojej implementacji Reaction-Diffusion unika rzutowania płaskiego obrazu na model przeprowadzając proces ewolucji tekstury na samej geometrii. lodu. Rysunek 3-16 pokazuje przykład wykorzystania komórkowej funkcji bazowej do generacji tekstury przypominającej kamienny mur. Zarówno Reaction-Diffusion. Komórkowe funkcje bazowe tekstur (cellular texture basis function) Worley zaproponował realizację komórkowej funkcji bazowej. To oczywiście podwyższa jakość wyników. 3. Implementacja opisana przez Waltera i Fourniera w [Walter 1998] ogranicza się do produkcji kwadratowych tekstur powierzchniowych. Tekstury wygenerowane metodą Cell Division i ich naturalne odpowiedniki. Wprowadza także dodatkowe wymagania co do systemu.

vo( p) = {x ∈ R d | dist ( x. jest zdefiniowany jako zbiór punktów w R d . Rysunek 3-17 Diagram Voronoi Sposób działania funkcji komórkowej Worleya dla R 3 : • Przestrzeń dzielona jest na kostki. to znaczy nie wymaga długiej fazy obliczeń wstępnych i nie przeprowadza obliczeń w sposób explicite. p ) ≤ dist ( x. Jest także wydajna i stosunkowo nieskomplikowana. Podział przestrzeni na kostki służy dalej optymalizacji poszukiwań n najbliższych punktów. diagram Voronoi jest podziałem przestrzeni R d na n wielościennych obszarów vo( p). Każdy obszar vo( p) . Działanie funkcji jest oparte na podziale przestrzeni według diagramu Voronoi. Worley – Przykład wykorzystania komórkowej funkcji bazowej Funkcja nie posiada wad rozwiązania Miyaty. zwany komórką Voronoi. • W każdej kostce umieszczana jest w losowych pozycjach pewna ilość punktów (ilość punktów jest obliczana na podstawie prawdopodobieństwa o rozkładzie 27 . Mając dany zbiór S n punktów przestrzeni R d . p ∈ S . q)∀q ∈ S − p} Rysunek 3-17 przedstawia przykładowy diagram Voronoi w przestrzeni R 2 .Rysunek 3-16 S. które są od p w odległości mniejszej niż każdy inny punkt należący do S [Fukuda 2000].

naskórka ludzkiego. j. Autor podaje przykłady zastosowania innych funkcji. Sposób generacji tekstur komórkowych Worleya został zaadoptowany przez Jamesa M. liczba losowa jest otrzymywana na podstawie współrzędnych kostki (i. np. Zbiór wszystkich wylosowanych punktów to S Obliczanie wartości funkcji dla punktu X: o Obliczanych jest n punktów należących do S leżących najbliżej X o W zależności od potrzeb zwracany jest identyfikator n-tego najbliższego punktu. podobnie jak szum Perlina. łatwo składane z innymi funkcjami (np. Worley . 28 . podziałów przestrzeni. kierunek do niego itp. Mogą być. Bedwell ([Kukla]) do produkcji realistycznych wzorów skóry. Metoda Worleya doczekała się wielu implementacji (np.Przykłady tekstur uzyskanych dzięki zastosowaniu różnych kombinacji liniowych funkcji Fn Funkcje bazowe Worleya dają możliwość łatwej rozbudowy. Funkcja wynikająca z definicji diagramu Voronoi poszukuje pierwszego najbliższego punktu używając metryki Euklidesowej. Przykłady tych eksperymentów znajdują się na Rysunek 3-18. albo też wyjście funkcji komórkowych może być wykorzystywane przez inne funkcje teksturujące) oraz nakładane warstwami. Wyniki niektórych ich prac znajdują się na Rysunek 3-19. położenie punktów należących do S może być kontrolowane za pomocą innych funkcji teksturujących. Można też wyobrazić sobie zastosowanie innych niż według diagramu Voronoi. Przekształcili oni oryginalne funkcje dzielące przestrzeń uzyskując bardzo dobre wyniki symulacji m. Kukla i Edwarda J.in. [Legakis]). Rysunek 3-18 S. oraz kombinacje liniowe różnych funkcji Fn . Fn podającą n-ty najbliższy punkt. Worley eksperymentuje z różnymi funkcjami oceniającymi odległość punktu X od punktów należących do S .• Poissona. k)).

że lista możliwych do uzyskania efektów jest długa. Przede wszystkim zaś te algorytmy działają w sposób explicite i są mało wydajne. Funkcje te są stosunkowo wydajne i łatwo poddają się optymalizacji (przez obliczanie pewnych wartości przed rozpoczęciem renderingu. czyli szum Perlina. Nam chodzi o symulację szerokiego kręgu zjawisk fizycznych.2. jednak większość z nich to produkty komercyjne. Zakres obsługiwanych efektów jest bardzo mały (istnieją 3 rodzaje tekstur przestrzennych). Sam nie jest jednak wystarczający. ponieważ nie jest w stanie produkować większości wzorów komórkowych. które używają podstaw fizycznych są w stanie tworzyć ograniczoną liczbę wzorów.Rysunek 3-19 J. Podsumowanie Z reguły te metody generacji. LIBTEX LIBTEX [Walter 1992] to niezależny od aplikacji zbiór funkcji umożliwiających zastosowanie technik teksturowania w systemach do renderingu. które bazują na tym sposobie podziału przestrzeni udowadniają. zastosowanie cache. Sposób ewaluacji tekstur przestrzennych pokazuje Diagram 3-1. Pozostałe sposoby generacji tekstur.5. aczkolwiek biblioteka może być rozbudowywana. Dostępne komercyjnie biblioteki do tworzenia wzorów proceduralnych Istnieje szereg bibliotek produkujących tekstury proceduralne. Szum Perlina będzie wykorzystywany na pewno jako funkcja składana z innymi. który jest aktualnie cieniowany. ale nie podają żadnych konkretnych rezultatów. a na jego podstawie obliczany zostaje kolor wynikowy. Reaction-diffusion oraz Cell Division osiągają bardzo dobre wyniki w symulacji skóry zwierząt.3. itp. Kukla . metoda Miyaty oraz tekstury komórkowe Worleya nie tłumaczą podstaw powstawania żadnych zjawisk. 29 . Poniżej przedstawiam dwie wybrane implementacje: LIBTEX oraz PixelLoom. bo posiadające najszersze możliwości zastosowania i rozbudowy wydają się funkcje Worleya. Architektura biblioteki jest bardzo prosta – system dostarcza współrzędnych punktu. Przykłady podane przez autora oraz inne. Techniki mało wydajnej i również nie spełniającej oczekiwań stawianych przed tworzonym systemem.). Miyata pokazuje jednak bardzo ograniczone zastosowanie swojej techniki. Autorzy mówią o innych potencjalnych zastosowaniach. Najbardziej obiecujące. 3.Tekstury skóry. 3. których jedynymi wspólnymi cechami są właściwości wizualne – podział przestrzeni na komórki.

dlatego nie ma na temat jej architektury ani sposobu działania wielu informacji. PixelLoom To najbardziej interesująca.Diagram 3-1 LIBTEX – ewaluacja tekstur przestrzennych W przypadku tekstur proceduralnych LIBTEX nie korzysta z żadnych dodatkowych informacji o kontekście cieniowania. Nie posiada możliwości antialiasingu tekstur. odwzorowanie nierówności powierzchni. co prawda. LIBTEX przeprowadza próbkowanie punktowe. Jest ona jednak produktem komercyjnym. Rysunek 3-20 Obraz wygenerowany przy pomocy biblioteki PixelLoom 30 . jednak ta operacja oraz teksturowanie 2D nie wykorzystują technik proceduralnych. Rysunek 3-20 przedstawia obraz wygenerowany przy użyciu tekstur proceduralnych wchodzących w skład biblioteki. Biblioteka przeprowadza też. gdzie korzysta z wartości normalnej do cieniowanej powierzchni. biblioteka. a jedynie tradycyjne tekstury w postaci obrazów 2D lub map nierówności. bo posiadająca największe możliwości.

edu/lw/shades/) – zbiór tekstur dla LightWave. głównie konwertowane z shaderów RenderMan • RenderMan Repository (http://www. Miała się pod postacią TextureGenerator ukazać jako moduł rozszerzenia do 3D Studio MAX. Jednym z nich jest CorelTEXTURE.PixelLoom jest biblioteką służącą jako baza do budowy aplikacji generujących tekstury fotorealistyczne. Z interesującej nas grupy zjawisk można tam znaleźć algorytm ‘Komórki’ generujący wiele rodzajów prostych tekstur komórkowych. CorelTEXTURE generuje jedynie płaskie tekstury. PixelLoom jest wykorzystywany przez kilka programów do generacji płaskich tekstur. CorelTEXTURE umożliwia tworzenie tekstur za pomocą techniki nakładania kolejnych warstw.shaders. Każda z warstw jest generowana przez jeden z wbudowanych algorytmów. papier chropowaty kamień kamienie wzór abstrakcyjny Rysunek 3-21 Przykłady tekstur komórkowych wygenerowanych za pomocą CorelTEXTURE Podsumowanie Większość bibliotek tekstur jest zorientowana na konkretny system do renderingu.arizona.renderman. Nie wiadomo jednak jakimi możliwościami integracji z systemami do renderingu dysponuje.zbiór procedur teksturujących pisanych w języku Shading Language 31 . Przykładami są • IFW Procedural Textures (http://www.rc. Rysunek 3-21 przedstawia przykłady możliwych do uzyskania efektów.org) . Lightwave i SoftImage.org)– duży zbiór tekstur dla LightWave/Inspire • Shades project (http://amber.

Wynika to z różnic między interfejsami proceduralnymi, które występują między systemami. Użycie biblioteki z każdym nowym systemem wymaga stworzenia interfejsu pośredniczącego adaptującego bibliotekę do konkretnego systemu. Pociąga to za sobą dodatkową komplikację algorytmów i może pociągnąć spadek wydajności.

32

4. Metody i techniki wykorzystane w pracy
Rozdział ten opisuje sposób generacji tekstur proceduralnych, jakiego użyto w trakcie badań. Definiuje pojęcie funkcji bazowej, metody ich składania oraz konkretne algorytmy i implementacje funkcji używanych dalej do produkcji ciekawych wzorów proceduralnych. W szczególności omawiane są metody oparte na definicji szumu wg. Perlina, podziale przestrzeni wg. diagramu Voronoi oraz ich proponowane rozszerzenia do wersji fraktalnych i wykorzystujących różne metryki.

4.1. Funkcja teksturująca jako złożenie funkcji bazowych
Funkcja teksturująca wyznacza pewne atrybuty cieniowanej powierzchni. Jako wejście otrzymuje parametry kontekstu wejściowego, a obliczone atrybuty umieszcza w kontekście wyjściowym. W przypadku biblioteki TexLib jest ona zbiorem tzw. funkcji bazowych tworzących pewien algorytm cieniujący. Można więc powiedzieć, że system generacji tekstur opisany w tej pracy umożliwia tworzenie wzorów za pomocą składania pewnych funkcji bazowych. Funkcje bazowe mogą implementować algorytmy o różnym poziomie złożoności, od prostych funkcji często używanych w grafice komputerowej, jak sin(x), fmod(a, x), po bardziej skomplikowane funkcje szumu Perlina i inne wielowymiarowe (posiadające większą liczbę parametrów) i mające wiele wyjść (parametrów wyjściowych). Funkcja bazowa jest określona pewnymi parametrami wejściowymi oraz produktami w postaci wyjść. Każde z wejść oraz wyjść funkcji bazowej posiada swój identyfikator, typ oraz wartość domyślną. Na przykład, specyfikacja funkcji Checker jest przedstawiona w Tabela 4-1. Dalej, w opisach konkretnych algorytmów, specyfikacja służy prezentacji podstawowych właściwości danej funkcji i może być wykorzystywana jako szybkie przypomnienie efektów działania i sposobu jej wykorzystania.
Checker

Funkcja przypisująca punktowi P jeden z dwóch podanych kolorów. Tworzy wzór trójwymiarowej szachownicy.

identyfikator parametru
P scale white black color

typ Point Vector Color Color Color

wartość domyślna (0, 0, 0)

opis

WEJŚCIA punkt w przestrzeni, dla którego obliczyć kolor skala wzoru (wartości > 1 powoduję zmniejszenie wzoru, (1, 1, 1) wartości <1 jest powiększenie) (1, 1, 1) kolor pól parzystych (0, 0, 0) kolor pól nieparzystych WYJŚCIA kolor dla podanego punktu P
Tabela 4-1 Specyfikacja funkcji Checker

33

Składanie funkcji bazowych odbywa się przy zastosowaniu pewnych reguł: 1. Każdemu z wejść można przypisać wyjście innej funkcji bazowej jeśli jest ono tego samego typu. Niech będą dane funkcje bazowe F i G takie, że
(o1, o2, ..., on) = F(p1, p2, ..., pn) o = G(pg1, pg2, ..., pgn), p1, p2, ..., pn – parametry wejściowe, o, o1, o2, ..., on – wyjścia – wartości produkowane przez funkcję

gdzie:

Wtedy przypisanie wyjścia funkcji G i-temu wejściu funkcji F można zinterpretować jako złożenie funkcji w którym uzyskujemy następującą postać funkcji F:
(o1, o2, ..., on) = F(p1,...,p(i-1), G(pg1, pg2, ..., pgn), ...,pn)

Na przykład, niech Checker będzie określona jako
checker(P, scale, white, black)

Wtedy wyjście górnej funkcji Checker na Rysunek 4-1 A można zapisać
checker1( P1, scale1, checker2(P2, scale2, white2, black2), checker3(P3, scale3, white3, black3) ),

przy czym white3 i black3 mogą być produktami jakichś innych funkcji bazowych, natomiast white2 i black2 są wartościami domyślnymi. 2. Wejście bez przyporządkowanego wyjścia innej funkcji bazowej ma wartość stałą równą jego wartości domyślnej. 3. Po trzecie, jeśli przyjmiemy, że funkcje bazowe to zbiór węzłów V grafu G=(V, E), a połączenia parametrów wejściowych z wyjściowymi są zbiorem jego krawędzi E, przy czym połączenie z dowolnym wejściem lub wyjściem funkcji bazowej f jest traktowane jak połączeniem z tą funkcją to G musi być grafem zorientowanym, acyklicznym. Poprawne jest zatem połączenie na rysunku Rysunek 4-1 A, natomiast przypadek B jest niepoprawny i niemożliwy do obliczenia ze względu na cykl prosty.

A Poprawny graf połączeń między funkcjami

B Błędny graf połączeń między funkcjami (cykl zaznaczony na czerwono)

Rysunek 4-1 Przykłady połączeń między funkcjami bazowymi

Każde wejście i wyjście może być opisane jednym ze zdefiniowanych typów. Tabela 4-2 zawiera opisy wszystkich dostępnych typów.

34

Potrzebne do ewaluacji drzewa parametry (kontekst cieniowania dla każdej obliczanej przez system renderujący próbki obrazu) mogą być pobierane z wyjść abstrakcyjnej funkcji InContext. 4. CalculateNormal Funkcja obliczająca zmodyfikowany wektor normalny do płaszczyny mająca daną funkcję wysokości. Nie jest także możliwe ich dodawanie do drzewa cieniowania – zakłada się. które nie udostępniają rzeczywistego zniekształcania powierzchni.1.3. Maksymalny zestaw parametrów powierzchni możliwych do modyfikacji jest określony i zaimplementowany w abstrakcyjnej funkcji bazowej o nazwie OutContext jako jej wejścia. jakie parametry mogą być zmienianie. tablica 3 wartości typu Float kolor RGB. ponieważ są interpretowane przez konkretny system do renderingu. Dokładny ich opis można znaleźć w punkcie 5. Uwaga: Funkcja wymusza obliczenie wartości height_func kilkukrotnie.5. Jest używana do odwzorowania nierówności powierzchni (ang. Opis zaimplementowanych algorytmów Poniżej opisane są zaimplementowane algorytmy oraz odpowiadające im w bibliotece funkcje bazowe używane dalej do produkcji wzorów proceduralnych.. która z kolei pobiera je z systemu do renderingu. Część systemów do renderingu może nie udostępniać możliwości modyfikacji wszystkich określonych tam parametrów. Tabela 4-3 prezentuje specyfikację tej funkcji. To.1] tablica wartości typu Color tablica wartości typu Float Tabela 4-2 Typy parametrów wejściowych/wyjściowych funkcji bazowych 4. g. b). tablica 3 wartości typu Float (r.2. bump mapping) w systemach.5.nazwa typu Int Float Point Vector Color ColorArray FloatArray charakterystyka wartość całkowita wartość zmiennoprzecinkowa współrzędne punktu. Odwzorowanie nierówności powierzchni Specjalną funkcją jest funkcja CalculateNormal modyfikująca (zakłócająca) wektor normalny do płaszczyzny mając daną funkcję wysokości. Drzewo cieniowania może modyfikować jeden lub wiele z parametrów cieniowanej powierzchni. Opisy zawierają także szczegóły implementacyjne oraz metody usprawnienia i antialiasingu.3. jest w pewnym stopniu uzależnione od konkretnego systemu renderującego. b leżą w przedziale [0. g. Funkcje OutContext i InContext są nazywane abstrakcyjnymi. tablica 3 wartości typu Float wektor. Drzewa cieniowania Grafy określone w poprzednim punkcie stanowią drzewa cieniowania. puste drzewo cieniowania zawiera konteksty). przez to wszystkie wzory połączone w drzewie cieniowania pod wykorzystujący je parametr height_func będą ewaluowane kilka razy dla różnych wartości punktu P. Konkretne zmienne stanu kontekstu cieniowania biblioteki TexLib zostały ustalone na podstawie kilku systemów do grafiki fotorealistycznej. 4. że w drzewie istnieją zawsze pojedyncze instancje tych funkcji (tzn. 35 . przy czym r.

identyfikator parametru typ wartość domyślna opis sample P N height_fu nc amp_scale Sample Point Vector Float Float Vector (0. Uwaga: System wykorzystujący bibliotekę musi poprawnie wypełnić strukturę sample. wektory U oraz V są obliczane jako ∂height _ func ∂P (N × ) U = ∂u ∂v ∂height _ func ∂P V = (N × ) ∂v ∂u Wektor U leży więc w tej samej płaszczyźnie co dPdu. 0. a jego długość jest równa zmianie height_func w kierunku wektora u. Nowa wartość N’ = N+D. 0) (0. 0. Suma tych dwóch wektorów daje odchylenie D. Wektor V leży w płaszczyźnie dPdv i ma długość równą zmianie height_func w kierunku v. Nie wszystkie systemy udostępniają potrzebne informacje. V U D N N’ DPdv DPdu Rysunek 4-2 Geometria odwzorowania nierówności powierzchni Na rysunku: N – normalna do płaszczyzny N’ – zmodyfikowana normalna dPdu. dPdv – pochodne punktu w kierunkach osi parametrów u. dla którego obliczyć kolor normalna do płaszczyzny w punkcie cieniowania funkcja wysokości N Amplituda nierówności.. v płaszczyzny Mając daną funkcję wysokości height_func. 1) 0 WEJŚCIA Parametry cieniowanego punktu (opis patrz punkt.). Im większa tym bardziej odchylane 0.1 są normalne – tym wyraźniejsze nierówności na płaszczyźnie. punkt w przestrzeni. 36 . WYJŚCIA Nowy wektor normalny do płaszczyzny Tabela 4-3 Specyfikacja funkcji bazowej CalculateNormal Obliczenie normalnej opiera się na geometrii przedstawionej na Rysunek 4-2..

będę się dalej posługiwał przykładem 2-wymiarowego szumu) ustalamy więc funkcję dającą w wyniku wektor 2-wymiarowy: g (i.∂height _ func ∂height _ func oraz funkcja oblicza wartości height_func ∂u ∂v w punkcie P. która zachowuje statystyczną niezmienniczość przy obrotach i przesunięciach. dla której szukamy wartości szumu interpolujemy dostając skalarną wartość szumu. j – dyskretne współrzędne siatki Licząc wartość szumu dla punktu (x. j + 1)) I ( i +1. j). y ) − (i + 1. Aby zbadać wartości Do renderingu obrazka widocznego w metryce funkcji użyto realistycznego modelu oświetlenia. j +1) = G( i +1. j +1) * (( x. Szum Perlina Algorytm W punkcie 3. j +1) = G( i . Implementacja szumu wykorzystana w bibliotece jest oparta na technice szumu gradientowego (ang. j ) * (( x.1 zostały przedstawione główne własności szumu Perlina. j +1) * (( x. lecz w każdym jej węźle losowany jest wektor kierunku. ograniczenie wartości oraz ograniczenie częstotliwości (maksymalna częstotliwość jest równa 1).2. Metoda gradientowa także stosuje dyskretną siatkę. Rysunek 4-3 Pseudo model oświetlenia 4. j + 1)) 37 . y) do węzła siatki (wektory V na rysunku). y ) − (i + 1. że i jest największą liczbą całkowitą mniejszą od x. W ten sposób (x. (i. y ) − (i. aby każdy kierunek był jednakowo prawdopodobny. Rysunek 4-3 jest przykładem takiego zastosowania funkcji CalculateNormal. (i. Dostajemy w ten sposób 4 wartości skalarne I: I ( i . j ) = ( g x . Oznacza to. dobra funkcja generująca szum to taka. że można osiągnąć interesujące efekty pseudo-oświetlenia traktując kierunek normalnej jako kolor. Szum tak powstały nie zachowuje własności niezmienniczości i podczas obrotów widoczne są pewne artefakty. czyli powtarzalność. j ) * (( x. że funkcja wygląda podobnie niezależnie od tego jak ją obrócimy i przesuniemy. (i+1. oraz punktach P + u * ε i P + v * ε . j+1).3. y ) − (i. który zachowuje wszystkie te własności. y). y) leży w komórce ograniczonej punktami (i+1. w której stosujemy dyskretną siatkę n-wymiarową (zależnie od tego w jakiej przestrzeni powstaje tekstura) z losowymi skalarnymi wartościami w każdym węźle. j jest największą liczbą całkowitą mniejszą od y. j+1). j). Ważne jest przy tym. j ) = G( i +1. Wartości w węzłach najbliższym pewnej ciągłej wartości. Nie jest tak w przypadku najprostszej i najbardziej intuicyjnej metody. gradient noise). Dodatkowo. Wpływ każdego z wektorów gradientu (wektory G na Rysunek 4-4) obliczamy jako iloczyn skalarny odpowiedniego wektora G oraz wektora od punktu (x. j )) I ( i . Dla 2-wymiarowej siatki (dla ustalenia uwagi. j ) = G(i . gdzie i. j )) I ( i +1. g y ) . Ciekawostką jest.2. wybieramy takie współrzędne dyskretne w siatce (i. j).

1) (i+1. j ) ) b = I ( i . smoothstep jest przedstawiona na wykresie Rysunek 4-5. j+1) G(i. często używaną w grafice komputerowej jako funkcja wygładzająca. Smoothstep(x) 1 0. j ) + S x ( I ( i +1. funkcja szybko zmierza do wartości krańcowych dla parametrów bliskich 0 i 1. j) j) . j) G(i+1.Wartości te interpolujemy z wagami zależnymi od odległości punktu (x. oraz Sy – waga dla wymiaru y.j) V( V( i+1 (x. j +1) ) noise( x. y ) = a + S y (b − a) Narzuca się tutaj obliczenie Sx = x-i. Sy = y-j. y) od poszczególnych węzłów siatki. Jak widać. y) . j+ 1) V(i (i. jednak w praktyce znacznie lepsze wyniki daje nieliniowa zależność wag S od odległości od węzłów siatki. natomiast parametry z przedziału środkowego są „rozciągane”. (i. j +1) − I (i . j ) − I ( i . j+1) G(i+1. j+1) Rysunek 4-4 Obliczanie szumu Perlina 2D metodą gradientową a = I (i .5 0 0. oznaczonych dalej jako Sx – waga dla wymiaru x. j) G(i.j+1) (i+1.5 1 X Rysunek 4-5 Wykres funkcji smoothstep(x) 38 . j+ V(i i . Zastosowano tutaj funkcję smoothstep( x) = 3x 2 − 2 x3 .j) +1 . j +1) + S x ( I (i +1.

).fraktalna turbulencja Rysunek 4-6 Przykłady szumu fraktalnego Kolejne warstwy szumu posiadają częstotliwość d razy większą. Zarówno szum Perlina jak i opisane dalej inne rodzaje szumów są zdefiniowane w klasach pochodnych CNoise (CNoisePerlin itp.fraktalny szum B . octaves. Są one wirtualne i abstrakcyjne i mają następujące deklaracje: virtual virtual virtual virtual FLOAT FLOAT Point Point Get(FLOAT x) = 0.Tak obliczona funkcja noise może łatwo być wykorzystana do generacji wzorów fraktalnych. Klasa ta jest sparametryzowana instancją klasy pochodnej CNoise (np. turbulencji. albo nawet CNoiseFractal) oraz następującymi wartościami: 39 . Dodawanie szumu w celu uzyskania szumu i turbulencji fraktalnych zachodzi więc w następujący sposób: octaves noise(d i P) fractal ( P. Turbulencje uzyskuje się sumując wartości absolutne funkcji noise. Szum z i-tej warstwy posiada także di razy mniejszą amplitudę. A . octaves. Get(Point &p) = 0. Zwykle d=2. klasy CNoisePerlin. a więc i-ta warstwa ma częstotliwość 2i. d ) = ∑ di i =0 turbulence( P. Dodatkowo istnieje specjalna klasa pochodna CNoise o nazwie CNoiseFractal implementująca algorytm uzyskiwania szumu fraktalnego. która definiuje zachowanie szumu. d ) = octaves ∑ i =0 abs ( noise(d i P) ) di Implementacja W bibliotece została zaimplementowana abstrakcyjna klasa CNoise. Przykładowe obrazy są widoczne na Rysunek 4-6. Dodając do siebie wartości noise o różnych częstotliwościach uzyskujemy ciekawe efekty fraktalnego szumu bądź tzw. Get3D(Point &p) = 0. Posiada ona między innymi funkcje pobierające jednowymiarowe i trójwymiarowe wartości szumu dla punktu w przestrzeni R1 i R3. Get3D(FLOAT x) = 0.

0) 0 3 Tabela 4-4 Specyfikacja funkcji bazowej NoisePerlin 4. dla danego punktu P zwraca wartości jedno lub trójwymiarowe. jakie parametry wyjściowe są wykorzystywane. Standardowo szum zwraca wartości z przedziału [-1. Algorytm zaimplementowany w bibliotece TexLib działa w podobny sposób: 40 . który stosuje ten podział przestrzeni.3. identyfikator parametru P fractal octaves typ wartość domyślna opis point int int persisten ce float min. -1. natomiast amplituda a 0. że jeśli liczony jest szum fraktalny. Te parametry pozwalają zmienić tę charakterystykę przez ustalenie wartości minimalnej i maksymalnej. dla którego obliczyć wartość 0 – szum.5 ai+1 = ai*persistence Wartości mniejsze powodują mały wpływ dalszych oktaw szumu.duży. Potrafi także obliczać szum fraktalny. Obrazek widoczny obok powstał przez wizualizację trójwymiarowych wartości szumu jako kolorów. 2 – turbulencja fraktalna Maksymalna ilość oktaw (warstw) szumu Częstotliwość oktawy i+1 fi+1 jest równa fi+1= fi * (1/persistence). Podział przestrzeni według diagramu Voronoi Algorytm Rozdział 3 podaje definicję diagramu Voronoi oraz algorytm Worleya.. max float float color float color WEJŚCIA Punkt.3. wartości większe . Zależnie od tego.1].Typ int Nazwa fractal Opis int float octaves persistence 0 – szum 1 – szum fraktalny 2 – turbulencja fraktalna Określa maksymalną liczbę warstw szumu Określa częstotliwość każdej następnej warstwy i jest odpowiednikiem 1/d w opisywanym algorytmie Funkcja bazowa Funkcja bazowa NoisePerlin. WYJŚCIA jednowymiarowa wartość szumu trójwymiarowa wartość szumu (0. bądź turbulencję fraktalną. otrzymywane wartości końcowe nie będą się prawdopodobnie mieściły w zadanym przedziale. 1 Należy zwrócić uwagę na to. która wykorzystuje opisane zaimplementowane w bibliotece TexLib ma następujące własności: NoisePerlin powyżej algorytmy Produkuje wartości szumu Perlina. 0. 1 – szum fraktalny.

Najmniejsza odległość do jednej z płaszczyzn prostopadłych do wektorów C-S(l. k) służą przyspieszeniu wyszukiwania najbliższych punktów.j+1. punkt 2. najbliższym punktowi P. Najbliższym będzie bowiem któryś z punktów. j+1. który jest środkiem wektora V. j. k).1]. Podany algorytm jest realizowany przez funkcję noiseV(P. Przekrój przez przestrzeń R3. gdzie: C jest punktem S(i. j. k-1. Obliczone współrzędne (i. algorytmu). j. odległość do najbliższej ściany komórki wynikającej z podziału Voronoi. C . punkt S(i-1. j+1.. j. j. odległość |PC| dla n=1. B . których współrzędne dyskretne leżą w przedziale (i-1. k)=C m /2 V 37 S(i-1. k) m S(i+1. 41 . (l. współrzędne siatki (i. irregularity).• • budowana jest 3-wymiarowa siatka współrzędne każdego z węzłów dyskretnej siatki (i.k+1). k)| dla n=2 itd..Odległość do n-tego najbliższego punktu ze zbioru S. m. j. k) są obliczane dla każdego wymiaru jako największe liczby całkowite mniejsze od odpowiedniej współrzędnej (x. k) d P M S(i. k) dla n=2 itd. j+1.Współrzędne n-tego najbliższego punktu ze zbioru S. Na rysunku jest to odległość d. S(i-1. k) S(i+1. Na rysunku np. n) i przechodzących przez ich środki.. j. z).i+1. y. k) i przechodzącej przez punkt M. j.. Wynikiem wywołania funkcji noiseV działającej w opisany powyżej sposób może być (patrz: Rysunek 4-7): A . z) • szukanych jest n najbliższych P punktów ze zbioru S. Zbiór przekształconych punktów to S. • dla punktu P(x. będąca odległością od płaszczyzny prostopadłej do wektora V=C-S(i-1. j-1. k) Innymi słowy. gdzie parametr irregularity jest maksymalną długością wektora odchylającego pierwotne położenia punktów ze zbioru S (patrz. k) są przesuwane o pewien losowy wektor o długości z przedziału [0. Na rysunku punkt C dla n=1. m. odległość |PS(i-1. y. k) Rysunek 4-7 Wyniki działania funkcji noiseV. n)≠(i. j. j.

Zwracana wartość skalarna służy jako waga przy liniowej interpolacji między dwoma kolorami. Bedwell ([Kukla]) stworzone właśnie przy użyciu liniowych kombinacji funkcji Worleya. A – odległość od punktu ze zbioru S B – współrzędne punktu ze zbioru S C – odległość od granicy komórki Rysunek 4-8 Typy wyników zwracanych przez funkcję noiseV. 42 .Kolejne ilustracje (Rysunek 4-8) pomogą wyobrazić sobie. Te kilka przykładowych obrazów pokazuje duży potencjał. Należy tutaj zauważyć ciekawą możliwość. Tabela 4-5 pokazuje przykładowe liniowe i nieliniowe kombinacje funkcji tego typu. Ilustracja A to wynik działania funkcji zwracającej odległość od najbliższego punktu ze zbioru S. Kukla i Edwarda J. jaką dają złożone funkcje biorące jako parametry wartości odległość od n-tego punktu ze zbioru S. który już w swojej podstawowej wersji. mur kamienny itp. o których będzie mowa później. Oznaczmy przez noiseVn funkcję zwracającą n-ty najbliższy punkt i posiadającą parametr irregularity = 0. Wszystkie funkcje z powyższej tabeli zostały znalezione z użyciem automatycznych funkcji przeszukiwania dziedziny parametrów. diagramu Voronoi. jakie możliwości daje tak zdefiniowana funkcja. Opisywane w Rozdziale 3 wzory ludzkiej skóry zostały przez Jamesa M. W połączeniu z wartością odległości od granicy komórki (Ilustracja C) daje to możliwości budowy wzorów typu kamień naturalny. posiada funkcja noiseV. Na ilustracjach w tabeli wynik skalarny funkcji F został użyty do interpolacji liniowej między kolorami czarnym i białym.5. Ilustracja B dobrze ilustruje podział przestrzeni na wg.

6*noiseV1 * ( 0. Można ją zastosować wprost w przypadku funkcji noiseV zwracającej wynik typu A – odległość do najbliższego punktu ze zbioru S.7*noiseV2 F = ( 1.8*noiseV2 + 2*noiseV3 + 1. octaves.4*noiseV5 F = 0.7*noiseV1 + 1.9*noiseV3 ) F = ( -0.6*noiseV1 0.6*noiseV3 F = 0. Jedna z tych wersji została już przedstawiona przy okazji opisu funkcji szumu Perlina.6*noiseV1 F = 1. irregularity ) = octaves ∑ i =0 abs( noiseV (d i P.F = -0.9*noiseV2 + 1.6*noiseV1 0.7*noiseV4 ) * 1. octaves.4*noiseV1 0. irregularity ) ) di 43 .7*noiseV1 + 1.6*noiseV1 0. Tak więc: octaves noiseV (d i P.7*noiseV3 ) * ( 1. d .2*noiseV2 + 0.9*noiseV2 + 0. irregularity ) fractalV ( P.3*noiseV4 0.9*noiseV3 ) Tabela 4-5 Przykłady złożonych funkcji wykorzystujących noiseVn Fraktalny podział przestrzeni według diagramu Voronoi Możliwości funkcji noiseV znacznie się zwiększają. irregularity ) = ∑ di i =0 turbulenceV ( P. jeśli wziąć pod uwagę jej fraktalne wersje.2*noiseV2 0.8*noiseV1 – 0. d .8*noiseV2 0.

wsp_podziału – współczynnik podziału dla warstwy na której się znajdujemy Algorytm kontrolujący obliczenia związane z tym wzorem wygląda jak na Program 4-1. Na ilustracji C niektóre z podzielonych wcześniej komórek uległy kolejnemu podziałowi. gdzie: f – liczba losowa z przedziału [0. opcjonalne przesunięcie dzięki któremu // sąsiednie komórki nie łączą się ze sobą } else break.1]. } //S – wynik: punkt ze zbioru S najbliższy punktowi P // na ‘warstwa’ warstwie Program 4-1 Algorytm fraktalnego podpodziału przestrzeni 44 . let warstwa = 0. niezmienna dla danej komórki (ustalana na podstawie obecnego najbliższego punktu ze zbioru S. //oblicz najbliższy punkt ze zbioru S f = losowa(S). Efekt takich podpodziałów będzie wyglądał jak na Rysunek 4-9. //pętla obliczania punktu S repeat { S = noiseV(P).// przechodzimy do kolejnej warstwy P = P * d. Na powyższym przykładzie dla obydwu etapów był on równy 0. // dodatkowe.Drugie podejście do stworzenia fraktalnej funkcji noiseV polega na zastosowaniu podpodziałów już podzielonej przestrzeni. // zmieniamy częstotliwość (patrz: opis fraktalnego // szumu Perlina) P = P + S.5. Podział komórek na każdym etapie (w każdej iteracji) jest kontrolowany za pomocą współczynników prawdopodobieństwa podziału. Warunek podziału wygląda następująco: f < wsp_podziału[warstwa].. A – podział na 1 poziomie B – podział na 2 poziomach C – podział na 3 poziomach Rysunek 4-9 Ilustracja fraktalnego podpodziału przestrzeni Na ilustracji B niektóre z komórek zostały podzielone funkcją noiseV o dwukrotnie większej częstotliwości. //weź losową liczbę dla punktu S if ( (warstwa < max_ilość_warstw) and //jeśli może być więcej warstw (f < wsp_podziału[warstwa]) ) //warunek podziału { warstwa += 1. na którym zastosowano 3 poziomy funkcji noiseV zwracającej wynik typu B – współrzędne najbliższego punktu ze zbioru S.

5.4 + turbulenceV3 ) Tabela 4-6 Przykłady złożonych funkcji wykorzystujących fractalVn i turbulenceVn 45 .6 turbulenceV2*0.Ciekawe efekty daje użycie złożonych funkcji. 0.6 ) * ( turbulenceV1*0.5) lub turbulenceV(P.5) zwracającą n-ty najbliższy punkt.7 + turbulenceV4*0. 0.2 – turbulenceV2*0.3 ) * ( turbulenceV1*0.4 fractalV2*0.9 ) * (-fractalV1*0.5.4 ) F = ( fractalV1*0.8 ) F = ( turbulenceV1 + turbulenceV2*0. Przykładowe rezultaty tak uzyskanych funkcji znajdują się w Tabela 4-6.6fractalV3*0.3 fractalV4*0.2 – turbulenceV3*0. 0.8 + turbulenceV3 + turbulenceV*0.7 – turbulenceV2*0. 0. 3.8 )* ( -turbulenceV1*0.9) F = ( -fractalV1*0.7 + turbulenceV4*0. F = ( turbulenceV1*0. 3.8 + turbulenceV2*0. Oznaczmy przez fractalVn oraz turbulenceVn funkcję fraktalną używającą fractalV(P.2 fractalV2*0.7 + turbulenceV3*0. których składowe zwracane są przez funkcje fractalV bądź turbulenceV.6 – turbulenceV3*0.

Z ) + dist ( X .. xn ). y2 .metryka Chebycheva 46 .. yn )) = ∑ (x − y ) i i n 2 • Istnieje jeszcze co najmniej kilka ciekawych metryk.... Nazwa Manhattan pochodzi stąd. Y ( y1 .. Y ) =     ∑ xi2  ∑ yi2   n  n  Oto przykłady wzorów uzyskanych dzięki tym metrykom (wszystkie wzory zostały uzyskane przy użyciu tego samego drzewa cieniowania. xn ).. y2 . które można tutaj zastosować: metryki Euklidesowe. x2 . Z ) o metryka Manhattan: odległość między dwoma punktami w przestrzeni nwymiarowej jest równa sumie odległości między poszczególnymi wymiarami. Y ( y1 . nie są proste do wykorzystania praktycznego polegającego na symulacji dobrze znanych z natury wzorów. yn )) = Max ( x1 − y1 .. xn ).. x2 . [Duda])....Niewątpliwie są to najciekawsze z zaprezentowanych tutaj wzorów.. dist ( X . xn − yn ) • metryki nieeuklidesowe [Fielding] o metryka cosinusowa: cosinus kąta między dwoma wektorami ∑ xi yi n dist ( X . x2 − y2 . yn )) = ∑ xi − yi n o metryka Chebycheva: odległość między dwoma punktami w przestrzeni nwymiarowej jest równa maksimum z różnic między poszczególnymi wymiarami dist ( X ( x1 ..... Y ) ≤ dist (Y .. jeśli chodzi o parametry. jednak ze względu na swoją złożoność... y2 . Zastosowanie nieeuklidesowych metryk Diagram Voronoi zdefiniowany wg [Fukuda 2000] w Rozdziale 3 wykorzystuje metrykę Euklidesa do stwierdzenia odległości dist od punktów należących do zbioru S dist ( X ( x1 . że w mieście odległości między 2 punktami nie można zmierzyć prostą. Y ( y1 . dist ( X ( x1 . x2 . jedyną różnicą jest wykorzystana metryka): A – metryka Euklidesa B . lecz liniami prostopadłymi do siebie.. czyli zachowujące równanie trójkąta ([Cahn].

dla którego obliczyć wartość Jaką stosować metrykę obliczania odległości: 0 – euklidesowa 1 – Manhattan 2 – Chebycheva 0 – szum. 2 – turbulencja fraktalna Maksymalna ilość oktaw (warstw) szumu Częstotliwość oktawy i+1 fi+1 jest równa fi+1= fi * (1/persistence). Wynik 3D to współrzędne tego punktu. wartości większe . 0. identyfikator parametru P metrics fractal octaves typ wartość domyślna opis point int int int (0. Ich metryki zostały przedstawione w Tabela 4-7 i Tabela 4-8.Euklidesowa P P Chebycheva Manhattan P C – metryka Manhattan Strefy punktów o równych odległościach od punktu P dla różnych metryk. 0) 0 0 3 persisten ce float 0. Rysunek 4-10 Wpływ zastosowania różnych metryk odległości Funkcje bazowe Zaimplementowane zostały 2 funkcje bazowe wykorzystujące algorytm podziału przestrzeni według diagramu Voronoi. Wartość ‘border_dist’ jest odległością od ‘granicy’ komórki. Wynik skalarny jest dla punktu P odległością od najbliższego punktu ze zbioru S. natomiast amplituda a ai+1 = ai*persistence Wartości mniejsze powodują mały wpływ dalszych oktaw szumu.5 WEJŚCIA Punkt. 47 .duży. 1 – szum fraktalny. NoiseWorley Produkuje wartości szumu Worleya (wynikającego z podziału przestrzeni według diagramu Voronoi) 1D oraz 3D.

Wynik 3D to współrzędne tego punktu. 0) 0 [0. WYJŚCIA float Float Jednowymiarowa wartość szumu.. Nieregularność komórek.Nieregularność komórek. wartości większe – dużych komórek (dla wartości >1 komórki będą większe od tych na oryginalnej warstwie.1]. identyfikator parametru P metrics typ wartość domyślna opis point int (0.5 wprowadzić do obrazu artefakty.. 0. wartości mniejsze od 0 są niedopuszczalne i zamieniane na 0. Wynik skalarny jest dla punktu P odległością od najbliższego punktu ze zbioru S na danym poziomie. natomiast amplituda a ai+1 = ai*persistence Wartości mniejsze powodują pojawienie się małych komórek na następnych warstwach.5 irregular ity Float 0. Ta wartość powinna zawierać się w przedziale [0. dla którego obliczyć wartość Jaką stosować metrykę obliczania odległości: 0 – euklidesowa 1 – Manhattan 2 – Chebycheva Współczynniki prawdopodobieństwa przejścia w danej komórce na następny poziom (do następnej warstwy). wartości mniejsze od 0 są niedopuszczalne i zamieniane na 0. Ta wartość powinna zawierać się w przedziale [0. Wartości większe od 1 mogą wprowadzić do obrazu artefakty. irregular ity border_di st Float Odległość do ‘ściany’ komórki Tabela 4-7 Specyfikacja funkcji bazowej NoiseWorley FractalNoiseWorley Produkuje wartości szumu Worleya (wynikającego z podziału przestrzeni według diagramu Voronoi) 1D oraz 3D na losowym poziomie podpodziału. Wartość ‘level’ jest poziomem podziału. Domyślnie wartość eff y funkcji jest obliczana jako F1. Parametr linear_coeff nie ma znaczenia dla tego parametru wyjściowego. Częstotliwość warstwy i+1 fi+1 jest równa fi+1= fi * (1/persistence). WYJŚCIA 48 . będąca współrzędnymi punktu środka color Color najbliższej komórki.5 WEJŚCIA Punkt. Wartości większe od 1 mogą Float 0. Poziom podpodziału w danej komórce jest rekurencyjnie kontrolowany za pomocą współczynników określających prawdopodobieństwo przejścia na następny poziom.1].5] divide_fa FloatArra ctor y persisten ce float 0. Wartości liniowych współczynników przy obliczaniu linear_co FloatArra [1] jednowymiarowej wartości szumu. Trójwymiarowa wartość szumu.

większość uzyskiwanych wzorów nie przypomina niczego spotykanego w rzeczywistości. B=0. 0. za pomocą metody dobierania losowych parametrów) wybieramy te przypadki.1] oraz rozdzielczość r = 1. które. Po ustaleniu przedziałów oraz rozdzielczości poszukiwania. C=1 . że opisane algorytmy produkują jedynie wzory mniej lub bardziej abstrakcyjne.. które są najbardziej zbliżone do wzoru. Niech będzie nim A i niech będzie dany przedział przeszukiwania [0.2.. 0. Została ona także wykorzystana do początkowej eksploracji możliwości algorytmów. Rzeczywiście. C=1 49 . Losowe parametry Na podstawie pokazanych przykładów można odnieść wrażenie. będąca wpółrzędnymi punktu środka najbliższej komórki.. Jest tak. k1]. jakie daje konkretny algorytm. . największa ilość ciekawych symulacji odkrytych w trakcie badań. Z tego powodu zastosowano kilka metod przyspieszających proces powstawania tekstury proceduralnej..2. dostaniemy następujących 8 obrazów: 1:A=0. W rzeczywistości. bądź przeszukujemy ten zakres systematycznie.0. trudno jest zdecydować. [p2.4.. gdzie rozpatrzone zostaną wszystkie kombinacje parametrów. B=0. po kilku dalszych poprawkach. C=0 2:A=0. który chcemy symulować. Przykładowo.4. Dla 2 i większej ilości parametrów o zakresach [p1.4.. Przeszukiwanie domeny parametrów Po wstępnym zapoznaniu się z możliwościami. który z nich będzie dawał najlepsze efekty w interesującej nas dziedzinie. mając dane następujące parametry i ich zakresy: A[0. 4. z których będą losowane ich wartości. tzn.1. gdy staramy się lepiej zrozumieć wpływ jakiegoś wybranego parametru lub kilku parametrów na efekt końcowy. C=1 3:A=0.1] z rozdzielczością 0.. dobierając wcześniej dla interesujących nas parametrów zakresy. ponieważ ilustracje przedstawiane w poprzednim punkcie zostały w większości wygenerowane półautomatycznie.. B=1. [pn. B=1.float color level Float Color Int Jednowymiarowa wartość szumu Trójwymiarowa wartość szumu. w których parametr A będzie kolejno przyjmował wartości 0. powstała dzięki tej metodzie. kn] i rozdzielczości r dostaniemy ((k1-p1)*(k2-p2)* . będą mogły służyć do symulacji realnych zjawisk. dzięki którym można generować dowolną ilość obrazów. nie mające wiele wspólnego z tymi spotykanymi w naturze.1]. Nietrudno jednak w zbiorze tak stworzonych obrazów i drzew cieniowania wybrać te.1. C=0 4:A=0. Opisywany system posiada mechanizm przeszukiwania pewnej ustalonej domeny parametrów. *(kn-pn))/r obrazów.1].1. Jest to sposób szczególnie przydatny wtedy.. System do budowy drzew cieniowania wykorzystany do badań udostępnia proste metody. bądź całe drzewo cieniowania (np. 8:A=1. system generuje kolejne obrazy. stosując iteracyjnie metodę parametrów losowych. większość parametrów ręcznie zbudowanego drzewa cieniowania została dobrana losowo. 4. B=1. Każda z wartości z wybranego zakresu posiada takie samo prawdopodobieństwo wybrania. B[0.. 1.. Dalszy dobór parametrów pozostawiamy odpowiednio zawężonemu zakresowi losowych parametrów. k2].0. C[0. W rezultacie dostaniemy 11 obrazów. Automatyzacja poszukiwania użytecznych wzorów proceduralnych Ze względu na różnorodność dostępnych algorytmów oraz ich kombinacji. Poziom zagłębienia (aktualna warstwa) Tabela 4-8 Specyfikacja funkcji bazowej FractalNoiseWorley 4. Sposób działania tego mechanizmu jest oczywisty dla 1 parametru. .

w jaki sposób interfejs jest używany przez system renderujący.1. które ją wykorzystuje. To. Moduł obsługi drzew cieniowania przechowuje definicje tekstur (będących złożeniami podstawowych funkcji cieniujących) oraz wykonuje ich 50 . który udostępnia funkcje definiowania i obsługi drzew cieniowania. można podzielić z naszego punktu widzenia na pewne moduły funkcjonalne (niekoniecznie pokrywające się z modułami wynikającymi z implementacji). w TexLib można wydzielić 4 główne moduły funkcjonalne: 1.3 5.1. Biblioteka Z punktu widzenia aplikacji i interfejsu do biblioteki. Dokładny przebieg procesu cieniowania został przedstawiony w punkcie 5. Aplikacja musi więc. jednak najczęściej funkcje interfejsu biblioteki są wywoływane z funkcji cieniujących (patrz: opis przebiegu renderingu w punkcie 2.1. Obsługa drzew cieniowania. za pomocą odpowiednich funkcji interfejsu. sposób działania oraz wybrane aspekty implementacji biblioteki TexLib stworzonej i wykorzystywanej w trakcie badań nad teksturami proceduralnymi.2. Architektura biblioteki oraz potencjalnego systemu ją wykorzystującego przedstawiona została na Diagram 5-1. przekazać swój aktualny kontekst cieniowania. Interfejs Biblioteka komunikuje się z systemem renderującym za pomocą interfejsu. SYSTEM funkcja cieniująca kontekst cieniowania BIBLIOTEKA TexLib kontekst cieniowania funkcje cieniujące obsługa drzew cieniowania interfejs serializacja GUI Diagram 5-1 Architektura biblioteki TexLib (moduły funkcjonalne) 5. który jest niezbędny dla ewaluacji odpowiednich parametrów powierzchni przez bibliotekę. Architektura Zarówno bibliotekę jak i system.1). jest zależne od jego implementacji. 5.1. Biblioteka do tworzenia tekstur proceduralnych TexLib W tym rozdziale opisana została architektura.3.1. 5.5. Moduły funkcjonalne systemu renderującego Funkcje cieniujące mają dostęp do informacji związanych z aktualnym kontekstem cieniowania.

odczytywane i wykorzystywane do ewaluacji konkretnych wartości modyfikujących własności powierzchni. Moduł tworzy pliki w formacie *.diagram klas 5.ewaluację. 51 . Zawarte są w nim wszystkie funkcje wykorzystywane w tej pracy do produkcji tekstur. zapisywane. Drzewa cieniowania mogą być zapisywane i odczytywane z dysku. Biblioteka posiada pewną liczbę wbudowanych. opisana w rozdziale 6. 5. Ilość dodatkowych modułów rozszerzających jest nieograniczona (implementacyjnie. Biblioteka może być łatwo rozszerzana o dodatkowe funkcjonalności związane z funkcjami cieniującymi dzięki dodatkowym modułom (oznaczonym na diagramie jako „dodatkowe funkcje cieniujące”). Interfejs graficzny Na Diagram 5-1 został umieszczony jeszcze jeden moduł funkcjonalny – „interfejs graficzny”.2.4. Drzewa cieniowania mogą być z poziomu interfejsu budowane.3. 3. Implementacja . standardowych funkcji cieniujących.2. Przechowywaniem oraz dostarczaniem kontekstu odpowiednim funkcjom wewnątrz biblioteki TexLib zajmuje się moduł funkcjonalny oznaczony na Diagram 5-1 jako „kontekst cieniowania”.5 przedstawiają schematy klas biblioteki. Podejście obiektowe dało możliwość zaprojektowania łatwej do rozbudowania architektury. moduły z funkcjami cieniującymi to biblioteki łączone dynamicznie (DLL w przypadku Windows). interpolacji. informacje związane z antialiasingiem i wiele innych informacji).1. Funkcje cieniujące. ale został na potrzeby tej pracy zaimplementowany jako oddzielna aplikacja. Aplikacja wykorzystuje TexLib za pomocą innego interfejsu niż systemy renderujące (aczkolwiek jest zintegrowana z systemem do renderingu LADS.4 oraz 5. 4. czym zajmuje się moduł serializacji.1.TREE został przedstawiony w dodatku Dodatek B). narzędzia wspomagające budowanie tekstur modyfikujących normalne cieniowanych powierzchni i inne.TREE (opis formatu *. Diagramy 5. normalna do powierzchni. Serializacja.2. 5. który z kolei wykorzystuje opisany interfejs do wizualizacji budowanych drzew cieniowania) 5. W trakcie procesu tworzenia obrazu (renderingu) biblioteka musi znać aktualny kontekst cieniowania (czyli współrzędne cieniowanego punktu. który nie wchodzi w skład biblioteki TexLib. Standardowo istnieje 1 moduł rozszerzający bibliotekę o nowe funkcje cieniujące oznaczony na diagramie jako „standardowy moduł funkcji cieniujących”. 2. Są to między innymi funkcje związane z podstawowymi operacjami składania kilku innych funkcji. Aplikacja ta. Kontekst cieniowania. 5. umożliwia wygodną budowę drzew cieniowania za pomocą standardowego graficznego interfejsu użytkownika. Diagramy klas Biblioteka została zaimplementowana C++ z wykorzystaniem technik obiektowych udostępnianych przez język programowani.

Diagram 5-2 Diagram klas typów wartości 52 .

Diagram 5-3 Diagram klas związanych ze wzorami 53 .

Diagram 5-4 Diagram klas funkcji zarządzających wzorami 54 .

Diagram 5-5 Diagram klas podstawowych implementacji algorytmów szumów 55 .

Powinna zaznaczyć wszystkie wartości parametrów wyjściowych jako nieaktualne (te właśnie operacje wykonuje domyślna implementacja. Point. Vector. przeciążanie nie jest więc zwykle konieczne).2.2. Tabela 5-1 zawiera opis tych funkcji.5. Wartości te są ustalane w funkcji Initialise(). która inicjalizuje wewnętrzne liczniki statystyk (dla każdej klasy pochodnej CAbstractValue są to inne parametry). jeśli zgłoszono taką potrzebę. • Zliczanie statystyk. jak nazwa. W tym celu została też wprowadzona funkcja Initialise(). Są one opisane odpowiednio przez klasy CLinkIn oraz CLinkOut. Każda wartość umie zapisać się i odczytać z podanego strumienia. Float. Sample). czy odczytywana wartość jest poprawna. wartość domyślna (tylko dla parametrów wejściowych) oraz aktualna. • Obsługa serializacji. Dzięki temu obiekty wykorzystujące wartości typów pochodnych CAbstractValue mogą stwierdzić. Po niej dziedziczą klasy wartości konkretnych typów (Int. Każda klasa pochodna od CAbstractValue przeciąża operator przypisania. w czasie zmiany kontekstu wejściowego spowodowanej rozpoczęciem obliczeń dla kolejnej próbki). których zmian nie przewiduje się w trakcie renderingu. które umożliwiają między innymi ewaluację odpowiednich parametrów. która powinna ustawić poprawne wartości parametrów 56 Invalidate(int id) Evaluate() . Opisy najważniejszych klas Poniżej znajdują się opisy najważniejszych klas przedstawionych na diagramach (…) Klasa CAbstractValue (abstrakcyjna) Klasa opisująca abstrakcyjną wartość parametrów wejściowych i wyjściowych wzorów. inicjację itd. konieczność ewaluacji wartości itp. czy też należy wymusić jej odświeżenie przez właściciela. Nazwa funkcji Initialise() Opis funkcji Inicjacja wzoru. jeśli wartość parametru o identyfikatorze id staje się nieaktualna (np. którym jest parametr wyjściowy wzoru (patrz: klasa CLinkOut). Inicjowane są także wartości parametrów wejściowych. W trakcie tego procesu wykonywane są wszystkie operacje. jeśli obiekt wartości nie ma właściciela (czyli jeśli żaden obiekt nie zmodyfikuje wylosowanej wartości) Klasa CPattern (abstrakcyjna) CPattern opisuje wzór. Ma to sens tylko wtedy. Color. Funkcja cieniująca opisana przez CPattern zawiera pewną liczbę parametrów wejściowych i wyjściowych. Najważniejsze funkcjonalności tej klasy to: • Referencja do właściciela. Każda wartość może przybierać wartości losowe. Każda funkcja cieniująca musi implementować kilka funkcji. dzięki czemu można jego implementacje wykorzystać do zliczania statystyk w czasie renderingu. Klasy te przechowują dane o parametrach takie. czyli funkcję cieniującą. Funkcja wywoływana. które nie muszą być powtarzane w trakcie renderingu. • Przechowywanie znacznika poprawności wartości. Każda wartość posiada swojego właściciela (wskaźnik m_pOwner). Funkcja. Funkcja Initialise() jest wywoływana dla każdej wartości przed rozpoczęciem renderingu (w czasie inicjalizacji drzewa cieniowania) • Tworzenie wartości losowych.

Klasa CPatternFactory (abstrakcyjna) Klasa pochodna CPatternFactory jest klasą pomocniczą dla każdej klasy pochodnej CPattern i służy tworzeniu nowych obiektów danego wzoru (patrz też: opis klasy CManager). których właścicielami (patrz: opis klasy CAbstractValue) mogą być obiekty CLinkOut. i zawsze może być tylko jeden kontekst wejściowy i wyjściowy. która powinna obliczyć parametr o identyfikatorze id.TREE). Tabela 5-1 Funkcje wirtualne klasy CPattern Obiekty klasy CPattern posiadają wskaźnik na obiekt CPatternFactory (patrz: opis klasy CPatternFactory). Najważniejsze jej funkcjonalności to: • Przechowywanie informacji o wszystkich dostępnych wzorach. 57 . różni się w ich przypadku nieco od reszty wzorów zdefiniowanych bądź to standardowo bądź przez użytkownika.wyjściowych. posiadają wskaźniki na wartości (CAbstractValue). Klasa CManager posiada tablicę obiektów klas CPatternFactory. Jeśli obiekt CLinkIn posiada wskaźnik na wartość bez właściciela. Klasa służy do zarządzania wzorami dostępnymi w bibliotece. • Ładowanie zewnętrznych bibliotek wzorów (DLL) Klasa CShadeTree Klasa opisuje drzewo cieniowania. to oznacza to wartość stałą. Klasa ta zajmuje się także serializacją drzew cieniowania (zapisywaniem i ładowaniem plików *. Może istnieć tylko jeden obiekt tej klasy. Specjalnym przypadkiem klas CPattern są klasy CInContext oraz COutContext. Klasa CManager Implementuje wzorzec Singleton [Gamma 1995]. Obiekty tych klas istnieją w drzewie cieniowania zawsze. które pozwalają na tworzenie nowych obiektów klas wzorów (funkcja New() w klasie CPatternFactory). Specjalnym przypadkiem są wzory CInContext oraz COutContext. czyli zbiór dowolnej ilości połączonych ze sobą wzorów i wartości. Połączenia między parametrami wejściowymi i wejściowymi wzorów są realizowane przez klasy CLinkIn oraz CLinkOut. ponieważ specyfika wzorów nie pozwala na obliczenie pojedynczego parametru wyjściowego. czyli konteksty wejściowy i wyjściowy. czyli obiekty klasy CLinkIn. Wzory oraz wartości stałe są przechowywane wewnątrz klasy w dwóch tablicach. bez obliczania innych. Zwykle jednak Evaluate(int id) wywołuje Evaluate(). Wykorzystano tutaj wzorzec projektowy Abstract Factory [Gamma 1995]. Przechowuje także nazwę wzoru. które opisują konteksty – odpowiednio wejściowy oraz wejściowy. Zachowanie niektórych funkcji (Evaluate. Istnieje także alternatywna postać – Evaluate(int id). Parametry wejściowe. Initialise).

1. gamma) Diagram 5-6 Faza cieniowania z uwzględnieniem biblioteki TexLib Biblioteka TexLib może być wykorzystywana w fazach obliczania przesunięcia.5. Biblioteka nie zakłada żadnej kolejności wykonywania obliczeń związanych z modyfikacją parametrów powierzchni przez system renderujący.3. załaduj drzewo cieniowania ‘tree’ używając TexLib. (…) zainicjuj bibliotekę TexLib. jakie parametry powierzchni będą przez nią modyfikowane). przesunięcia oraz przezroczystości Światła Tło i inne składowe bez modelu oświetlenia Zastosowanie modelu oświetlenia Przekształcenia dodatkowe (jasność. (…) dla każdej próbki { (…) 58 . Przygotowanie kontekstu cieniowania dla próbki Obliczenie koloru. W szczególności. normalnej do powierzchni w tym punkcie. przezroczystości oraz koloru (zależy to od tego. ustaw parametry w ‘tree’ jeśli to konieczne. Przebieg fazy cieniowania z punktu widzenia systemu renderującego z uwzględnieniem wykorzystania TexLib wygląda jak na Diagram 5-6. kolejność nie musi wyglądać jak na diagramie powyżej. zainicjuj ‘tree’. kontrast. Niewątpliwie jednak przygotowanie kontekstu wejściowego (czyli obliczenie współrzędnych cieniowanego punktu. danych związanych z filtrowaniem (antyaliasingiem) musi nastąpić dla każdego cieniowanego punktu przed rozpoczęciem korzystania z TexLib. Sposób działania systemu wykorzystującego TexLib w fazie cieniowania opisuje dokładniej pseudokod Program 5-1. Procesu renderingu z wykorzystaniem interfejsu biblioteki TexLib Ogólny schemat działania systemu renderującego został przedstawiony w punkcie 2.

Deklaracje funkcji interfejsu używają kilku specjalnych typów. ustal wartość normalnej w swoim kontekście. Inicjalizacja biblioteki. które zostały opisane w Tabela 5-2. } if (‘tree’ modyfikuje kolor) { pobierz wartość koloru z ’tree’. ustal wartość koloru w swoim kontekście. Uwaga: Zalecane jest używanie identyfikatorów liczbowych ze względu na wydajność. ładuje zewnętrzne biblioteki wzorów (znajdujące się w dynamicznie łączonych bibliotekach w odpowiednim podkatalogu). Fazy procesu renderingu w bibliotece TexLib 1. (…) ustaw kontekst cieniowania w TexLib.1.3. Inicjowane są także wszystkie statyczne tablice wartości i 59 . zaznacz wszystkie wartości parametrów wyjściowych wzorów nieaktualne. Identyfikator typu PTREE PINCX POUTCX Opis Wskaźnik na obiekt drzewa cieniowania Wskaźnik na obiekt kontekstu wejściowego Wskaźnik na obiekt kontekstu wyjściowego Identyfikator parametru wejściowego lub wyjściowego wzoru (także parametrów kontekstów). (…) jako Program 5-1 Faza cieniowania z użyciem TexLib Jak widać na powyższym pseudokodzie. Wszystkie one są inicjowane wywołaniami odpowiednich funkcji interfejsu biblioteki z poziomu systemu renderującego. proces renderingu przebiega w kilku fazach. Może być liczbą całkowitą identyfikującą jednoznacznie parametr w ramach wzoru (zwracany przez odpowiednie funkcje interfejsu) lub łańcuchem znaków z nazwą parametru. } (…) } skasuj drzewo cieniowania ‘tree’. ustal wartość przezroczystości w swoim kontekście. } if (‘tree’ modyfikuje przezroczystość) { pobierz wartość przezroczystości z ’tree’. (…) przetwarzanie dodatkowe (post-processing). Poniżej znajduje się opis wszystkich tych faz wraz z opisem odpowiednich funkcji interfejsu biblioteki. Tabela 5-2 Charakterystyczne typy interfejsu biblioteki TexLib ID 5. if (‘tree’ modyfikuje normalną) { pobierz wartość normalnej z ’tree’. TexLib przygotowuje wzory standardowe.wyznacz swój kontekst cieniowania dla próbki.

losowe tablice mieszające). 2. które zawiera tylko 2 standardowe wzory: InContext oraz OutContext. PTREE TCShadeTreeCreate(PINCX *incx. Parametr tree musi zawierać wskaźnik na wcześniej utworzone drzewo.TREE z definicją drzewa cieniowania. Nie istnieją specjalne funkcje służące inicjalizacji biblioteki. Alternatywnie. jeśli operacja wczytania powiodła się. Takie wywołanie nie zmieniłoby jednak wyglądu generowanego obrazu.TREE z którego odczytać definicję drzewa. POUTCX *outcx) Parametry incx (OUT) kontekst wejściowy nowo utworzonego drzewa cieniowania outcx (OUT) kontekst wyjściowy nowo utworzonego drzewa cieniowania Wartość zwracana Wskaźnik do nowo utworzonego drzewa cieniowania. tree (IN) Wartość zwracana true. jeśli operacja tworzenia nie powiodła się Tworzy nowe drzewo cieniowania. bool TCShadeTreeLoad(PTREE tree. Tak zbudowane drzewo może zostać zapisane do pliku *. przezroczyście dla użytkownika. Jeśli wzór został załadowany.inne zmienne.TREE i odczytanie przy następnej potrzebie. 60 . którego nazwa jest określona parametrem fileName. lub wartość PTREE_NULL.4. patrz: Dodatek B) • definicja drzewa używa nieznanych wzorów (tzn. Operacja wczytania może nie powieść się z kilku powodów: • nie istnieje plik o podanej nazwie • plik zawiera nieprawidłową definicję drzewa (jest niepoprawny syntaktycznie. false w przeciwnym wypadku. Inicjalizacja drzewa cieniowania. Przed rozpoczęciem renderingu biblioteka inicjuje wzór. Budowa drzewa cieniowania. Ścieżki względne odnoszą się do katalogu roboczego aplikacji (systemu renderującego) wykorzystującego bibliotekę. o czym była mowa w punkcie 2. drzewo jest budowane za pomocą wywołań odpowiednich funkcji interfejsu (funkcje te są opisane dokładniej w punkcie 5. char *fileName) Parametry wskaźnik na wcześniej stworzone drzewo cieniowania (za pomocą funkcji TCShadeTreeCreate) fileName (IN) nazwa pliku *. Większość systemów daje możliwość inicjacji tekstur proceduralnych wywołując przed rozpoczęciem renderingu (ale już po ustawieniu parametrów tekstury) odpowiednią procedurę. które nie ulegają zmianie w trakcie działania biblioteki (np. Procedura inicjacji drzewa cieniowania nie powinna być wywoływana dla każdej cieniowanej próbki ze względów wydajnościowych. istnieje możliwość jego modyfikacji. TexLib ładuje wskazany plik *.4). Jest to związane z wydajnością. Ta operacja jest wykonywana przy pierwszym użyciu dowolnej funkcji interfejsu która tego wymaga. to zostaną one przed operacją wczytania skasowane. wzorów dołączanych jako dodatki w formie bibliotek DLL) Ładuje drzewo z pliku. Tabela 5-3 Funkcje interfejsu biblioteki związane z tworzeniem drzew cieniowania 3. To wywołanie zostało zaznaczone w Program 5-1. Jeśli zawierało ono już jakieś wzory (zostało na przykład wcześniej wczytane za pomocą TCShadeTreeLoad).

System renderujący może w ten sposób zbadać. czy kontekst wejściowy zmienił się od czasu poprzedniego żądania obliczenia) wywołać ciąg ewaluacji wewnątrz drzewa. Łatwo się w ten sposób np. wartość różna od 0 w przeciwnym wypadku Funkcja służy do badania. 61 . drzewo zawiera cykle proste (właściwie taka sytuacja nie powinna się zdarzyć. point i area). Operacja inicjalizacji może się nie powieść z kilku powodów: • brak pamięci do inicjalizacji tablic lub stworzenia potrzebnych obiektów w jednym ze wzorów • nieprawidłowe drzewo cieniowania. Istnieją dwa tryby ewaluacji: punktowy i powierzchniowy (ang. Zastosowanie tej. Ustawienie kontekstu wymaga różnej ilości operacji. czy system chce używać antialiasingu czy nie. można znaleźć w aplikacji opisanej w rozdziale 6. ponieważ narzędzia służące do budowy drzew cieniowania – opisywane dalej – nie pozwalają nazbudowanie nieprawidłowego drzewa Funkcja inicjalizuje podane drzewo cieniowania. Określenie kontekstu cieniowania Obliczenie własności każdej próbki. zależne od tego. Ewaluacja Ewaluacja jest od strony systemu renderującego bardzo prosta i polega na pobieraniu wyjść kontekstu wyjściowego aktywnego drzewa cieniowania. Każde pobranie może (ale nie musi. jak i większości innych opisywanych tu funkcji interfejsu. jeśli inicjalizacja powidła się. System musi poinformować TexLib o rozpoczęciu obliczeń dla nowej próbki wywołaniem odpowiedniej procedury interfejsu. ID id) Parametry tree (IN) id (IN) wskaźnik na drzewo cieniowania identyfikator parametru wyjściowego kontekstu wyjściowego drzewa (definicje parametrów – patrz punkt 5. W tym czasie inicjalizowane są także wszystkie wzory i zmienne wchodzące w skład drzewa. jakie wartości tego kontekstu są przez konkretne drzewo wykorzystywane b.bool TCShadeTreeInitialise(PTREE tree) Parametry tree (IN) wskaźnik na drzewo cieniowania Wartość zwracana true. dowiedzieć. czy dane drzewo cieniowania modyfikuje podany parametr kontekstu wyjściowego. a. int TCShadeTreeOutCxModified(PTREE tree. tzn. którą dostarczy system renderujący wiąże się z kilkoma operacjami. jej normalną czy też przezroczystość. false w przeciwnym wypadku. Rendering. zależnie od tego. Po tym powinno nastąpić ustawienie kontekstu wejściowego dla aktywnego drzewa cieniowania. Tabela 5-4 Funkcje interfejsu biblioteki służące do inicjalizacji drzewa cieniowania 4. które z parametrów swojego kontekstu zmieniać na podstawie kontekstu wyjściowego drzewa cieniowania. czy dane drzewo modyfikuje kolor powierzchni. zależy to od tego.5) Wartość zwracana 0 jeśli podany parametr wyjściowy kontekstu wyjściowego nie jest modyfikowany. Zgłoszenie odpowiedniego żądania odbywa się poprzez ustawienie odpowiedniej zmiennej kontekstu wejściowego biblioteki.

podany parametr (w ten sposób możemy uzyskać pewną optymalizację ewaluacji drzewa cieniowania. ponieważ przeliczane będą tylko te parametry wyjściowe. Tabela 5-5 Funkcje interfejsu biblioteki wykorzystywane w trakcie renderingu 62 . jeśli funkcja zwraca wartość 0). ID id. ID id) Parametry tree (IN) id (IN) wskaźnik na drzewo cieniowania identyfikator parametru wyjściowego kontekstu wyjściowego drzewa (definicje parametrów – patrz punkt 5. natomiast druga tylko jeden. ID id) Parametry tree (IN) id (IN) wskaźnik na drzewo cieniowania identyfikator parametru wejściowego kontekstu wejściowego Wartość zwracana Nic Funkcja powiadamia drzewo cieniowania o deaktualizacji wartości parametru wejściowego kontekstu wejściowego. Drzewo nie przeliczy swoich parametrów wyjściowych jeśli system nie wywoła jednej z powyższych funkcji. int TCShadeTreeInCxUsed(PTREE tree. który jest używany przez dane drzewo. yyy) Parametry tree (IN) id (IN) yyy (IN) wskaźnik na drzewo cieniowania identyfikator parametru wyjściowego kontekstu wyjściowego drzewa (definicje parametrów – patrz punkt 5. Musi być wywoływana dla każdego parametru kontekstu wejściowego biblioteki. system renderujący nie musi ustawiać tej wartości kontekstu w czasie renderingu. yyy). jeśli parametr wejściowy kontekstu wejściowego podanego drzewa cieniowania jest używany przez jakiś wzór. void TCShadeTreeInCxSetxxx(PTREE tree. ID id.5) wartość parametru wyjściowego kontekstu wyjściowego Funkcja służy do pobierania obliczonych przez drzewo cieniowania wartości. wartość różna od 0 w przeciwnym wypadku Funkcja sprawdza. co może prowadzić do polepszenia wydajności.void TCShadeTreeOutCxGetxxx(PTREE tree. które zależą od tych zdeaktualizowanych za pomocą TCShadeTreeInvalidate ).5) Wartość zwracana 0.5) wartość parametru wejściowego kontekstu wejściowego Wartość zwracana Nic Funkcja ustawia wartość kontekstu wejściowego drzewa. Jeśli nie jest (tzn. Pierwsza postać funkcji dezaktualizuje wszystkie parametry wejściowe. gdzie xxx. yyy według Tabela 5-6 Parametry tree (IN) id (IN) yyy (OUT) Wartość zwracana Nic wskaźnik na drzewo cieniowania identyfikator parametru wyjściowego kontekstu wyjściowego drzewa (definicje parametrów – patrz punkt 5. czy podany parametr wejściowego kontekstu wejściowego jest używany przez jakikolwiek wzór. void TCShadeTreeInvalidateAll(PTREE tree) void TCShadeTreeInvalidate(PTREE tree.

void TCShadeTreeDestroy(PTREE tree) Parametry tree (IN) wskaźnik na drzewo cieniowania Wartość zwracana Nic Funkcja kasuje podane drzewo cieniowania. Zwolniona zostanie pamięć po wszystkich wykorzystywanych obiektach oraz odładowane zostaną biblioteki dynamiczne z dodatkowymi wzorami. Int Float Point Color Vector Sample FloatArray ColorArray Parametry funkcji zależne od przyrostka funkcje Get… int * FLOAT * FLOAT[3] FLOAT[3] FLOAT[3] TSample * int *. Jest to jedyna.Przyrostek funkcji.2): CPattern oraz CPatternFactory.. 63 . Uwaga: parametr tree musi być prawidłowym wskaźnikiem na drzewo cieniowania. Każdy nowy wzór musi być zdefiniowany według pewnych reguł i implementować ściśle określone funkcjonalności. za pomocą której możemy dowolnie rozszerzać możliwości biblioteki. Zakończenie działania biblioteki Zakończenie działania wiąże się ze skasowaniem wszystkich użytych drzew cieniowania oraz zwolnieniem wykorzystywanych obiektów pomocniczych. ale dająca duże możliwości metoda. Interfejs programistyczny-rozszerzanie biblioteki o nowe wzory Wspomniano już o tym. że TexLib wykorzystuje dodatkowe dynamicznie ładowane biblioteki z implementacją nowych wzorów. Tabela 5-7 Funkcje interfejsu biblioteki związane z kończeniem działania 5. FLOAT * int. FLOAT[3] * Tabela 5-6 Przyrostki funkcji interfejsu i odpowiadające im parametry 5. jako „fabryka” nowych obiektów wzoru. Na definicje wzoru składają się pochodne 2 klas (opisanych wcześniej w punkcie 5. FLOAT * int *. np: TCShadeTreeOutCxGet. Operacje te są wykonywane po wywołaniu odpowiednich funkcji interfejsu.. druga istnieje w celach pomocniczych pomocniczych. Przykładowa klasa CPatternFactory dla wzoru o nazwie „Checker” jest widoczna na Program 5-2. Pierwsza z nich implementuje właściwy algorytm obliczający pewne parametry wyjściowe. FLOAT[3] * funkcje Set… int FLOAT FLOAT[3] FLOAT[3] FLOAT[3] TSample int.4. void TTerminate() Parametry Nic Wartość zwracana Nic Funkcja powinna być wywołana po zakończeniu pracy z biblioteką.

Zwykle są one związane z pewnymi niestandardowymi możliwościami lub sposobami działania (np. które nie występują w innych programach. Obiekty te (ich funkcja New()) posłużą bibliotece do tworzenia obiektów wzorów. Parametry dobrano tak. Ponadto.5. które są w CPattern zadeklarowane jako abstrakcyjne. }. dokładnością obliczeń. Program 5-3 Przykładowa klasa typu CPattern Biblioteka DLL zawierająca definicje nowych wzorów musi ponadto zawierać publiczną (eksportowaną) funkcję o sygnaturze TPatternFactories *Init(). char CFactoryPattern::name[] = „Checker”. virtual char *GetName() { return name.class CFactoryChecker : public CPatternFactory { virtual CPattern *New() { return new CPatternChecker(this). nie są już niestety traktowane w ten sam sposób przez systemy do grafiki 3D i różnią się bardzo oferowanymi możliwościami. LADS). Program 5-3 zawiera przykładową deklarację CPatternFactory. }. Istnieją parametry. virtual void EvaluateArea(). 5. class CPatternChecker : public CPattern { public: CPatternChecker(CFactoryChecker *pFactory). która po zawołaniu zwróci tablicę obiektów typu CPatternFactory (dla każdego nowego typu należy stworzyć jeden obiekt CPatternFactory). RenderMan. aby udostępniały jak największy zakres działania. każdy z systemów ma swoje charakterystyczne zmienne. możliwość wykorzystania tekstury podczas renderingu radiosity w 64 . czy w końcu wydajnością. LightWave. }. ustalonym na podstawie analizy kilku kontekstów popularnych systemów do renderingu (3dsMAX. virtual void Initialise(CShadeTree *pShadeTree = NULL). virtual void Evaluate(). private : static char name[]. }. zawierającą funkcje. że każdy system działa w odmienny sposób. jednocześnie jednak biorąc pod uwagę to. a więc których pokrycie jest konieczne w klasach pochodnych. które są wykorzystywane i udostępniane w interfejsach programistycznych do tworzenia tekstur proceduralnych w prawie każdym systemie. Parametry bardziej zaawansowane. BMRT. Zawartość kontekstu cieniowania w popularnych systemach grafiki fotorealistycznej Biblioteka i jej wzory działają na pewnym standardowym kontekście cieniowania. Wartości zmiennych opisujących podobne charakterystyki cieniowanej próbki mogą się znacznie różnić między różnymi systemami [T&M 1998]. związane z antyaliasingiem wzorów. Program 5-2 Przykładowa klasa typu CPatternFactory Klasa dziedzicząca po CPattern implementuje kilka metod umożliwiających jej wykorzystanie w drzewach cieniowania.

Opisuje jak szybko zmienia się normalna. 5. która udostępnia programiście obiektowy interfejs budowy modułów rozszerzeń (między innymi funkcji cieniujących). 3dsMAX release3 Jest to system.5. wszystkie przedstawione parametry są tylko do odczytu): Nazwa Typ podstawowe ScreenUV UVW P V Normal OrigNormal Gnormal CurTime Opis punkt 2D Znormalizowane położenie piksela na ekranie punkt punkt punkt punkt punkt punkt float Współrzędne w układzie UVW Współrzędne cieniowanego punktu Wektor widoku o początku w punkcie położenia kamery i kierunku do cieniowanego punktu (znormalizowany) Normalna w kierunku obserwatora (można ją zmodyfikować za pomocą funkcji SetNormal) Oryginalna normalna do powierzchni (normalna wynikająca z geometrii. jak szybko zmienia się pozycja względem ekranu. Jej metody oraz atrybuty dają dostęp między innymi do zmiennych opisanych w Tabela 5-8 Wybrane zmienne kontekstu cieniowania systemu 3dsMAX release 3 (niektóre z nich są dostępne przez wywołanie funkcji. tym większa powierzchnia musi być próbkowana. Dla każdego systemu przedstawiono 3 kategorie zmiennych: podstawowe. Odpowiadają one przedstawionej wyżej klasyfikacji. Używana do celów antialiasingu. które popularne systemy udostępniają w swoich interfejsach do programowania tekstur proceduralnych. Mówi o tym.1. inne Curve Node obiekt Jest to wskaźnik do obiektu przechowującego informacje na 65 . Pochodne UVW dla punktu. Im większa wartość Curve. czy antialiasingu cieniowanie powinno używać metod Pochodna P względem piksela. Poniżej znajduje się zestawienie najważniejszych informacji. Zmienna jest używana głównie do antyaliasingu podczas tworzenia obliczania mapowania środowiskowego.jednym z systemów implikuje obecność w kontekście cieniowania zmiennych pozwalających na dokładną identyfikację cieniowanego wielokąta – w ten sposób można wykorzystać wcześniej obliczone oświetlenie). na którą nie ma wpływu użycie SetNormal) Normalna trójkąta) geometryczna (normalna do cieniowanego Aktualna wartość czasu (jeśli aktualnie renderowana jest animacja) antialiasing Antialias DP DUVW boolean punkt punkt float Określa. Klasa ShadeContext udostępnia kontekst cieniowania. związane z antialiasingiem oraz inne.

przezroczystość oraz współczynnik załamania (ang: index of refraction) 5. Należy zauważyć różnicę między tą zmienną a zmienną alpha. 66 .2. Dla alpha = 0 powierzchnia będzie niewidoczna. 0) powierzchnia będzie miała kolor C. Węzły posiadają swoje nazwy. posiada atrybuty opisujące kolor. Jest to wskaźnik do obiektu cieniowanej geometrii. 0. 1) może wydawać się jaśniejsza. ponieważ do koloru C dodany zostanie komponent koloru spoza płaszczyzny. klucze animacji. Jasność I próbki po uwzględnieniu alpha i T jest wyliczana z modelu (I’ oznacza jasność spoza płaszczyzny): wektor Wektor kierunku patrzenia punkt float T kolor I = alpha * C + alpha * T * I '+ (1 − alpha) I ' Zauważmy. macierze transformacji. Dla T= (1. Ng wektor Normalne: używana do cieniowania oraz geometryczna – normalna aktualnie renderowanego trójkąta.. która steruje widocznością powierzchni. 0) ) parametr T nie ma znaczenia. 0 – powierzchnia niewidoczna) Przezroczystość.5. w której materiał pozostawia wyniki obliczeń. że dla obiektu na czarnym tle ( I’=(0. Nazwa Typ podstawowe C P I E alpha Opis kolor punkt Kolor powierzchni w aktualnie cieniowanym punkcie Współrzędne w układzie obiektu aktualnie cieniowanego punktu Położenie obserwatora Współczynnik pokrycia powierzchni (1 – powierzchnia pokrywa całkowicie. LightWorks LightWorks Application Development System jest opisany w .INode temat cieniowanego ‘węzła’ sceny. Jest to filtr. Współrzędne barycentryczne cieniowanego trójkąta Współczynnik załamania światła GetEvalObject BarycentricCoords GetIOR obiekt Object punkt float Tabela 5-8 Wybrane zmienne kontekstu cieniowania systemu 3dsMAX release 3 Klasa ShadeOutput. przez który mnożony jest kolor spoza powierzchni. Udostępnia między innymi informacje przedstawione w Tabela 5-9 Wybrane zmienne kontekstu cieniowania systemu LightWorks. 0. N. Mogą być układane w hierachii.. 1. tymczasem dla T = (0.

która wielokąt umożliwia bardzo dokładny analityczny antialiasing (funkcja cieniująca powinna obliczyć kolor średni dla powierzchni ograniczonej do pixel polygon. kamery. 67 . dPdv du. v. du. itp. punkt wektor float Położenie obserwatora. dv wektor float Pochodne parametrów powierzchni – opisują jak zmienia się pozycja wraz ze zmianą parametrów powierzchni. Parametry powierzchni koordynaty tekstury. s.3. Zmiana parametrów powierzchni. Ng u. pixel polygon Tabela 5-9 Wybrane zmienne kontekstu cieniowania systemu LightWorks 5. jeśli przekształcenie kamery określona kamerę typu „pinhole”).5. Normalne: używana do cieniowania oraz geometryczna – normalna aktualnie renderowanego trójkąta. antialiasing opisanej parametrycznie oraz dPds. Ma duże możliwości właśnie dzięki interfejsowi teksturowania proceduralnego. Jest to informacja. dt. float Zmiana parametrów powierzchni LADS udostępnia wielokąt.. który ma kształt przecięcia aktualnie cieniowanej powierzchni z piramidą widzenia wychodzącą z obliczanego piksela.u. kolor Kolor oraz filtr (przez który mnożony jest kolor promienia przez powierzchnię) powierzchni. v. s. opisanej parametrycznie oraz wektor Kierunek „nadchodzącego” promienia. t L C. t float Parametry powierzchni koordynaty tekstury. dPdt. antialiasing dPdu. świata. RenderMan RenderMan to jeden z niewielu systemów implementujących standard opisu scen trójwymiarowych o nazwie RenderMan Interface. Tabela 5-10 Wybrane zmienne kontekstu cieniowania standardu opisu scen 3D RenderMan Interface Nazwa Typ podstawowe Opis P punkt Współrzędne cieniowanego punktu w lokalnym układzie współrzędnych. dv Pochodne koordynat tekstury oraz parametrów powierzchni – wektor opisują jak zmienia się pozycja wraz ze zmianą parametrów powierzchni. Odpowiednie funkcje pozwalają na przekształcenie punktu do dowolnego innego układu (np.) I E N. Jest między innymi wykorzystywany w produkcji profesjonalnych efektów specjalnych do filmów. dPdv ds. O Kierunek promienia przecinającego powierzchnię (wektor od wektor punktu położenia kamery. dPdu.

Przezroczystość powierzchni. N. Eye point) C Color T Color I E Vector Point 68 . 5. w którym można zawrzeć powierzchnię cieniowanej płaszczyzny widocznej przez aktualnie obliczany piksel obrazu. pochodne P: dPds.5. które są niezbędne do ewaluacji trójwymiarowych tekstur proceduralnych oraz kilka. Kierunek promienia przecinającego powierzchnię w cieniowanym punkcie (od ang. W takim przypadku musimy znać ten wcześniej nałożony kolor płaszczyzny. T. N. Biblioteka TexLib rozdziela te dwa rodzaje zmiennych i umieszcza je w dwóch osobnych kontekstach: wejściowym i wyjściowym. Wybrano te. Podobnie jak w przypadku koloru C. System renderujący może stosować drzewo cieniowania TexLib na przykład do modyfikacji już rzutowanej na geometrię tekstury tradycyjnej. a których obecność znacznie zwiększa potencjalne możliwości biblioteki. t. L. Kontekst w bibliotece TexLib W interfejsach tekstur proceduralnych we wszystkich opisanych systemach istnieją wartości tylko do odczytu (zwykle P. Kontekst wejściowy jest zbiorem pewnych najczęściej używanych w innych systemach zmiennych. musimy więc znać wartość ustaloną przez system. które można czytać i modyfikować jako własności powierzchni (C. Można ją zinterpretować jako przybliżenie średnicy okręgu opisanego na wielokącie pixel polygon obliczanym przez renderer LightWorks. LightWave System LightWave.inne time dtime dPdtime float float wektor Aktualny czas (jeśli renderowana jest animacja) Ilość czasu „zawarta” w aktualnie obliczanej klatce animacji.5. dPdt. które nie są dostępne we wszystkich systemach. t. Zmienna P N Typ (Tabela 4-2) Opis Point Vector Współrzędne aktualnie cieniowanego punktu w układzie lokalnym obiektu Wektor normalny do aktualnie cieniowanej płaszczyzny Kolor płaszczyzny w cieniowanym punkcie P. alpha). dPdv) i takie. Incident vector). s.4. udostępnia w swoim interfejsie wartość spotSize. s. Określa jak pozycja P zmienia się w jednostce czasu (wartość zdeterminowana przez motion blur na scenie) Tabela 5-10 Wybrane zmienne kontekstu cieniowania standardu opisu scen 3D RenderMan Interface 5. biblioteka może tylko modyfikować wcześniej ustaloną przez wykorzystujący ją system wartość. I. która jest przybliżonym promieniem okręgu. dPdu.5. Zmienne są przedstawione w Tabela 5-11. prócz standardowych wartości P. Punkt położenia obserwatora (od ang.

MinSpotSize) . dv. dPdt. dPdv ds. Zmiana parametrów powierzchni Średnica okręgu opisanego na wielokącie będącym przecięciem stożka widzenia wychodzącego z aktualnie cieniowanego piksela oraz cieniowanej płaszczyzny. Służy do renderingu animacji i jest umowną wartością zmiennoprzecinkową (tzn. jak time będzie wykorzystany zależy od systemu wykorzystującego bibliotekę) time Float Tabela 5-11 Zmienne kontekstu wejściowego biblioteki TexLib Wartości dPds. t. Wartość czasu. dPdt. dt. dv Float Vector Float Parametry powierzchni opisanej parametrycznie oraz koordynaty tekstury. dt.u. spotSize są wykorzystywane właściwie wyłącznie dla wzorów. dPdt. Ze względu na wygodę użycia zostały one zamknięte w jednej strukturze typu TSample. W przypadku systemu LADS spotSize jest przekątną prostokąta opisanego na pixel polygon. ds. dPdu. 1 sekundy.. Dla systemów liczących antialiasing analityczny jedynie za pomocą pochodnych punktu P (dPds.. gdzie ^ oznacza iloczyn wektorowy 2 wektorów spotSize Float AA Int Zmienna przełączająca użycie antialiasingu analitycznego (od ang. AA≠0 oznacza włączenie antialiasingu. Definicję tej struktury przedstawia Program 5-4. du. typedef struct { /* * analytic antialiasing toggle */ int AA. Wszystkie wzory udostępniające ten tryb zaczną go wykorzystywać. du. Analytic Antialiasing). dPds. Pochodne koordynat tekstury oraz parametrów powierzchni – opisują jak zmienia się pozycja wraz ze zmianą parametrów powierzchni. Jest to wartość podobna do tej wykorzystywanej w systemie LightWave. Wartość AA=0 oznacza wyłączenie antialiasingu. itp. ponieważ to. dPdv.) spotSize może być obliczany następująco: spotSize = max( dPdu * du ^ dPdv * dv . dPdu. /* * derivatives */ 69 . s. nie można interpretować upływu czasu od wartości time=0 do time=1 jako np. v. w których potrzebny jest antialiasing.

1. TexLib jest inicjalizowany.dll umieszczonej w podkatalogu aplikacji wykorzystującej TexLib o nazwie Patterns.6. dPdv[3]. Wzory specjalne. Podczas uruchamiania aplikacji.6. Część wzorów. /* * antialiasing filter size */ FLOAT spotSize. przezroczystości oraz normalnej do płaszczyzny. W czasie tego procesu wszystkie biblioteki DLL z podkatalogu Patterns są wczytywane do pamięci. raytracer Blue Moon Rendering Tool). dv. /* * changes in texture/parameter space */ FLOAT ds. Wzory definiowane w bibliotekach DLL TexLib wykorzystuje biblioteki DLL do rozszerzania zbioru podstawowych wzorów. Wybrane szczegóły implementacyjne 5. } TSample. du. to zmienną tą wykorzystuje się zwykle przesuwając wejściowy punkt P wzdłuż wektora normalnego N. dPdt[3]. Zmienna C N Typ (patrz Tabela 4-2) Opis Color Vector Nowy kolor płaszczyzny dla punktu P kontekstu wejściowego Zmodyfikowana normalna dla punktu P kontekstu wejściowego Zmodyfikowany punkt P kontekstu wejściowego. Program 5-4 Definicja typu struktury TSample znajdującej się w interfejsie TexLib Zawartość kontekstu wyjściowego umożliwia zmianę koloru. dt.FLOAT dPds[3]. Add. P Point T alpha Color Float Tabela 5-12 Zmienne kontekstu wyjściowego biblioteki TexLib 5. Współczynnik pokrycia powierzchni. Uwaga: Nie każdy system udostępnia możliwość modyfikacji płaszczyzny (przemieszczenia. Każda 70 . takie jak CalculateNormal. ang. dPdu[3]. Zmodyfikowana przezroczystość. Jeśli tak. Multiply itp. ale obsługuje ją niewiele systemów (jest nim np. displacement). które mogą być dystrybuowane z biblioteką jako standardowe (np. są zdefiniowane w rdzeniu biblioteki a tym samym dostępne bez dodatkowych plików DLL. NoisePerlin) są zdefiniowane w bibliotece patterns. Istnieje także możliwość przesunięcia punktu P.

biblioteka z definicjami wzorów oprócz definicji samych klas wzorów (patrz punkt 5. są ewaluowane tylko w razie potrzeby. od których dany parametr zależy.6.4) musi zawierać eksportowaną funkcję o nazwie Init i deklaracji: PATTERNS_API TPatternFactories *Init(). { TPatternFactories *pFactories.2. pFactories = new TPatternFactories(). Żaden z parametrów wzoru C nigdy nie będzie obliczony. return pFactories. że rozpoczęcie ewaluacji drzewa może być rozpoczęte tylko przez próbę odczytania przez system wykorzystujący je któregoś z parametrów wyjściowych kontekstu wyjściowego. Nie musi on bowiem uzupełniać parametrów kontekstu wejściowego. Nie będą prawidłowe (będą równe wartościom domyślnym) jeśli nie ma jawnego połączenia między nimi w drzewie cieniowania. Przeanalizujmy kolejność ewaluacji parametrów drzewa pokazanego na Diagram 5-7. pFactories->Add(new CFactoryWzor1()) //… pFactories->Add(new CFactoryWzorN()). Funkcja zwraca tablicę obiektów fabryk wzorów. Po wyliczeniu parametru P wzoru B zakończona zostanie ewaluacja parametru color wzoru A i wynik zostanie przekazany do kontekstu wyjściowego. Pobranie koloru white wiąże się z dalszym obliczeniem P wzoru D i pobraniem wcześniej przeliczonego parametru P wzoru E (parametr P wzoru E jest więc liczony tylko raz na próbkę). Ewaluacja drzewa cieniowania Wszystkie parametry wzorów. Wymusza to ewaluację parametru P wzoru E. Należy także zwrócić uwagę na to. w tym także kontekstów. Ewaluacja rozpoczyna się od parametru color wzoru A. 71 . który by zależał od któregoś z nich. } Program 5-5 Inicjacja wzorów w bibliotece DLL 5. ponieważ nie ma żadnego parametru kontekstu wyjściowego.. że parametry kontekstu wejściowego. Oczywiście nic nie stoi na przeszkodzie. po czym następuje pobranie koloru black lub white. które posiadają swoje odpowiedniki w kontekście wyjściowym nie muszą być koniecznie w kontekście wyjściowym prawidłowe. Należy zauważyć wynikające stąd możliwości optymalizacji od strony systemu wykorzystującego TexLib. których drzewo cieniowania nie używa. aby takie połączenia tworzyć w każdym budowanym drzewie cieniowania. Tablicę tworzy się w sposób podany w Program 5-5 PATTERNS_API TPatternFactories *Init(). Wynika stąd. Próba pobrania parametru wyjściowego dowolnego wzoru powoduje ciąg ewaluacji wszystkich parametrów.

których ewaluacja jest potrzebna.. że drzewa cieniowania nie mogą zawierać cykli prostych. ponieważ takie rozwiązanie jest prostsze do zaimplementowania. Domyślna implementacja tych funkcji polega na wywołaniu odpowiednio Evaluate() oraz EvaluateArea(). Każdy obiekt wykorzystujący wyjścia innych wzorów ustawia flagę m_bBeingEvaluated na początku funkcji Evaluate. Zwykle wzory wypełniają wszystkie swoje wyjścia. Zapobieganie cyklom Wspomniano już. i czyści ją po odczytaniu ostatniego potrzebnego parametru wyjściowego innego wzoru.6. co powoduje obliczenie wszystkich parametrów wyjściowych. void EvaluateArea(int ID). polega na obliczeniu we wzorze tylko tych parametrów wyjściowych.. Istnieje jednak możliwość obliczenia tylko potrzebnych wartości dzięki funkcjom w klasie CPattern o deklaracjach void Evaluate(int ID). trudna jednak do wykorzystana w praktyce. 5. Rozpoznawanie cykli odbywa się w trakcie procesu renderingu i jest oparte na flagach w obiektach klasy CPattern. nawet tych nigdy nie używanych. Jeśli na początku ewaluacji (po wejściu do 72 .Diagram 5-7 Przykład kolejności ewaluacji parametrów drzewa cieniowania Jeszcze jedna możliwość optymalizacji. które są potrzebne.3. Parametrami funkcji są identyfikatory wyjść.

Pewne szczegóły tego procesu są podane w punkcie 6. który pozwala na modyfikację dowolnych parametrów powierzchni za pomocą kilku rodzajów tzw. 5. to oznacza to.. które zawiera OutContext biblioteki TexLib. System do renderingu fotorealistycznego LightWorks LADS (LightWorks Application Development System) jest pakietem wspomagającym budowę aplikacji wykorzystujących grafikę trójwymiarową.jednej z funkcji Evaluate. Aplikacja Interfejs API Geometry Repository System Services Modul 3 LightWorks Diagram 5-8 Architektura systemu LADS Modul n 73 . 1.7. Obsługa odpowiednich funkcjonalności LADS z poziomu interfejsu Edytora. umożliwia modyfikację wszystkich parametrów. W szczególności. w których zachodzi potrzeba wykorzystania technik grafiki trójwymiarowej. Integracja systemu LADS z biblioteką TexLib. wizualizacja obrazów obliczonych przez pakiet. Rendering z wykorzystaniem renderera LADS z poziomu Edytora. Posiada rozbudowany system programowania tekstur proceduralnych. procedur cieniujących (ang: shaders). które podzielić można na dwie grupy. Architektura systemu jest przedstawiona na Diagram 5-8.1. Edytor drzew cieniowania używa tego systemu w połączeniu z biblioteką TexLib do wizualizacji drzew cieniowania.7.. ) flaga jest ustawiona.3. Dostarcza też wszystkich parametrów InContext tej biblioteki. LADS został zaprojektowany do szybkiego tworzenia aplikacji. Integracja z pakietem LADS do renderingu fotorealistycznego Integracja aplikacji Edytora z LADS posiada wiele aspektów. shaders) systemu LADS. Wiąże się ona z obsługą drzew cieniowania oraz wykorzystaniem danych dostarczanych przez kontekst wyjściowy biblioteki na poziomie procedur cieniujących (ang. 5. że drzewo cieniowania zawiera cykl. 2. Drugi aspekt integracji z pakietem LADS jest mniej ciekawy z punktu widzenia grafiki trójwymiarowej i tekstur proceduralnych.

Dla wszystkich tych rodzajów dla tego samego piksela kontekst jest taki sam. Istnieją dwa podstawowe moduły systemu wykorzystywane przez większość pozostałych.Jak widać. radiosity). Spośród wszystkich wymienionych modułów nas najbardziej interesuje moduł interfejsu tekstur proceduralnych. tga oraz bmp • Command Interpreter Module. który zajmuje się odczytywaniem scen z przykładową geometrią • moduł zajmujący się określaniem widoczności geometrii • moduł cieniowania • moduł udostępniający interfejs do tworzenia tekstur proceduralnych. które powierzchnie są w danym pikselu widoczne. Istnieje kilka rodzajów funkcji cieniujących. struktura systemu LADS opiera się na modułach. Dla każdego piksela tworzony jest następnie przez procedury modułu cieniowania odpowiedni kontekst wywołania funkcji cieniujących. Większość modułów jest zależna od innych. jednak różnią się one dostępem do globalnych zmiennych go reprezentujących. Korzystają one z modułu określania widoczności określając. W konfiguracji systemu używanej wraz z Edytorem występują dodatkowo następujące moduły: • drivery służące do wyświetlania renderowanych obrazów w okienku systemu Windows oraz umożliwiające zapis obrazów na dysk w formatach jpg. opcjonalnych modułów. które odpowiedzialne są za określenie różnych właściwości powierzchni. 74 . tif. Algorytm cieniowania jest realizowany przez procedury z modułu cieniowania. Moduł określania widoczności realizuje w ten sposób jeden z kilku wbudowanych algorytmów renderingu (scanline. alokowanie pamięci – moduł System Services) oraz przechowywaniem geometrii (moduł Geometry Repository). moduł cieniujący określanie widoczności (visibility processor) funkcja cieniująca cieniowanie (shading) funkcja cieniująca Diagram 5-9 Architektura procesu renderingu w systemie LADS Funkcje cieniujące należą właśnie do modułu teksturowania. a komunikacja aplikacji z systemem oraz modułów między sobą odbywa się za pomocą interfejsu będącego zbiorem funkcji API. Jego miejsce w procesie renderingu pokazuje Diagram 5-9. Rolę kluczowych dla naszych zastosowań rodzajów funkcji przedstawia Tabela 5-13. Są one odpowiedzialne za udostępnianie funkcjonalności związanych z konkretnym systemem operacyjnym (np. raytracing.

75 . Wynika to z tego. że proces ten może być wykonywany dla jednego piksela obrazu kilkakrotnie dla różnych powierzchni. Rendering kończy się wywołaniem dla każdego z shaderów funkcji unload. Modyfikuje normalną do powierzchni symulując w ten sposób jej nierówności. że właśnie tutaj następuje integracja funkcjonalności biblioteki TexLib z systemem do renderingu. W czasie procesu renderingu . zależnie od trybu tworzenia obrazu. Określa widoczność oraz przezroczystość płaszczyzny. aby funkcja mogła zainicjować swoje zmienne zależne tylko od parametrów.Typ funkcji cieniującej (ang. Jest ona odpowiednikiem inicjalizacji drzewa cieniowania w bibliotece TexLib. Przestrzeń tekstury Shader DISPLACEMENT Shader TRANSPARENCY Światła Shader COLOUR Model oświetlenia Postprocessing Diagram 5-10 Przebieg procesu ewaluacji własności powierzchni w systemie LADS Każdy shader posiada funkcję uniforms. które nie zmieniają się w trakcie procesu renderingu. która jest wołana przed rozpoczęciem renderingu po to. Tabela 5-13 Typy funkcji cieniujących modułu cieniowania systemu LADS Dokładny przebieg procesu określania własności powierzchni jest przedstawiony na Diagram 5-10. Nie jest to więc algorytm modułu cieniowania a jedynie jego element. Należy pamiętać o tym. Element ten jest jednak najbardziej nas interesującą częścią produkcji obrazu przez system LightWorks. shader) Opis COLOUR TRANSPARENCY DISPLACEMENT Określa kolor cieniowanej płaszczyzny. dla każdej próbki wywoływane są funkcje preview lub full shaderów.

. Wykorzystanie biblioteki TexLib w procesie cieniowania systemu LightWorks Drzewa cieniowania TexLib mogą modyfikować jedną. ponieważ DISPLACEMENT nie będzie istniał w materiale).2.h” //plik nagłówkowy interfejsu biblioteki TexLib shader DISPLACEMENT/TRANSPARENCY/COLOUR { function uniforms { if (istnieje już ‘tree’) pobierz istniejące drzewo ‘tree’ else { //wczytaj drzewo cieniowania z pliku tree = TCShadeTreeCreate(kontekst_wej. Materiał jest zbiorem shaderów. [.7. w którym momencie tworzone i niszczone jest drzewo cieniowania zależy od tego. Mogą być w nim zawarte wszystkie rodzaje funkcji (między innymi COLOUR. to drzewo musi być utworzone w shaderze DISPLACEMENT. kontekst_wyj). w procesie cieniowania LightWorks wykorzystywane są różne shadery. TRANSPARENCY i DISPLACEMENT) biorące udział w procesie cieniowania przedstawionym na Diagram 5-10.] #include „TexLib/CInterf. Są to: • shader typu COLOR. Tak więc na przykład to. Algorytm działania znajduje na Program 5-6 (program jest przykładem użycia interfejsu biblioteki TexLib). TCShadeTreeLoad(tree. W systemie LightWorks występuje pojęcie materiału. jeśli drzewo cieniowania modyfikuje parametr kontekstu wyjściowego C • shader typu TRANSPARENCY jeśli drzewo modyfikuje parametry T i/lub alpha • shader typu DISPLACEMENT jeśli drzewo modyfikuje parametr N lub P Na potrzeby Edytora zdefiniowano specjalne shadery każdego z tych 3 typów. jakie parametry są kontrolowane przez aktualne drzewo cieniowania.. } } function preview/full { if ( jest to pierwszy shader w procesie renderingu DISPLACEMENT->TRANSPARENCY->COLOUR ) { ustaw kontekst wejściowy drzewa ‘tree’ { 76 . W zależności od tego. Obsługa biblioteki TexLib jest w każdym z nich zależna od tego w jakim momencie procesu cieniowania jest on używany oraz jakie inne shadery są wykorzystywane. czy drzewo cieniowania normalną N czy też nie (jeśli tak.5. lub nie modyfikować żadnej z własności powierzchni. W zależności od tego jakie własności są rzeczywiście modyfikowane (odpowiednia funkcja interfejsu biblioteki pozwala się tego dowiedzieć). //jeśli operacja się udała – zainicjuj drzewo if (tree) TCShadeTreeInitialise(tree). nazwa_pliku). kilka. Edytor tworzy materiał zawierający odpowiednie rodzaje shaderów. inaczej dopiero w TRANSPARENCY lub COLOUR.

} break. else TCShadeTreeOutCxGetPoint(tree. } } [. } break.h" #include "texlib/cinterf.} // ustaw C.t oraz sample jeśli używane w drzewie: if (TCShadeTreeInCxUsed(tree.N. C/N/P/I/s/t/…) zaznacz_globalnie_kontekst_jako_ustawiony_dla_tej_próbki. #include "li/lishader. TRANSPARENCY oraz COLOUR używających biblioteki TexLib 5.] Program 5-6 Algorytm działania shaderów DISPLACEMENT. C).h" //nagłówek systemu LADS //nagłówek zawierajacy f-cje interfejsu TexLib //deklaracja shadera typu COLOUR colour shader "texlib sample" 77 . inX. alpha). case TRANSPARENCY: { if (TCShadeTreeOutCXModified(tree. Jedynym parametrem shadera jest nazwa pliku zawierającego definicję drzewa cieniowania. P). out_alpha. Zakładamy.. //pobierz wyniki switch (rodzaj_tego_shadera) { case DISPLACEMENT: { if (TCShadeTreeOutCxModified(tree. N).7. } function unload { //skasuj wykorzystane drzewo if (drzewo ‘tree’ nie skasowane) TCShadeTreeDeleteDestroy(tree). outT. że drzewo wykorzystuje podstawowe wartości kontekstu wejściowego oraz modyfikuję wartość C kontekstu wyjściowego. } break. Przykładowa implementacja shadera LADS wykorzystującego TexLib Program 5-7 zawiera przykładową definicję shadera typu COLOUR wykorzystującego kolor obliczony przez odpowiednie drzewo cieniowania TexLib.I. T). outP.P. } //zdeaktualizuj kontekst wejściowy drzewa TCShadeTreeInvalidateAll(tree).s.. inX) TCShadeTreeInCxSetXXX(tree. outN) TCShadeTreeOutCxGetVector(tree. outC.3. if (TCShadeTreeOutCXModified(tree. case COLOUR: { TCShadeTreeOutCxGetColor(tree. outT) TCShadeTreeOutCxGetColor(tree. out_alpha) TCShadeTreeOutCxGetColor(tree. outN.

//utworzenie nowego drzewa cieniowania tree = TCShadeTreeCreate(&incx. s ). } uniforms function //funkcja wywoływana przed każdym renderingiem { //kasujemy drzewo cieniowania. tree = NULL. PTREE tree. in_s. które pozostaną stałe //w czasie tego renderingu. t ). } //funkcja wywoływana po stworzeniu obiektu shadera load function { 78 . inI. outC. punktu. I. //zainicjowanie drzewa cieniowania TCShadeTreeInitialise(tree). wsp. in_time. t są zmiennymi globalnymi shadera i zawierają //wartości odpowiednio normalną. p_filename). TCShadeTreeInCxSetVector( tree.//deklaracja parametru shadera z nazwą pliku z drzewem cieniowania parameter "file name" LtString p_filename = "" . kierunek promienia //kolidujacego z płaszczyzną. N ). w tym przypadku wartość czasu TCShadeTreeInCxSetFloat(tree. TCShadeTreeInCxSetFloat ( tree. //wczytanie definicji drzewa z pliku o podanej nazwie TCShadeTreeLoad(tree. PINCX incx.h //zmienne N. //pobranie wartości wyjściowej drzewa – koloru powierzchni TCShadeTreeOutCxGetColor(tree. in_t. //zmienna przechowująca obiekt drzewa cieniowania //obiekt kontekstu wejściowego drzewa cieniowania //obiekt kontekstu wyjściowego drzewa cieniowania shader function //funkcja definiująca kolor powierzchni { //ustawienie parametrów kontekstu wejściowego //wartości in. &outcx). POUTCX outcx. 0). które zostało stworzone przed poprzednim //renderingiem if ( tree notequal NULL ) TCShadeTreeDestroy(tree). koordynaty tekstury TCShadeTreeInCxSetVector( tree. //kontekst został zmieniony – należy o tym poinformować bibliotekę TCShadeTreeInvalidateAll(tree). inN. P.. Co). //funkcja wywoływana podczas niszczenia obiektu //shadera w systemie LADS } unload function { } if ( tree notequal NULL ) { TCShadeTreeDestroy(tree). TCShadeTreeInCxSetFloat ( tree. I ). inP. s. TCShadeTreeInCxSetPoint ( tree. P ).. są zdefiniowanie w cinterf. //ustawnie wartości kontekstu wejściowego.

należy stworzyć jego instancję i podać nazwę pliku *.lib oraz pliki *. 79 . } Program 5-7 Przykładowa imlementacja shadera LADS wykorzystującego TexLib Kompilacja shadera wymaga użycia narzędzia dostarczanego z systemem oraz dostepności wszystkich wymaganych nagłówków (między innymi nagłówka cinterf.h zawierającego deklaracje biblioteki TexLib).tree (patrz Dodatek B) zawierającego definicję drzewa cieniowania. Po zainicjowaniu shadera w tworzonej aplikacji. Do konsolidacji niezbędny jest plik biblioteki texlib.lib systemu LADS.tree = NULL. Wykonanie renderingu po przypisaniu shadera do obiektów na scenie spowoduje wykonanie funkcji uniforms wczytującej drzewo oraz funkcji shader dla każdej cieniowanej próbki.

w dowolnej rozdzielczości. • Eksport do plików *. 3. maksymalna. Każdy z parametrów wzorów wchodzących w skład drzewa cieniowania posiada elementy interfejsu użytkownika pozwalające na jego łatwą zmianę oraz łatwo dostępny opis zastosowania.lwc. średnia. Prezentuje wizualnie strukturę tekstur proceduralnych w przejrzysty i prosty sposób.tiff (animacje mogą być eksportowane do automatycznie numerowanych plików) 80 .6. ustalenia czasu startu. • Zawsze widoczne opisy każdego z parametrów wzorów. Wizualizacja działania drzew cieniowania • Możliwość szybkiego podglądu działania drzewa. • Obsługa i wizualizacja wszystkich parametrów znajdujących się w kontekście wyjściowych TexLib. odchylenie standardowe i inne). 2. • Losowe dobieranie wybranych parametrów z pewnego ustalonego zakresu.1. końca oraz skoku między kolejnymi klatkami (obsługa wartości ‘time’ w kontekście wejściowym biblioteki).jpg. wybór koloru za pomocą standardowego okienka wyboru koloru Windows). przy użyciu kilku trybów dostępnych w systemie LightWorks oraz przy zastosowaniu dowolnej sceny zdefiniowanej w formacie *. Konstrukcja drzew cieniowania • Wizualizacja struktury drzew w postaci diagramów • Łatwe wstawianie nowych wzorów i wartości za pomocą odpowiednich okienek dialogowych. Funkcjonalność aplikacji Edytora Edytor realizuje założenie mówiące o łatwości obsługi tekstur proceduralnych. 6. • Statystyki każdego z parametrów wyjściowych (wartości minimalna. • Przeszukiwanie pewnej domeny parametrów (od pewnej ustalonej wartości do wartości końcowej. *. Poniżej znajduje się zestawienie możliwości Edytora podzielone na kilka kategorii. Edytor jest aplikacją typu MDI (MultiDocument Interface). Edycja wartości parametrów • Dobór wartości ułatwiony za pomocą GUI (np. przez co pozwala na pracę z wieloma teksturami jednocześnie umożliwiając łatwe porównywanie efektów działania kilku algorytmów.tga oraz *. • Tworzenie połączeń między parametrami wzorów i wartościami z użyciem technologii drag & drop. • Możliwość renderingu animacji o dowolnej ilości klatek. z zadaną rozdzielczością). Aplikacja okazała się w trakcie badań wspaniałym i bardzo użytecznym narzędziem do poszukiwania nowych wzorów proceduralnych. 1. Edytor drzew cieniowania Ten rozdział przedstawia system działający w oparciu o graficzny interfejs użytkownika umożliwiający prostą i szybką edycję drzew cieniowania (zwany dalej w tekście Edytorem) oraz ich rendering z wykorzystaniem systemu do renderingu LADS. Stało się tak między innymi dzięki wbudowanemu systemowi półautomatycznego doboru parametrów oraz możliwości szybkiego podglądu wyników (za naciśnięciem jednego klawisza).

Interfejs użytkownika Edytor jest aplikacją uruchamianą w systemie Windows i wykorzystuje standardowy interfejs graficzny użytkownika tego systemu. Widok właściwości wzoru. 2. Tutaj odbywa się edycja drzew cieniowania. Tutaj wyświetlane są szczegółowe informacje dla aktualnie zaznaczonego w oknie 2 wzoru. Lista w oknie Add Pattern zawiera identyfikatory wszystkich 81 . Widok edytora diagramów drzew cieniowania. Dodawanie i usuwanie wzorów i wartości Edytor udostępnia dwa sposoby dodawania nowych wzorów i wartości. Pierwszy polega na użyciu menu kontekstowego. W obydwu przypadkach wybranie Add Pattern doprowadzi nas do okna dialogowego widocznego na Rysunek 6-3. 6. Ogólny widok aplikacji jest przedstawiony na Rysunek 6-1. Standardowe menu oraz pasek narzędzi aplikacji typu Multi Document Interface. 6.2. 3.2. Istnieje oddzielne okno dla każdego otwartego dokumentu. Po kliknięciu prawym przyciskiem myszy w oknie edytora diagramu pojawi się menu jak na Rysunek 6-2. Rysunek 6-1 Widok ogólny Edytora drzew cieniowania Okno aplikacji jest podzielone na 3 części: 1. Rysunek 6-2 Menu kontekstowe dodawania wzorów i wartości Alternatywną drogą jest wybranie z menu aplikacji pozycji Add.• Eksport plików *.1.tree dla każdej renderowanej klatki animacji (ważne jeśli renderujemy ciąg klatek z losowo dobieranymi parametrami).

dostępnych wzorów – standardowo wbudowanych w bibliotekę oraz dodatkowych, zdefiniowanych w bibliotekach DLL.

Rysunek 6-3 Okienko dialogowe dodawania nowego wzoru

Wybranie jednej z pozycji i naciśnięcie OK. spowoduje umieszczenie w edytorze diagramów w miejscu kursora myszki symbolu dodanego wzoru. Wybranie opcji Add Value spowoduje ukazanie się okienka Add new value (Rysunek 6-4), gdzie z listy typu ComboBox możemy wybrać typ nowej wartości a w okienku edycyjnym Properties wpisać własności. Dla podanego na rysunku przykładu Properties powinno zawierać trzy oddzielone spacjami wartości zmiennoprzecinkowe z zakresu [0..1]. Formaty dla innych typów zawiera Tabela 6-1.

Rysunek 6-4 Okienko dialogowe dodawania nowej wartości stałej

Typ
Int Float Color Point Vector FloatArray

Format tekstowy w okienku Properties Liczba całkowita, Przykład: „-1” Liczba zmiennoprzecinkowa, Przykład: „0.5” 3 liczby zmiennoprzecinkowe oddzielone spacjami, Przykład „.2 .9 .4” Jak Color Jak Color Seria liczb zmiennoprzecinkowych poprzedzona liczbą naturalną, oddzielone jedną lub więcej spacjami. Pierwsza liczba określa rozmiar 82

tablicy, następne są jej elementami. Jeśli liczba elementów jest mniejsza od zadeklarowanego rozmiaru, to pozostałe elementy są inicjowane zerami. Przykład: ”3 .2 4.5 -2.25” – trójelementowa tablica Seria trójek liczb zmiennoprzecinkowych poprzedzona liczbą naturalną, oddzielone jedną lub więcej spacjami. Pierwsza liczba określa rozmiar tablicy, każda następująca trójka liczb określa kolejny kolor. Podobnie jak w przypadku FloatArray, elementy nie podane są inicjowane zerami (kolorem czarnym w przypadku, gdy brakuje jakiejś trójki). Przykład: ”2 0 0 0 1 1 1” – kolor czarny i biały

ColorArray

Tabela 6-1 Format tekstowy wartości typów w bibliotece TexLib

Okienko Add Value zawiera nieaktywny przycisk Properties. Aktywuje się on po otworzeniu tego samego dialogu za pomocą podwójnego kliknięcia na już stworzonej wartości. W tym przypadku umożliwia on, zależnie od typu wartości, ustawienie jej parametrów. Dla wartości typu Color przycisk Properties otwiera standardowe w Windows okno wyboru kolorów (Rysunek 6-5).

Rysunek 6-5 Właściwości wartości stałych

W przypadku innych typów (Int, Float, Point, Vector, FloatArray, ColorArray) Properties pozwala na ustawienie parametrów randomizacji. Randomizacja polega na losowym dobraniu wartości przed rozpoczęciem renderingu. Dialog Value Properties pozwlaa na ustalenie zakresu losowania oraz, w przypadku tablic, minimalnej i maksymalnej ilości elementów (Rysunek 6-6). Randomizacja jest szczególnie użyteczna podczas renderingu zestawu obrazków (animacji).

83

Rysunek 6-6 Właściwości wartości stałych związane z losowością (właściwości wartości typu FloatArray).

6.2.2. Tworzenie połączeń między wzorami
Tworzenie powiązań pomiędzy parametrami wzorów odbywa się w oknie edytora diagramów. Aby zrealizować połączenie między parametrem pewnego wzoru a wyjściem innego wzoru należy: • Kliknąć prawym przyciskiem myszy na wzorze, którego parametr wejściowy chcemy połączyć z innym. Pojawi się menu kontekstowe (Rysunek 6-7) w którym poniżej pozycji INPUTS: znajduje się lista parametrów wejściowych. Wybieramy jeden z nich. • Za wskaźnikiem myszy zacznie podążać linia o początku w symbolu wzoru. • Kliknąć lewym przyciskiem myszy na wzorze, którego parametr wyjściowy chcemy wykorzystać lub na wartości stałej. W pierwszym przypadku (Rysunek 6-8) menu kontekstowe zawierać będzie pozycję OUTPUTS: oraz następującą po niej listę parametrów wyjściowych wraz z opisem typu każdego z nich. Wybieramy jeden z parametrów, przy czym jego typ musi być taki sam jak typ parametru wejściowego wybranego w poprzednim kroku. Jeśli typy nie będą zgodne, Edytor wyświetli odpowiednią informację, a proces tworzenia połączenie nie powiedzie się.

84

że operacja powiodła się. co oznacza.Rysunek 6-7 Proces tworzenia połączenia między parametrami – wybieranie parametru wejściowego Po tych operacjach na diagramie pojawi się linia łączące wybrane wzory (lub wzór i wartość stałą). Rysunek 6-8 Proces tworzenia połączenia między parametrami – wybieranie parametru wyjściowego 85 . opisana nazwami połączonych parametrów.

”).. mówiącej o przyjmowanym zakresie parametrów. Część oznaczona jako 2 opisuje parametry wyjściowe. zależnie od parametru • powtórzonej informacji o źródle danych • wartości domyślnej („DEFAULT:. 1zaznaczeniu konkretnego parametru w okienku parametry wejściowe.6. ich znaczeniu itp. Część oznaczona jako 1 opisuje parametry wejściowe. o średnia („avg”).2... Podobnie jak wyżej. a właściwie parametrów wejściowych wzorów. które wykorzystują ten parametr) • zależnie od typu parametru. możliwych zastosowań itp. o wartość maksymalna („max”).. liczona jako wartosci avg = ∑ n n o odchylenie standardowe („stdDev”). Rysunek 6-9 przedstawia właściwości przykładowego wzoru Checker. W przypadku parametrów wyjściowych opis zawiera: • informację tekstową o parametrze – opis produkowanych wartości. wyświetlane są także statystyki z ostatniego renderingu: o wartość minimalna („min”).3. Właściwości wzorów Część okna roboczego oznaczona jako 3 na Rysunek 6-1 pokazuje wszystkie parametry wybranego wzoru oraz ich właściwości. tekst „No description”). Dla każdego parametru zaznaczony jest jego typ oraz źródło wartości: • DEFAULT: jeśli parametr używa swojej domyślnej wartości • CONSTANT: jeśli parametr używa wartości stałej (jest połączony z wartością w drzewie cieniowania) • X of NAME: jeśli używa parametru wyjściowego X wzoru o nazwie NAME Po wybraniu dowolnego parametru z listy (podświetleniu) poniżej pojawia się szczegółowy opis w postaci: • tekstowej informacji (na rysunku . zależnie od potrzeby • liczbę użytkowników tego parametru (czyli innych wzorów.. liczone jako stdDev = n∑ ( wartosci2 ) − (∑ wartosci ) 2 n(n − 1) 86 . jest tutaj lista wszystkich parametrów z podanym typem a po Rysunek 6-9 Widok właściwości wzorów. 2-parametry wyjściowe poniżej dostajemy szczegółowy opis..

jak szeroko wartości są rozproszone od wartości średniej. oraz „constant” – model. ponieważ niektóre z nich używają technik nadpróbkowania lub innych podobnych technik wygładzania tekstur (antialiasingu). zależy od rozdzielczości obrazu oraz tego. które mogą wymuszać ewaluację wzoru więcej niż jeden raz na piksel. Opcje renderingu są dostępne po wybraniu z menu Render pozycji Parameters (Rysunek 6-12). Po zaznaczeniu sceny w okienu na prawo pojawi się podgląd. Menu Scene zawiera pozycję Parameters (Rysunek 6-10). po wybraniu której ukazuje się okno z ustawieniami sceny (Rysunek 6-11). założenia. Można tutaj także wybrać scenę *. W praktyce jest przydatne do ustawiania wartości progowych wyboru koloru dla wzoru Interpolator3D. który będzie używał drzewo cieniowania aktywnego dokumentu. 6.lwc systemu LADS spełniającej opisane w punkcie . 87 . że liczba ta może się różnić (i zwykle różni się) dla różnych systemów renderujących. Dostępne są opcje „plastic” – model oświetlenia typu plastik.4.Odchylenie standardowe opisuje to. Jest to w praktyce liczba ewaluacji wzoru do którego należy parametr.2.. w którym materiał przeznaczony do użycia z drzewem cieniowania ma nałożony wzór trójwymiarowej czerwono-zielonej kratki.lwc z opisem geometrii (wszystkie sceny znajdują się w podkatalogu Scenes katalogu z którego uruchomiony został Edytor).. Rendering Edytor pozwala na rendering dowolnej sceny zapisanej w formacie *. Należy zauważyć. o ilość obliczeń parametru („sets”). w którym płaszczyzna ma kolor niezależny od oświetlenia. Rysunek 6-10 Menu parametrów sceny Rysunek 6-11 Okienko dialogowe z ustawieniami parametrów sceny Dialog ten pozwala na wybranie modelu oświetlenia dla materiału. jak wiele pikseli jest zajętych przez powierzchnię. której parametry są opisywane danych drzewem cieniowania.

który posłużył do jego generacji. Render animation przełącza tryb renderingu animacji. Obrazki są zapisywane na dysk z nazwami podanymi w oknie 88 . Okienka edycyjne Start time. jeśli ma być zapisany na dysku.TREE jest jedynym źródłem informacji na temat wartości parametrów który zostały zastosowane. Ich opis można znaleźć w punkcie.. Jest to szczególnie przydatne przy renderingu z losowymi parametrami. to odpowiedni plik *. że obraz nie zostanie zapisany. End time oraz Step określają odpowiednio czas startu. Pozostawienie okienka FileName pustego lub wpisanie tam błędnego katalogu spowoduje. Rysunek 6-13 Okienko dialogowe z parametrami renderingu Sekcja Output zawiera rozmiar obrazka (rozmiar może być dowolną liczbą naturalną nie większą niż 4096) oraz tryb renderingu.TREE . Opcja Write tree file always oznacza zapisywanie razem z obrazkiem pliku *. Sekcja Animation opisuje sposób renderowania animacji. formatu zapisu na dysk oraz animacji (Rysunek 6-13).. FULL oraz RTFULL. Jeśli renderujemy wiele obrazów. końca oraz rozdzielczość czasową renderingu kolejnych klatek. Dostępne są 3 tryby renderingu wykorzystywane przedz LightWorks: PREVIEW.Rysunek 6-12 Menu renderingu Okno dialogowe Rendering Settings zawiera szereg opcji dotyczących formatu obrazka. Czas jest podczas tworzenia kolejnych klatek animacji dostarczany do kontekstu wejściowego drzewa w parametrze time. Sekcja Output to file określa nazwę pliku oraz format obrazka.

Dla przykładu z Rysunek 6-13 powstałyby pliki test0001.. bądź Save As z menu File powoduje więc utworzenie 2 plików o tej samej nazwie. Rysunek 6-14 Wizualizacja postępu procesu renderingu Rendering rozpoczyna wybranie z menu opcji Render/Render. Zaimportowany diagram nie będzie posiadał poprawnego formatowania (tzn. 6. Widok ekrany w czasie procesu renderingu przedstawia Rysunek 6-14. Edytor umożliwia ponadto import drzew bezpośrednio z pliku TREE po wybraniu opcji File/Import from TREE. Dodatkowe informacje związane z interfejsem użytkownika oraz konfiguracją Edytora są zapisywane w plikach ST.5. shade tree) oraz TREE. ale w trakcie procesu korzysta z odpowiadającego mu TREE. Pliki te dodatkowo zawierają odwołanie do definicji drzewa cieniowania – czyli pliku TREE. Pliki typu TREE zawierają opis drzewa cieniowania i są serializowane (zapisywane i odczytywane) przez bibliotekę. w oknie Rendering settings.2.FileName z przyrostkiem będącym kolejnym numerem klatki. Wybrane szczegóły implementacyjne Poniżej opisane zostały niektóre z aspektów integracji Edytora z systemem LADS.jpg itd. Edytor odczytuje pliki typu ST.jpg. symbole wzorów nie będą poprawnie rozłożone na ekranie). 89 . Serializacja drzew cieniowania Edytor odczytuje i zapisuje pliki w formacie ST (ang. Pliki te znajdują się w tym samym katalogu i są potrzebne w trakcie odczytywania. naciśnięcie kombinacji Ctrl+R lub naciśnięcie przycisku Render. lecz 2 typach: ST i TREE. test0002. 6. Wybranie opcji Save.3.

2. Od strony systemu LADS użyty został mechanizm call-back (wykorzystywany w tym systemie nader często) – LADS woła co jakiś określony czas funkcję callback Edytora.3. Scena musi opisywać listę obiektów geometrii o ustalonej nazwie primList (od ang. Aktywacją/deaktywacją świateł na scenie steruje Edytor.2. symulujące realne warunki renderingu i używane dalej do testów wydajności biblioteki (patrz Rozdział 7). • FULL – tryb z antialiasingiem analitycznym • RTFULL – tryb. którą wybierze użytkownik. Będzie także posiadał model oświetlenia zdefiniowany przez użytkownika Edytora (patrz punkt 6. Opis scen trójwymiarowych Sceny są opisane w formacie LWC systemu LADS. Wszystkie pliki opisujące sceny muszą znajdować się w podkatalogu Scenes Edytora. Wzory TexLib nie używają antialiasingu analitycznego.1. Edytor korzysta z jednego z tych trybów zależnie od opcji. Materiał ten będzie wykorzystywał aktywne drzewo cieniowania i będzie przypisany do geometrii primList. Scena musi definiować materiał matShadeTree. Drzewo cieniowania zostanie wykorzystane do renderingu tej właśnie geometrii. Zdefiniowano kilka podstawowych scen zawierających prostą geometrię.1). System LADS udostępnia kilka trybów renderingu. Plik sceny *. 6. Rendering Rendering sceny jest wykonywany w oddzielnym wątku. w którym używany jest wbudowany raytracer. która powiadamia go w odpowiednim momencie o chęci przerwania renderingu. primitive). przez to interfejs użytkownika jest cały czas aktywny. w tym: • PREVIEW – szybki tryb renderingu scanline. bez antialiasingu. metodą antialiasngu jest tutaj nadpróbkowanie.3.6. 3. Scena musi definiować widok o nazwie camera. Podczas inicjacji są stamtąd odczytywane a ich nazwy umieszczane w odpowiednim okienku dialogowym umożliwiającym potem ich wybór. Istnieją też sceny o bardzo skomplikowanej geometrii (100 tysięcy trójkątów). Sceny wykorzystywane wraz z Edytorem muszą spełniać pewne specjalne wymagania: 1. 90 . Scena musi definiować listę świateł o ustalonej nazwie lightList. 4. Umożliwiało to dodanie opcji przerwania renderingu w jego trakcie.lwc zawiera ciąg wywołań funkcji API systemu.

7. Cel i zakres ekperymentów Celem badań eksperymentalnych była ocena możliwości oraz zaimplementowanych algorytmów w dziedzinie symulacji naturalnych powierzchni. wraz z jego schematem (uproszczonym w razie potrzeby) • nazwę pliku źródłowego z definicją drzewa cieniowania 91 . • jakość obrazu. Testy wydajnościowe zostały przeprowadzone przy użyciu kilku różnych zestawów obiektów symulujących zmienne warunki wykorzystania biblioteki. subiektywna. • porównanie ze zjawiskami występującymi w naturze. Obrazy przedstawiające stosunkowo złożone sceny posłużyły także do oceny jakości rozumianej jako ocena ilości zniekształceń wynikających z uproszczeń bądź niedokładności symulacji. zestawienie oraz analizę ich wyników. W skład zestawienia wyników wchodzą kolorowe fotorealistyczne obrazy oraz opis metody ich uzyskania i sposobów ulepszenia. podobnie jak ocena jakości obrazu.4 parametrów: • wydajność algorytmów (czasowa i pamięciowa). za pomocą którego został stworzony. Ocenę przeprowadzono na podstawie opisanych w punkcie 2. i została opracowana na podstawie doświadczeń zebranych w trakcie przeprowadzania eksperymentów. Badania eksperymentalne Ten rozdział zawiera opis zakresu przeprowadzonych eksperymentów. Przedstawione zostały także przykładowe obrazy stworzone przy użyciu opisanego w Rozdziale 6 Edytora. Symulacje zjawisk występujących w naturze W tym punkcie zebrane zostały najciekawsze wyniki eksperymentów mających na celu stworzenie jak najbardziej realnie wyglądających symulacji. 7. Wybrane obrazy posłużyły dalej do porównań z fotografiami rzeczywistych zjawisk bądź z najlepszymi ze znanych symulacji stworzonych za pomocą innych metod grafiki komputerowej.1. wydajności W ramach badań stworzonych zostało szereg drzew cieniowania symulujących przykładowe zjawiska opisane w punkcie 3. Każdy z prezentowanych wzorów posiada: • kilka obrazów przedstawiających go w praktycznym wykorzystaniu • opis dziedziny realizowanych symulacji • opis drzewa cieniowania. • łatwość użycia.1. Każde z nich zostało opisane pod kątem sposobu wykorzystania zaimplementowanych algorytmów (topologii drzew) oraz dziedziny symulowanych zjawisk.2. W ramach analizy osiągniętych rezultatów przedstawiono wyniki czasowe oraz porównanie wygenerowanych obrazów z fotografiami lub obrazami uzyskanymi innymi metodami grafiki komputerowej.7. Ocena łatwości użycia jest.

1. Skóra salamandry [SALAMANDRA. Wykorzystanie praktyczne 92 .7. Interpolate3D zwraca kolor zależny od przekazanej wartości. Ustalone zostały 4 kolory.TREE] Wzór przypominający skórę salamandry plamistej. który został przekazany funkcji Interpolate3D. Drzewo cieniowania Do utworzenia wzoru wykorzystany został iloczyn jednowymiarowych wyników funkcji NoiseWorley.2. które symulują wygląd skóry salamandry plamistej.

Ciekawostką jest to.7. Obydwa interpolatory pobierają jako parametry wyniki funkcji NoiseWorley. Cienie kaustyczne [CAUSTICS. Drzewo cieniowania Wzór powstaje z sumowania 2 warstw kolorów (funkcja Add) pochodzących z interpolatorów kolorów (Interpolator3D).TREE] Wzór symulujący cienie kaustyczne często widoczne na dnie basenu. przy czym jedna z nich jest wersją fraktalną.2.2. że wzór ten daje się łatwo animować. druga jest obliczana na podstawie pewnej kombinacji liniowej. Jedna z nich jest także obliczana na podstawie punktu P zniekształcanego wcześniej za pomocą szumu (NoisePerlin). Efekt ten uzyskuje się przesuwając punkt cieniowania z klatki na klatkę za pomocą następującej konstrukcji: 93 . Jest to zabieg często stosowany przy wzorach składanych z kilku warstw.

Wykorzystanie praktyczne 94 .Punkt P uzyskany z funkcji TransformSample można dalej przekazywać tak. jak do tej pory robiliśmy to z P pochodzącym bezpośrednio z kontekstu wejściowego. Efekt animacji jest bardzo realistyczny. Katalog Images/Water zawiera klatki takiej przykładowej animacji.

3. Drzewo cieniowania Całość symulacji zawarta jest w funkcji bazowej Leather. na podstawie którego Interpolator3D ustala kolor.TREE] Wzór symulujący kolor oraz fakturę powierzchni wyprawionej skóry zwierzęcej. Wykorzystuje ona NoiseWorley oraz NoisePerlin tworząc kilka warstw zniekształceń.2. 95 . Skóra wyprawiona [LEATHER.7. Wynik funkcji Leather jest interpretowany jako wysokość (i przekazywany do funkcji CalculateNormal) lub jako współczynnik.

Wykorzystanie praktyczne 96 .

TREE] Wzór symulujący kolor oraz fakturę skóry węża.4. Drzewo cieniowania Ten wzór składa się z 2 warstw: warstwa podstawowa. wprowadzająca szum. Jeszcze jedna funkcja NoiseWorley oraz odpowiadająca jej CalculateNormal realizuje odwzorowanie nierówności powierzchni. Pierwsza (wewnętrzna jeśli zinterpretować diagram używając zapisu matematycznego) zwracająca wartości trójwymiarowe służy wstępnemu podziałowi przestrzeni na komórki.7. których kolor jest następnie ustalany przy użyciu kolejnej funkcji NoiseWorley • warstwa dodatkowa. • 97 .2. Skóra węża [SNAKE. który podnosi realizm obrazu Punkt P jest przed przekazaniem do jakichkolwiek innych funkcji zniekształcany w funkcji TransformSample. która wykorzystuje złożenie funkcji NoiseWorley.

Wykorzystanie praktyczne 98 .

2.5. 99 . Drzewo cieniowania Działanie tego drzewa cieniowania jest zbliżone do drzewa symulującego skórę salamandry.7.TREE] Wzór symulujący fakturę spękanej ziemi na dnie wyschniętego jeziora. Spękana ziemia [SOIL2.

6. Dodatkowo dodano odwzorowanie nierówności powierzchni. które dobrze widoczne jest na poniższej ilustracji: 100 .Giger’a – autora między innymi scenografii do filmów serii Obcy. Twórczość H.TREE] Wzór przypominający fragmenty obrazów H.Giger’a [GIGER. Drzewo cieniowania Wzór jest tworzony za pomocą 2 fraktalnych jednowymiarowych funkcji NoiseWorley. których wyniki są mnożone.Wykorzystanie praktyczne 7.2.R.R.

Wykorzystanie praktyczne 101 .

3. Wszystkie materiały używają standardowego modelu oświetlenia typu plastic. 256MB pamięci operacyjnej i systemem WindowsXP Professional. układających się we fragment fraktalnego tetrahedronu. że można je uznać za przypadki pesymistyczny.7. 100 tysięcy niezależnych trójkątów. stosowany jest uproszczony model oświetlenia. którego materiał wykorzystuje jedno z drzew cieniowania TexLib. • W przypadku traktowanym jako pesymistyczny. 102 . który nie bierze pod uwagę żadnych świateł znajdujących się na scenie. Dodatkowo.3. Na scenie pes. obiekt. W celu oszacowania ilości czasu przeznaczonego przez system renderujący (w tym przypadku LADS) na cieniowanie z użyciem biblioteki TexLib. • Przypadek optymistyczny to taki.lwc istnieje tylko 1 obiekt – złożona z 2 trójkątów płaszczyzna. a kierunek patrzenia jest do niej prostopadły. zajmuje 100% obrazu. zastosowano 3 sceny oraz 3 różne drzewa cieniowania. Ocena efektywności 7. W ten sposób płaszczyzna wypełnia całą powierzchnię obrazu. optymistyczny i pośredni ze względu na rolę obliczeń przeprowadzanych wewnątrz TexLib.1. kiedy stosunkowo mało obliczeń jest przeprowadzanych w bibliotece. Punkt obserwatora znajduje się nad nią. Konfiguracja scen została dobrana tak. 30 trójkątach tworzących na środku sceny niewielkich rozmiarów sferę i pojawia się na 7% pikseli wynikowego obrazu.lwc zawiera stosunkowo złożoną geometrię zawierającą ok. Scena opt. Materiał wykorzystujący badane drzewa cieniowania jest wykorzystywany tylko na ok. Warunki eksperymentu Eksperymenty wydajnościowe zostały przeprowadzone przy użyciu komputera z procesorem Intel Pentium III Celeron 800MHz.

Większość z systemów renderujących będzie się posługiwała oddzielną funkcją cieniującą (shaderem) dla modyfikacji każdego z atrybutów kontekstu wyjściowego.2.tree – j. złożony z najbardziej wymagających algorytmów fraktalnych wersji NoiseWorley – FractalNoiseWorley. Koszt ewaluacji tego drzewa jest równy kosztowi zainicjowania oraz każdorazowej inicjacji kontekstu wejściowego dla wszystkich obliczanych próbek.3. Kolejne pomiary dotyczą 6 różnych drzew cieniowania: • empty. Scena mid2. powinna brać pod uwagę to. Ilość oraz rodzaj funkcji bazowych umieszczonych w drzewie cieniowania jest najważniejszym czynnikiem decydującym o prędkości uzyskania wyników dla większości scen. do którego odnoszą się dalsze pomiary. • Ilość modyfikowanych atrybutów kontekstu wyjściowego. a obiekt wykorzystujący w materiale TexLib zajmuje 10% obrazu wynikowego. Dla każdej ze scen został zmierzony czas renderingu bez wykorzystania TexLib.lwc jest sceną podobną do mid. która używa TexLib.3. jakie atrybuty kontekstu wejściowego są wykorzystywane w drzewie i przekazywać bibliotece tylko te potrzebne.tree – najbardziej skomplikowany wzór. Tutaj większość czasu procesora przypadająca na obliczenia cieniowania będzie przeznaczona na ewaluację 6 funkcji bazowych. Przy scenach zawierających skomplikowaną geometrię największa ilość obliczeń jest przeznaczana na przekształcenia geometryczne. T kontekstu wejściowego do kontekstu wyjściowego.tree – wzór kopiujący wartości C. Implementacja shadera konkretnego systemu renderującego.tree. Może to wnieść dodatkowy koszt to procesu generacji. 103 .tree – bardziej złożony wzór złożony z 4 funkcji bazowych (w tym 2 stosunkowo wolne NoiseWorley) oraz 6 połączeń między nimi. Dalsza analiza tego wpływu znajduje się w punkcie 7. • Złożoność drzewa cieniowania. Ewaluacja niektórych z tych atrybutów (których drzewo cieniowania i tak nie używa) może bowiem zająć niepotrzebnie czas. Czynniki wpływające na czas generowania obrazu Czynnikami mającymi największy wpływ na czas generacji obrazu są: • System renderujący. Z oczywistych względów ma on duże znaczenie na generację obrazu. normalną oraz przezroczystość powierzchni. • salamandra2. • checker. • salamandra. że wzór modyfikuje kolor. Nie wykonuje żadnych dodatkowych obliczeń. Wzór modyfikuje tylko kolor powierzchni. że wzór modyfikuje zarówno kolor jak i normalną do powierzchni.3. • Używane wartości kontekstu wejściowego. który można uznać za pośredni. Znajduje się na niej umiarkowana ilość geometrii. Jednak nawet dla scen z prostą geometrią wpływ prędkości systemu renderującego ma istotne znaczenie. N.lwc. Modyfikuje kolor powierzchni 7. z tą różnicą. Różni się od niej tym. Największą ilość czasu zajmuje w tym przypadku komunikacja między biblioteką TexLib a systemem renderującym.• • Scena mid..w.tree – jak salamandra.lwc reprezentuje przypadek. z tą różnicą. że 52% pikseli wynikowego obrazu zawiera obiekt z materiałem wykorzystującym badane drzewo cieniowania. • complex.tree – prosty wzór trójwymiarowej kratki. Cieniowanie w takim przypadku może być sprawą drugorzędną. • salamandra3. jako czas bazowy.

przy użyciu trybu renderingu PREVIEW systemu LADS (brak nadpróbkowania oraz antialiasingu geometrycznego wygładzającego artefakty na brzegach geometrii).394 111.440 31.763 1.561 29.659 237.846 235.731 24.277 24.787 120.188 0.153 7.176 7.732 24.922 2.510 6.238 24.366 17.623 1.622 1.lwc (przypadek pesymistyczny) *) Wszystkie czasy zostały zmierzone przy użyciu wbudowanego zegara aplikacji Edytora drzew cieniowania.196 6.927 25.740 24. 104 . Uwzględniono wszystkie kombinacje scen i wzorów opisanych w punkcie 7.630 6.587 109.074 1.000 0.732 1.040 120.950 31.180 24.205 14.888 5.541 15.500 6.xls Tabela 7-1 Wyniki pomiarów czasów renderingu Czas renderingu pokazany w Tabela 7-1 w kolumnie T jest sumarycznym czasem trwania wszystkich operacji potoku renderingu.600 1.463 10.300 11.lwc (przypadek pośredni) mid2.742 3.852 14.000 0. scena nazwa wzoru none empty checker salamandra salamandra2 salamandra3 complex none empty checker salamandra salamandra2 salamandra3 complex none empty checker salamandra salamandra2 salamandra3 complex none empty checker salamandra salamandra2 salamandra3 complex pomiary czasu* [s] 6.589 238.029 3.384 1.993 3.883 2.801 1.860 111.430 111.437 5.335 0.762 3.162 234.414 118.952 0.174 1.154 238.733 64.944 65.383 7.960 11.135 1.660 25.906 59.283 111.115 31.480 1.804 17.3.578 109.588 25.818 opt.183 7.176 25.863 1.612 66.879 2.033 235.296 24.912 1.134 1.466 111.443 Teval [s] 0.233 234.289 6.W kolejnym punkcie znajduje się bardziej szczegółowa analiza wszystkich czynników mających wpływ na prędkość generacji obrazów.3.453 24.255 111. Rezultaty liczbowe Tabela 7-1 zawiera wyniki pomiarów czasów renderingu dla różnych konfiguracji scen oraz drzew cieniowania.659 17.714 22.540 235.963 3.3.330 65.200 120.457 111.863 2.626 1.193 7.895 58.540 1.144 0. Tabele i wykresy pochodzą ze skoroszytu w formacie MS Excel znajdującego się w pliku Images\pomiary.732 24.200 średni czas T [s] 6.440 24.993 22.711 1.743 3.133 120.000 0.130 3.189 6.109 6.892 2.852 1.787 235.561 69.733 24.893 2.lwc pes.632 1.899 59.255 31. 7.922 0.895 60.547 111. Obrazy wyrenderowane zostały w rozdzielczości 800x600.123 2.392 19.990 11.081 18.629 6.739 1.722 1.lwc (przypadek optymistyczny) mid.749 3.297 24.273 58.150 1.148 1.083 11.807 17.794 13.1.350 7.000 0.533 15.976 236.

151s. dla badanych obrazów w rozdzielczości 800x600 wartość ta jest równa48e4. wpływ ilości pikseli cieniowanych za pomocą TexLib na całkowity czas ewaluacji drzewa cieniowania będzie liniowy.) Niewiele większy wpływ niż Tinit ma na całkowity czas ewaluacji drzewa cieniowania także czas Tctx. gdzie: Tinit – czas inicjacji drzewa oraz poszczególnych funkcji bazowych. obliczamy jako różnicę całkowitego czasu T i czasu renderingu sceny bez użycia TexLib (z wzorem oznaczonym w tabeli jako none). posiadający najprostszy model oświetlenia (kolor stały). Potwierdza to Wykres 7-1. 105 . Tak obliczony czas jest umieszczony w kolumnie Teval. co jest wartością stosunkowo niewielką (równą 3. gdzie pokazano czasy dla 3 wzorów o różnym stopniu skomplikowania (najprostszy – checker. Tpatterns – czas ewaluacji wszystkich funkcji w drzewie dla pojedynczej próbki samples – liczba próbek. Tctx – czas przygotowywania kontekstu kontekstu wejściowego dla drzewa oraz wszystkich innych operacji związanych z komunikacją między biblioteką a systemem renderującym (poinformowanie biblioteki o zmianie kontekstu. że Tinit jest relatywnie mały (bliski 0) dla wszystkich wzorów i może być pominięty jako czynnik wpływający na czas Teval. Czas renderingu w oczywisty sposób bardzo mocno zależy od wykorzystanych w drzewie funkcji bazowych. czyli czas. to każdy z nich wykorzystywał to samo drzewo cieniowania. Jak się można spodziewać. Teval jest z kolei następującą sumą czasów: Teval = Tinit + samples * (Tctx + T patterns ) .Najbardziej interesujący nas czas. gdzie T init ≈ 0 Średnia jego wartość dla 4 użytych w testach scen wynosi: 0. przekazanie wyników obliczeń). Jeśli na scenie znajdował się więcej niż obiekt.151/48e4) i na potrzeby dalszej analizy pomijalną. który system przeznacza na ewaluację drzewa cieniowania TexLib. Czas Teval dla wszystkich scen w wierszu empty jest następującą sumą (nie występuje tu czas związany z obliczeniami funkcji bazowych): Teval = Tinit + samples * Tctx . (Należy zaznaczyć.15e-7s dla jednej próbki – 0. który wykorzystuje TexLib. W mocy tego założenia czas każdego renderingu zawiera czas inicjacji pojedynczego drzewa cieniowana. że w każdym renderingu istniało i było ewaluowane tylko jedno drzewo cieniowania. Zamiast materiału. jeśli analizujemy wielkości czasów związane z inicjacją drzewa cieniowania i poszczególnych funkcji wchodzących w jego skład. Ta uwaga jest istotna. Badania wykazały. Widać to już na krzywych z Wykres 7-1. jest w takim przypadku wykorzystywany substytut. najbardziej złożony – complex).

Wykres 7-2 przedstawia przyrosty czasu generacji obrazu w zależności od tego. której działanie opiera się na kilkukrotnej ewaluacji funkcji wysokości.8s) 29. czas renderingu może znacznie wzrosnąć.381 modyfikacja przezroczystości (T) modyfikacja normalnej N modyfikacja koloru (C) 5.071 0.081 opt. W przypadku odwzorowania nierówności powierzchni (modyfikacji normalnej N) używamy jednak w większości przypadków funkcji bazowej CalculateNormal.587 mid2. Został on stworzony na podstawie czasów Teval dla scen salamandra.lwc (T=19.lwc (T=110s) 58. jak wcześniej opisano. czas renderingu zależy w niewielkim stopniu od tego.993 mid.746 13. Kolejne przyrosty uzyskano z różnic czasów generacji tych 3 scen (sceny te. salamandra2 oraz salamandra3.162 pes.lwc (T=22.lwc (T=235s) 1.021 1.991 175.871 sceny (w nawiasie podano czasy ewaluacji drzewa cieniowania Teval) Wykres 7-2 Procentowy przyrost czasu generacji obrazu po wprowadzeniu zmian kolejnych parametrów kontekstu wyjściowego 106 .721 79.5s) 5. jakie parametry kontekstu wyjściowego są modyfikowane.311 16. W zależności od stopnia złożoności tej funkcji. jakie wartości kontekstu wyjściowego modyfikujemy. różnią się tylko ilością modyfikowanych parametrów wyjściowych) 100% 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 1.czas ewaluacji drzewa cieniowania Teval [s] 120 100 80 60 40 20 0 0 20 40 60 80 100 % pikseli cieniowanych za pomocą TexLib na obrazie checker salamandra complex Wykres 7-1 Czas ewaluacji drzewa cieniowania w zależności od pokrycia obrazu pikselami cieniowanymi za pomocą TexLib Generalnie.

lwc (T=17.739 opt.porównania W tym punkcie porównano fotorealistyczne obrazy uzyskane dzięki TexLib z innymi – naturalnymi lub wygenerowanymi innymi metodami grafiki komputerowej.lwc.626 pes. Oto jak przedstawia się procentowy udział czasu spędzonego na ewaluacji drzew cieniowania w tych 3 różnych przypadkach (Do stworzenia wykresu użyto danych zmierzonych przy wykorzystaniu wzoru complex).922 118. pesymistyczny i pośredni. Świadczy o tym większy procentowy udział czasu w scenach generowanych najszybciej (opt. geometryczne+ cieniowanie 6.4.8s) 1. mid. jeśli chodzi o znaczenie obliczeń wykonywanych wewnątrz biblioteki. 7. modyfikacja normalnej ma znaczny wpływ na szybkość generacji obrazu.879 mid2.1s) mid. 1s) wartość dla wszystkich przypadków. a więc jest zależny od konkretnego systemu.Jak widać.335 64.lwc (T=66. 100% 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 10. 107 .952 13.lwc (T=15s) 1.196 1. Ocena jakości . które można przyjąć za przypadki optymistyczny.lwc) oraz jego stała (ok. W testach wykorzystano sceny. Wpływ dodania modyfikacji parametrów alpha bądź T jest natomiast niezależny od stopnia skomplikowania sceny i jest związany raczej z czasem inicjacji dodatkowego shadera. sięgającą nawet 98%.818 cieniowanie TexLib obl. Zestawienia przykładowych obrazów zawarte są w Tabela 7-2.4s) sceny Wykres 7-3 Stosunek czasów cieniowania wykonywanego przy użyciu TexLib do czasów innych operacji przeprowadzanych w systemie do renderigu Cieniowanie z każdym z przypadków zajmuje znaczną ilość czasu.lwc (T=120.

Fotografia lub obraz wygenerowany innymi metodami grafiki komputerowej Obraz wygenerowany przy pomocy TexLib skóra węża Obraz wygenerowany w tym przypadku posiada nieco różniący się od przykładowego wzór. jednak ogólne wrażenie jest bardzo dobre. płaszczyzną. tekstura ta byłaby użyta prawdopodobnie na obiekcie nie będącym. stąd łatwo odróżnić obraz sztuczny od naturalnego. tapicerka samochodu. Symulacja wygląda jednak bardzo naturalnie. Istnieją tutaj także dosyć znaczne różnice w kolorystyce. Brak jej w tej prostej scenie naszej symulacji. torba itp. której kilkadziesiąt wygenerowanych klatek można znaleźć w katalogu Water. ponieważ w praktyce. Mała wielkość detali nie pozwala na powyższych obrazach tego docenić. co jest jeszcze bardziej podkreślone w animacji. skóra wyprawiona Ta symulacja jest jedną z najbardziej realistycznych. co dodaje obrazowi pewnej głębi. a po nałożeniu tekstury na modele skórzanych przedmiotów (np. Kształt cętek uległby wtedy zniekształceniu zmniejszając efekt sztuczności. Zdjęcie po lewej stronie nie przedstawia płaszczyzny. 108 .) efekt może być trudny do odróżnienia od zdjęcia. Nie jest to jednak duży mankament. jak tutaj. cienie kaustyczne Cienie kaustyczne na powyższym zdjęciu są widziane pod pewnym kątem.

Obydwie przyczyny występowania artefaktów mogą być rozwiązane za pomocą algorytmów antialiasingu. Jeśli traktować wartości stałe w drzewie cieniowania jako odpowiedniki parametrów w systemach do generacji tekstur.3. 109 . jako że wiele naturalnych powierzchni ma charakter komórkowy. Nic nie stoi na przeszkodzie.wyschnięta ziemia Kolejny przykład dobrej symulacji naturalnego zjawiska. Na obrazach występują artefakty wynikające bądź z występowania w obrazie wysokich częstotliwości (efekty aliasingu). w punkcie 3. Można jednak powiedzieć. że można uzyskać stosunkowo prostymi drzewami cieniowania zaskakująco dobre efekty. przebarwienia). Są przypadki. które tutaj nie zostały zaimplementowane. Podsumowanie Ocena łatwości generowania nowych tekstur jest trudna do przeprowadzenia ze względu na brak danych zebranych od większej liczby użytkowników systemu. Można zauważyć. aby symulację wzbogacić o dodatkowe elementy oparte na szumie czy kolejnych warstwach „pęknięć”. a produkcja takich właśnie jest z użyciem TexLib najprostsza. Tabela 7-2 Porównanie tekstur uzyskanych dzięki TexLib z naturalnymi zjawiskami 7. kiedy jakość obrazu uzyskiwana dzięki TexLib odbiega od ideału. których funkcjonalność jest ograniczona skończonym zbiorem algorytmów i ich parametrów. Drzewa cieniowania nie mają bowiem ograniczenia stopnia skomplikowania. Porównanie z naturalnymi zdjęciami zamieszczonymi powyżej pokazuje. że wygenerowany obraz posiada nieco mniej szczegółów niż zdjęcie (drobne nierówności ziemi. W tym przykładzie chodziło o pokazanie ogólnej faktury ziemi bez zbytniego rozbudowywania topologii drzewa cieniowania. Mocną stroną opracowanych technik jest realizm produkowanych symulacji. Dziedzina możliwych symulacji jest ponadto bardzo duża. bądź nieprzewidzianych efektów składania funkcji bazowych. to w stworzonym systemie nie istnieje ograniczenie liczby parametrów. że stosunek możliwości do stopnia skomplikowania procesu tworzenia symulacji zjawisk rzeczywistych jest bardzo wysoki i znacznie przewyższa znane systemy opisywane np.5.

co w pewnych przypadkach jest jedyną możliwością integracji (przykładem może być RenderMan.8. Sprowadza się to do mniej lub bardziej sprawnego nadpróbkowania. a podnosi za to wymagania wydajnościowe. że. Jednym z ciekawszych jest rozbudowa Edytora o możliwości budowy drzew cieniowania za pomocą programowania genetycznego. a osiągnąwszy biegłość i wystarczające zrozumienie efektów ich składania. bądź właśnie LADS). które będzie zawierało elementy obydwu drzew źródłowych. statystyki wartości parametrów wyjściowych oraz wiele innych udogodnień sprawia. który udostępnia interfejs teksturowania proceduralnego w postaci pewnego „języka cieniowania” (który w szczególnych przypadkach jest zwykłym C bądź C++). Jest wręcz przeciwnie – nowe tekstury powstają z łatwością. Opracowana biblioteka funkcji bazowych TexLib. natomiast genem możemy nazwać składową funkcję cieniującą. który odrzucałby 110 . TexLib została zaimplementowana w C++. Zadanie to ułatwi system rozszerzeń oparty na bibliotekach DLL. opracowano jednak interfejs języka C. będzie nowe drzewo. Student może ławo przeprowadzać doświadczenia na predefiniowanych funkcjach bazowych. intuicyjny interfejs użytkownika. chromosomem będzie pojedyncze drzewo cieniowania. i mogą być projektowane nawet przez tych. Traktując zbiór drzew cieniowania jako populację. zgodnie z założeniami. Możliwość szybkiego wprowadzania i podglądu zmian w opracowywanym wzorze. Jest to jednak tylko przykładowa integracja. ponieważ umożliwia uniknięcie nieporozumień i przypadków nieumiejętnego użycia parametrów. czyli artystów. Mutacja natomiast stworzy nowe drzewo cieniowania zastępując pewną liczbę składowych funkcji innymi. stosowanie raz zaimplementowanych rozwiązań wielokrotnie (w postaci funkcji bazowych lub wcześniej zaprojektowanych fragmentów drzew cieniowania). Edytor drzew cieniowania został zintegrowany z bardzo dobrym pakietem do grafiki fotorealistycznej – LADS. a przecież proces ich tworzenia od pomysłu do gotowego obrazu trwał krótko w porównaniu w tradycyjnym podejściem do implementacji tekstur proceduralnych. każdy krok ewolucji populacji kończyłby się prezentacją wyników użytkownikowi. zdaje się dewaluować to twierdzenie. w połączeniu z aplikacją wykorzystującą graficzny. biblioteka TexLib może być użyta z każdym systemem. Wynikiem działania operatora krzyżowania 2 chromosomów będących drzewami cieniowania. Otwartą sprawą pozostaje antialiasing funkcji bazowych. Tworzenie tekstur przez osoby bezpośrednio zainteresowane ich wykorzystaniem jest bardzo dobrym rozwiązaniem. co wymusza stosowanie metod antialiasingu dostarczanych przez systemy do renderingu. może pokusić się o implementacje własnych. że tworzenie nowych wzorów nie jest przy użyciu TexLib żmudnym zajęciem dla wtajemniczonych. które nie zawsze przynosi bardzo dobre efekty. Etap algorytmu genetycznego realizujący ewolucję. Tekstury wykorzystane w Rozdziale 7 dają w większości przypadków zdecydowanie więcej niż zadowalające efekty. Istnieje jeszcze wiele sposobów rozbudowy stworzonego systemu. Ponieważ trudno wyobrazić sobie funkcję oceniającą każdego z osobników populacji (czyli obraz generowany przez dane drzewo cieniowania). jako. W istniejącej wersji żadna z funkcji bazowych nie realizuje antialiasingu analitycznego. będzie używał podstawowych operatorów genetycznych: mutacji i krzyżowania. Uzyskano tym sposobem także świetne narzędzie do twórczej nauki o teksturach proceduralnych. Podsumowanie Tekstury proceduralne uchodzą za niepraktyczne ze względu na koszt ich uzyskania. Implementacja dobrej tekstury może trwać długo w stosunku do uzyskania zdjęcia danej powierzchni. którzy będą ich potem bezpośrednio używać.

co prawda. Jest to możliwe. Za pomocą odpowiedniego systemu bylibyśmy zdolni do wyświetlenia obrazu ze zmienionymi atrybutami powierzchni z pominięciem systemu renderującego i całego standardowego potoku renderingu. do której należy. Wiadomo o kilku podobnych podejściach do generacji tekstur. jednak polega on zawsze na regeneracji całego obrazu. na szybki podgląd zmian. Edycja drzew cieniowania stałaby się wtedy jeszcze wygodniejsza. Kolejną możliwością rozbudowy. jest udostępnienie podglądu zmian drzewa cieniowania w Edytorze w czasie rzeczywistym. usprawniającą proces tworzenia tekstur. oraz modelu oświetlenia. jednak we wszystkich nie używano tak funkcjonalnie rozbudowanych drzew cieniowania. o ile w czasie pierwszej generacji obrazu dla nowych parametrów obserwacji sceny zapamiętamy dla każdego piksela informacje o płaszczyźnie. ponieważ regeneracja obrazu byłaby dla części scen oraz części parametrów danego drzewa o wiele szybsza (w niektórych przypadkach w czasie rzeczywistym). Istniejące rozwiązanie pozwala.niepotrzebne osobniki. 111 .

Crystal Shapes and Phase Equilibria: A Common Mathematical Basis. Wprowadzenie do grafiki komputerowej. http://pruffle. http://obelia. Distance and Similarity Measures.mit. Miyata.ifor.lcs. Helm. A. Addison-Wesley.mmu.html. Worley. October 2000 [Miyata 1990] K. Fukuda. Reimers. K. Ebert. 1998 [Pixar] Pixar. Design Patterns: Elements of Reusable Object-Oriented Software. D. Marzec 1995 [Fielding] Alan Fielding. University of Maryland Baltimore County.S. 2002 112 . Springer-Verlag. Hall.. A Cellular Texture Basis function. W.2. Department of Computer Science University of British Columbia [Kukla] J. Aspects of visualization. http://graphics. http://www. Foley. Warszawa 1995 [Watt 2000] Alan Watt. SIGGRAPH 2000: Advanced RenderMan 2 [Fukuda 2000] K.edu/~mcm/6.csee. Peachey. The RenderMan Interface 3. Ten More Unsolved Problems in Computer Graphics. R. Frequently Asked Questions in Polyhedral Computation. The Digital Ceraunoscope.C. Harlow 2000 [Egerton 1999] Patricia A. Turk. Wydawnictwo Naukowo-Techniczne.html [Walter 1992] M. Generation Textures on Arbitrary Surfaces Using Reaction–Diffusion. A procedural approach. http://www. M.math. LIBTEX – A Software Toolkit for Texture Synthesis in Computer – Generated Images. 3D Computer Graphics.html [Blinn 9/1998] Jim Blinn. S. R. Egerton and W. pp.uk/multivar/dist.mit.Carter. Vlissides.ch/~fukuda/polyfaq/polyfaq. Reading Mass. Johnson.edu/~legakis/gallery_cellular.838j/talk.W. IEEE Computer Graphics and applications. Instituto de Informatica. Academic Press Professional. Swiss Federal Institute of Technology. Walter. Cellular Textures. Musgrave. IEEE Computer Graphics and applications 9/10 1998 [Glassner 3/2000] Andrew Glassner. Computer Graphics (SIGGRAPH ’91 Proceedings). J. 1992 [Walter 1998] M. A Method of Generating Stone Wall Patterns.html.Cahn.ethz.9. Fournier. M. SIGGRAPH '90 Conference Proceedings. Bedwell. Kukla. Prentice Hall. Addison-Wesley. Perlin.edu/~ccarter/hub_paper/section3_3.htm.387-394. Walter. Gamma. [Turk 1991] G. Computer Graphics: Mathematical First Steps.aca. July 2000 [Foley] J. 3/4 2000 [Cahn] J. State of Art In Computer Graphics. . 25(4):289-298. http://graphics. 1995 [T&M 1998] D.edu/~ebedwe/skin/img/ [Legakis] Justin Legakis. Clonal Mosaic Model for the Synthesis of Mammalian Coat Patterns. New York 1994 [Apodaca] Tony Apodaca.mit. Department of Computer Science and Electrical Engineering. K. How PhotoRealistic RenderMan Works.jde. 1990. A procedural texture for epidermal tissue. Porto Alegre – Brasil.umbc. E. Literatura [Gamma 1995] E. July 1991 [Worley] Steven Worley. London 1999 [Rogers] David F. Department of Mathematics. Rogers.. J.lcs. Texturing and Modeling. D. F.ac.

zawiera np. Dla użytkownika funkcja bazowa jest funkcją posiadającą pewne wejścia i wyjścia.1. fotorealistycznych obrazów używanych w filmie.1. Od tradycyjnych tekstur będących najczęściej dwuwymiarowymi zdjęciami lub innymi obrazami. Ich generacja polega na obliczeniu pewnych właściwości powierzchni (wynikających z modelu powierzchni) na podstawie kontekstu cieniowania (czyli informacji o aktualnie cieniowanej próbce obrazu: współrzędnych punktu w jednym z układów współrzędnych tekstury bądź przestrzeni). Propozycja ćwiczenia laboratoryjnego A. Biblioteka do tworzenia drzew cieniowania Biblioteka zawiera zbiór tzw. dziedziczą po abstrakcyjnej klasie wartości CAbstractValue). W ćwiczeniu wykorzystana zostanie rozszerzalna biblioteka funkcji cieniujących TexLib oraz aplikacja – edytor służący do definiowania drzew cieniowania złożonych z funkcji cieniujących zdefiniowanych w bibliotece. informacje potrzebne do implementacji antialiasingu analitycznego Tabela 9-1 Typy danych interfejsu wzorów. zależnie od definicji FLOAT w pliku types. Tabela 1 zawiera klasy definiujące dostępne typy danych oraz ich opis (wszystkie klasy CValue. reklamie wizualizacji architektonicznej itd. odróżniają je między innymi: • niezależność od docelowej rozdzielczości – większość procedur potrafi wygenerować dowolną ilość detali zależnie od odległości obserwatora od obserwowanej powierzchni • możliwość generacji tekstur wielowymiarowych (dwuwymiarowych. Funkcja ustalająca te wartości to właśnie tekstura proceduralna.1..1. przestrzennych bądź przestrzennych animacji.Dodatek A. 113 .tekstury proceduralne Tekstury proceduralne to dzisiaj podstawa generacji profesjonalnych. A. Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z pojęciem tekstur proceduralnych. Edytor został zintegrowany z system do generowaniu grafiki fotorealistycznej LightWorks Application Development System. Instrukcja dla studentów A. funkcji bazowych. klasa (przedrostek CValue*) opis Int Float Point Vector Color ArrayFloat ArrayColor Sample int float lub double. dzięki czemu możliwy jest rendering obrazów bezpośrednio z poziomu aplikacji.2. podstawowymi technikami ich generacji oraz zaprojektowanie i zaimplementowanie własnych algorytmów produkujących wysokiej jakości fotorealistyczne obrazy. Każde wejście i wyjście ma określony typ.1. Wprowadzenie .h tablica float[3] lub double[3] tablica float[3] lub double[3] tablica float[3] lub double[3] tablica float[] lub double[] tablica float[3][] lub double[3][] struktura opisująca aktualną próbkę.3. czyli tekstur czterowymiarowych) • stosunkowo mały rozmiar definicji (w porównaniu z wysokiej jakości zdjęciami) • parametryczny interfejs umożliwiający generację wielu różnych obrazów za pomocą jednej procedury A.

Opis funkcji klasy CPattern zawiera Tabela 9-2. która jest stała i której zmiana jest niedostępna dla użytkownika • wartości dostarczonej przez użytkownika (która pozostaje stała przez cały czas renderingu) • wyjścia innego wzoru. /*. virtual ~CPattern().Każde z wejść funkcji bazowej może pobierać dane z 3 źródeł: • swojej domyślnej wartości. CAbstractValue *GetInputValidValue(UINT in). //pobieranie aktualnych wartości parametrów wejściowych/wyjściowych CAbstractValue *GetInputBoundValue(UINT in). którego typ jest kompatybilny (w praktyce oznacza to identyczny typ) Przykładowy diagram funkcji bazowych (pochodzący z edytora drzew cieniowania. //ewaluacja virtual void Evaluate() = 0. virtual void Initialise() = 0... class CPattern { public: CPattern(CPatternFactory *pFactory). Strzałki symbolizują połączenie parametrów wyjściowych z wejściowymi. Wartości w owalach to zdefiniowane przez użytkownika stałe. opisywanego dalej) jest zamieszczony na Rysunek 9-1. przy czym biegną one od parametru wyjściowego do wejściowego.*/ 114 . CAbstractValue *GetOutputValue(UINT out). Rysunek 9-1 Przykładowy diagram funkcji bazowych Widzimy na nim 6 funkcji bazowych oznaczonych prostokątami. Funkcje bazowe są zdefiniowane jako klasy dziedziczące po klasie CPattern (której deklarację przedstawia Program 9-1).

int type. }.*/ private: //fabryka obiektów podawana jako parametr konstruktora klasy CPatternFactory *m_pFactory. Jest używana w funkcji Evaluate do ustawiania wartości parametrów wyjściowych. CAbstractValue *value). której zadaniem w pochodnej klasie jest inicjacja wzoru. który jest aktualnie wykorzystywany przez parametr wejściowy o podanym identyfikatorze in. wywołanie GetInputValidValue dla funkcji Checker z parametrem okreslającym identyfikator wejścia white spowoduje ewaluację funkcji Interpolator3D. że będą niezmienne. co do których zakładamy.. Jest to „fabryka funkcji cieniujących”. jednak zasadą jest. używany potem w 115 . UINT AddOutput(String name. że inicjowane są tutaj wszystkie wartości niezmienne dla danych parametrów wejściowych. GetInputValidValue Funkcja zwraca wskaźnik na obiekt aktualnej wartości. dlatego inicjowane powinny być tylko te zmienne. GetOutputValue Funkcja zwraca wskaźnik na obiekt odpowiedniej wartości wyjściowej. Dla przykładu. która z kolei wymusi ewaluację Leather oraz InContext. Przykład definicji znajduje się w projekcie sample_src/sample_ptn Initialise Funkcja abstrakcyjna. Evaluate Funkcja abstrakcyjna obliczająca dla danych parametrów wyjściowych oraz zmiennych zainicjowanych w funkcji Initialise wartości parametrów wyjściowych.protected: //funckje dodające nowe parametry wejściowe/wyjściowe //name – nazwa parametru //type – jeden z predefiniowanych typów parametrów //value – oznacza wartość domyślną UINT AddInput(String name.. której identyfikator jest podawany jako parametr. GetInputBoundValue Funkcja zwraca wskaźnik na obiekt wartości. int type). że część parametrów wejściowych danej funkcji bazowej może ulegać zmianie w trakcie procesu renderingu. Informację o takim założeniu należy umieścić w dokumentacji funkcji cieniującej. Należy zwrócić uwagę na to. AddInput Funkcja służy do dodawania nowych parametrów wejściowych i powinna być używana tylko w konstruktorze. W razie potrzeby wartość ta jest ewaluowana. Wartością zwracaną jest identyfikator. które zależą od parametrów wejściowych. której odpowiednia metoda zwraca nowe obiekty CPattern. Wykonywane operacje zależą od konkretnej implementacji. Program 9-1 Skrócona definicja klasy CPattern nazwa funkcji (prototypy znajdują się w Program 9-1) opis konstruktor Parametrem kontruktora jest obiekt klasy dziedziczącej po CPatternFactory. /*.

Są to..) Opis Point Vector Color Color Vector Point Float Vector Float Współrzędne aktualnie cieniowanego punktu w układzie lokalnym obiektu Wektor normalny do aktualnie cieniowanej płaszczyzny Kolor płaszczyzny w cieniowanym punkcie P. gdzie ^ oznacza iloczyn wektorowy 2 wektorów Zmienna przełączająca użycie antialiasingu analitycznego (od ang. widoczne na Rysunek 9-1. używany potem w wywołaniach GetOutpuValue. dPdt. du. Może to być (zależnie od systemu renderujacego) w przybliżeniu wartość: spotSize = max( dPdu * du ^ dPdv * dv .. s. Kierunek promienia przecinającego powierzchnię w cieniowanym punkcie (od ang. Przezroczystość powierzchni.* Istnieją dwie specjalne klasy funkcji bazowych określające kontekst cieniowania i służące do komunikacji biblioteki TexLib z wykorzystującym je systemem do renderingu. Funkcja służy do dodawania nowych prametrów wyjściowych i powinna być używana tylko w kontruktorze. dt. dv Typ (CValue. Wartością zwracaną jest identyfikator. MinSpotSize) . Tabela 9-2 Opis metod klasy CPattern Przykład definicji wzoru Checker. Eye point) Parametry powierzchni opisanej parametrycznie oraz koordynaty tekstury. 116 spotSize Float AA Int .AddOutput wywołaniach GetInput. Pochodne koordynat tekstury oraz parametrów powierzchni – opisują jak zmienia się pozycja wraz ze zmianą parametrów powierzchni. Zawiera on następujące parametry: Zmienna P N C T I E u.. v. na którym można oprzeć własne implementacje funkcji bazowych. Incident vector). Analytic Antialiasing). Zmiana parametrów powierzchni Średnica okręgu opisanego na wielokącie będącym przecięciem stożka widzenia wychodzącego z aktualnie cieniowanego piksela oraz cieniowanej płaszczyzny. Wartość AA=0 oznacza wyłączenie antialiasingu. znajduje się w plikach sample_src/sample_ptn/sample_ptn. dPdv ds. Funkcja InContext określa dla każdej ewaluacji drzewa (każdej próbki) kontekst wejściowy. dPdu. AA≠0 oznacza włączenie antialiasingu. InContext oraz OutContext. Punkt położenia obserwatora (od ang. t dPds.

Tworzenie nowej klasy definiującej funkcję bazową odbywa się w następujący sposób: 1. po umieszczeniu w podkatalogu Patterns. nie można interpretować upływu czasu od wartości time=0 do time=1 jako np. Definicja parametrów nowej funkcji cieniującej za pomocą wywołań AddInput/Output w konstruktorze nowej klasy. Służy do renderingu animacji i jest umowną wartością zmiennoprzecinkową (tzn. są ładowane automatycznie przez TexLib. który można wykorzystać do stworzenia własnej biblioteki funkcji cieniujących. Współczynnik pokrycia powierzchni. Uwaga: Nie każdy system udostępnia możliwość modyfikacji płaszczyzny (przemieszczenia. Implementacja funkcji Initialise oraz Evaluate nowej klasy typu CPattern. Rejestracja pozwoli na wykorzystanie nowego wzoru m. Jeśli tak. 3. 4.cpp). ang. P Point T alpha Color Float Interfejs do tworzenia funkcji bazowych Wzory definiowane są w bibliotekach DLL.0. jak time będzie wykorzystany zależy od systemu wykorzystującego bibliotekę) time Float Funkcja OutContext określa kontekst wyjściowy. Utworzenie klasy pochodnej CPattern oraz odpowiadającej jej klasy CPatternFactory. displacement). Katalog sample_src/sample_ptn/ zawiera przykładowy projekt Visual C++6. w aplikacji Edytora drzew cieniowania. Nową klasę funkcji cieniujących należy zarejestrować w bibliotece za pomocą wywołania metody Add w funkcji Init biblioteki DLL (patrz plik sample_ptn. 1 sekundy.in. to zmienną tą wykorzystuje się zwykle przesuwając wejściowy punkt P wzdłuż wektora normalnego N. Wartość czasu. ponieważ to. Zmodyfikowana przezroczystość. Drzewo cieniowania może za jego pomocą modyfikować kilka atrybutów powierzchni: Zmienna C N Typ (patrz Tabela 4-2) Opis Color Vector Nowy kolor płaszczyzny dla punktu P kontekstu wejściowego Zmodyfikowana normalna dla punktu P kontekstu wejściowego Zmodyfikowany punkt P kontekstu wejściowego.lib zawierający implementację biblioteki TexLib. Pliki nagłówkowe oraz niezbędny do konsolidacji bibliotek DLL plik texlib.Wszystkie wzory udostępniające ten tryb zaczną go wykorzystywać. znaleźć można w katalogu TexLib. 2. 117 . które.

float k3) • klasa CNoisePerlin – obliczająca wartości szumu Perlina (metodą gradientową) ([T&M 1998]).lwc) o jakość uzyskiwanych obrazów (poprzez porównanie z podobnymi efektami realizowanymi za pomocą innych metod grafiki fotorealistycznej lub zdjęciami) o jakość parametryzacji. float x0. mid. czyli jej intuicyjność oraz wpływ parametrów na uzyskiwane rezultaty • przygotować sprawozdanie według zamieszczonego niżej opisu Zadania wymienione dalej są uszeregowane według rosnącego stopnia trudności. Edytor drzew cieniowania Edytor drzew cieniowania służy do szybkiej edycji drzew cieniowania. Dokumentacja narzędzi znajduje się w powyższym pliku nagłówkowym.1. mid2. float x0.1.pdf.lwc oraz pes. 118 . ich zapisywania i odczytywnia. Wszystkie narzędzia można wykorzystywać przy implementacji własnych funkcji cieniujących po włączeniu nagłówka utils. float k0. float x1) o float SPLINE(float x. które będzie symulowało wygląd kamienia naturalnego. A. diagramu Voronoi ([Worley]). • klasa CNoiseWorley – realizująca podział przestrzeni wg.4. wymagane przy konkretnym zadaniu • zaimplementować odpowiednie metody klas nowych funkcji • stworzyć bibliotekę DLL i umieścić ją w podkatalogu Patterns katalogu Edytora drzew cieniowania • przeprowadzić eksperymenty mające na celu ocenę jakości oraz wydajności implementacji: o wydajność stworzonych algorytmów dla scen testowych (sceny opt. float k1. float k2. Każde z poniższych zadań należy wykonać według następującego algorytmu: • utworzyć nową funkcję (lub kilka funkcji) bazową zgodnie z opisem w punkcie A. wykorzystując przykładowy projekt • użyć nowej funkcji w drzewie cieniowania modyfikującym odpowiednie atrybuty powierzchniowe.lwc.Predefiniowane narzędzia definicji tekstur Biblioteka zawiera zbiór klas będących narzędziami do tworzenia tekstur proceduralnych.3 „Interfejs do tworzenia funkcji bazowych”. float b) o float SMOOTHSTEP(float x) o float LERP(float t. A.5. Zadanie 1 Zaprojektować drzewo cieniowania z użyciem predefiniowanych funkcji bazowych.lwc.h.1. Obsługa Edytora jest opisana w oddzielnym dokumencie Edytor. float x1) oraz float SMOOTHSTEP_INTERP(float t. float a. Są to między innymi: • podstawowe funkcje często używane w definicji tekstur proceduralnych: o float FLOOR(float x) oraz float CEIL(float x) o float CLAMP(float x. • klasa CNoiseFractal – obliczająca fraktalne wersje powyższych funkcji ([T&M 1998]). Zadania Zadanie polega na stworzeniu biblioteki DLL rozszerzającej zbiór funkcji bazowych biblioteki TexLib oraz przeprowadzenia eksperymentów.

Rysunek 9-2 Przykładowy diagram drzewa cieniowania 119 . Wygenerować klatki animacji chmur za pomocą funkcjonalności Edytora drzew cieniowania.t jak i lokalnej R3 obiektu. Funkcja powinna umożliwiać generację kilku rodzajów ciekawych. top. abstrakcyjnych lub naturalnych wzorów. która przy wykorzystaniu odpowiedniej sceny (np. płaskie tekstury. formujących się chmur. Powinna więc działać w przestrzeni określonej przez s. Drzewo ma wykorzystywać parametr time kontekstu wejściowego do generacji animacji przepływających. Dodatkowym wymaganiem jest możliwość generacji wzorów okresowych (zapętlających się).lwc) może posłużyć do generacji obrazów możliwych do wykorzystania jako tradycyjne.t. Zadanie 3 Zdefiniować funkcję cieniującą. dzięki którym gotową teksturę będzie można używać z odwzorowaniem zapętlającym do teksturowania nieskończenie dużych powierzchni. Funkcja powinna być możliwa do użycia w drzewie cieniowania o topologii przedstawionej na diagramie na Rysunek 9-2.Zadanie 2 Zbudować drzewo cieniowania generujące obraz chmur typu cumulus. Zadanie 4 Zdefiniować funkcję bazową modyfikującą kolor oraz realizującą odwzorowanie nierówności powierzchni symulującą wygląd kory drzewa. Może być zdefiniowana zarówno w przestrzeni s.

dzięki której będzie można uzyskać efekt przezroczystych baniek (jak na Rysunek 9-4).1.Zadanie 5 Zdefiniować funkcję bazową modyfikującą kolor oraz realizującą odwzorowanie nierówności powierzchni symulującą wygląd łuski ryby. Rozkład baniek w przestrzeni przypomina diagram Voronoi. „The Digital Ceraunoscope: Synthetic Thunder and Lightning”. Funkcja powinna działać w układzie współrzędnych R3 świata. Należy zasymulować prosty model oświetlenia. prosty model oświetlenia można zastąpić fizycznie poprawnym. Zadanie 6 Zdefiniować funkcję bazową realizującą prosty Rysunek 9-3 Rybia łuska rendering „wolumetryczny”. Zadanie 7 Zdefiniować funkcję bazową. Funkcja powinna działać w lokalnym układzie współrzędnych R3 obiektu.6. nr 9-10/2000 Wskazówka: funkcja powinna śledzić dla każdej próbki promień o kierunku I pobranym z kontekstu wejściowego. „Soap Bubbles”. A. nr 3-4/2000 Wskazówka: funkcja musi wykorzystywać kierunek promienia I i odpowiednio modyfikować atrybut alpha oraz C. IEEE Computer Graphics and applications. IEEE Computer Graphics and applications. Funkcja powinna być możliwa do użycia w drzewie cieniowania o topologii przedstawionej na diagramie z Rysunek 9-2 i powinna wykorzystywać lokalny układ współrzędnych R3 obiektu. Analiza zjawiska wyładowań atmosferycznych znajduje się w artykule: Andrew Glassner. Dodatkowo. Sprawozdanie Rysunek 9-4 Piana na powierzchni piwa Do zadania powinno powstać sprawozdanie zawierające między innymi: • opis użytych algorytmów • opis sposobu przeprowadzania eksperymentów i ich cele • wyniki eksperymentów w postaci: o zestawienia czasów renderingu dla różnych scen oraz ustawień parametrów wejściowych o prezentacji obrazów przedstawiających zastosowanie stworzonych funkcji w praktyce 120 . wizualizującą efekty wyładowań atmosferycznych. który jest opisany między innymi w artykule: Andrew Glassner.

html [Pixar] Pixar. których studenci powinni używać do testów swoich rozwiązań. Perlin. Prentice Hall. SIGGRAPH 2000: Advanced RenderMan 2 A. Hall. a student mógł skupić się dalej na implementacji właściwych algorytmów. A. S. zakładając jedną godzinę zajęć laboratoryjnych tygodniowo. Aspects of visualization. wraz z plikami potrzebnymi do kompilacji i konsolidacji – plikiem texlib. Texturing and Modeling.2. Ebert. Egerton and W.838j/talk.. A procedural approach. Literatura [Egerton 1999] Patricia A. Worley. Realizacja ćwiczenia przez studenta nie powinna zająć w czasie trwania semestru więcej niż 3-4 tygodnie. F.0 umożliwiający stworzenie biblioteki DLL rozszerzającej TexLib. Addison-Wesley. 1h. London 1999 [Rogers] David F. State of Art In Computer Graphics. How PhotoRealistic RenderMan Works. Musgrave. 3D Computer Graphics. aby wstępna implementacja oraz konfiguracja projektu zajęła ok. July 2000 [Apodaca 2000] Tony Apodaca. http://graphics. The RenderMan Interface 3. intuicyjność ich użycia i wpływu na efekty) jakość sprawozdania Ocena efektów wizualnych to nie tylko subiektywna ocena walorów plastycznych wykonana przez prowadzącego.mit. New York 1994 [Watt 2000] Alan Watt.2. Zalecenia dla prowadzącego to: Wszystkie dane niezbędne do przeprowadzenia ćwiczenia znajdują się w katalogu Lab. Computer Graphics: Mathematical First Steps.1. Rogers. Pomóc ma w tym przykładowy projekt.S. Springer-Verlag.7. • • • • Ocena Ocenie powinny podlegać następujące właściwości prac: efekty wizualne. Harlow 2000 [T&M 1998] D.edu/~mcm/6. Są • • • • • Przykładowy projekt Visual C++ 6. 1998 [Worley] Steven Worley. trafność i skuteczność zastosowanych sposobów generacji tekstury wydajność zastosowanych algorytmów łatwość obsługi zdefiniowanych wzorów (dobór parametrów. Ujednolicenie scen pomoże dodatkowo w porównywaniu wyników osiąganych przez różne osoby (podkatalog Scenes). K. Peachey.2.A.lcs. Program dobrano tak. który można znaleźć w katalogu sample_src. A Cellular Texture Basis function. jakie 121 . D. Aplikacja Edytora drzew cieniowania wraz z dokumentem opisującym sposób jej obsługi (podkatalog Editor) Przykładowe drzewa cieniowania (podkatalog Editor\Trees) Dokument zawierający instrukcję dla studentów wraz z przykładowymi zadaniami.1. Academic Press Professional.lib oraz koniecznymi plikami nagłówkowymi (podkatalog Project) Sceny. K. Tutaj przyjrzeć się należy realizmowi stworzonych wzorów (porównania z przykładami wziętymi z natury) oraz możliwościom tworzenia różnych wariantów wzoru.

3. jakie pełnią i ich wpływ na działnie algorymtu. ich nazwy oraz funkcje. prostotę i skuteczność. Łatwo w ten sposób kontrolować stopień trudności zadań: od tworzenia ładnie wyglądających obrazów z użyciem predefiniowanych funkcji bazowych (ułatwia to studentom zrozumienie zasad tworzenia tekstur. str 209). Mogą także nie wymagać implementacji. co sugerują nazwy i zdrowy rozsądek. 122 .daje przyjęte rozwiązanie. Generalnie. Bardziej szczegółowy opis scen można znaleźć w punkcie 7. Przykłady takich scen można znaleźć w katalogu Scenes.2. Możliwe modyfikacje ćwiczenia Prowadzący ma duże możliwości modyfikacji ćwiczenia. A. hipertekstur) ([T&M 1998]. Są one zalecane do eksperymentów także w instrukcji dla studentów. Wydajność najlepiej sprawdzać stosując standardowe sceny z przypisanymi do pewnych elementów geometrii teksturami.1. którą można wykorzystać do porównania czasów osiąganych przez algorytmy. różnic między teksturami powierzchniowymi i przestrzennymi) przez definicję nieskomplikowanych tekstur modyfikujących kolor. po implementację rendererów wolumetrycznych czy rendererów obiektów opisanych za pomocą funkcji gęstości (tzw. Powinny działać zgodnie z tym. Bardzo ważnym elementem oceny jest łatwość i intuicyjność obsługi zdefiniowanej funkcji. parametry powinny być zrozumiałe dla kogoś. Przykłady wszystkich z tych rodzajów zadań zostały umieszczone w instrukcji dla studentów.2. Algorytm powinien być oceniany za swoją oryginalność. Zadania studentów mogą polegać na symulacji bardzo różnych powierzchni i zjawisk naturalnych. a jedynie zaznajomienia się z pojęciem tekstur proceduralnych i zaprojektowania pewnych drzew cieniowania z użyciem Edytora. Edytor drzew cieniowania udostępnia funkcję obliczania czasu renderingu. kto nie zna algorytmu stojącego za interfejsem. Istotna jest ilość parametrów.

Są to: • #PATTERNS – rozpoczyna definicję wzorów • #VALUES – rozpoczyna definicję wartości stałych • #BINDINGS – rozpoczyna definicję powiązań Program 2 zawiera przykładową definicję drzewa cieniowania // Drzewo cieniowania tworzące teksturę // koloru (dwukolorowej trójwymiarowej // kratki).Dodatek B.2.tree) B.0 2 COLOR 1. B. podobnie jak wzór. który może przyjąć jedną z następujących postaci: INT FLOAT POINT VECTOR COLOR ARRAY_FLOAT ARRAY_COLOR Tabela 9-3 Identyfikatory typów występujące w definicji wartości w pliku *. Każda część posiada swój nagłówek. #PATTERNS 1 InContext 2 Checker 3 OutContext #VALUES 1 COLOR 0.0 0. Definicja wartości Każda wartość.1. Indeks 1 posiada InContext – kontekst wejściowy. Definicja wzorów Każda linia oznacza instancję wzoru o podanej nazwie. definicji stałych wartości oraz definicji powiązań między wejściami i wyjściami.0 1.3.0 1.1. Zawsze występują tutaj przynajmniej 2 standardowe wzory. Druga wartość to identyfikator typu.1. Format pliku zapisu drzewa cieniowania (*.0 #BINDINGS 2 „P” 1 „P” 2 „white” –1 2 2 „black” –1 1 3 „C” 2 „C” Program 9-2 Przykładowy plik zawierający definicję drzewa cieniowania B.0 0.tree Plik definicji drzewa cieniowania składa się z 3 części: definicji wzorów.tree 123 . Format pliku *.1. posiada swój indeks. na ostatnim miejscu znajduje się OutContext – kontekst wyjściowy.

4. definicja 3 „thresholds” 2 „array_of_floats” 124 . Definicja powiązań Definicja powiązania wygląda następująco: id_pat id_in [ id_pat2 | -1] [ id_out | id_val ] id_pat id_in id_pat2 id_out id_val Przykładowo.1.B.

Sign up to vote on this title
UsefulNot useful