ˇ e vysok´e uˇcen´ı technick´e v Praze Cesk´ Fakulta elektrotechnick´a
Diplomov´a pr´ace
Efektivn´ı zobrazov´ an´ı vlas˚ u a chlup˚ u Bc. Martin Duˇsek
Vedouc´ı pr´ace: Ing. Jaroslav Kˇriv´anek, Ph.D.
Studijn´ı program: Elektrotechnika a informatika strukturovan´ y magistersk´ y Obor: Informatika a v´ ypoˇcetn´ı technika kvˇeten 2008
iv
Podˇ ekov´ an´ı Chtˇel bych podˇekovat vedouc´ımu t´eto pr´ace Ing. Jaroslavu Kˇriv´ankovi, Ph.D. za podnˇetn´e ˇ rady a pˇripom´ınky. D´ ale dˇekuji Jiˇr´ımu Stempinovi a Jiˇr´ımu Drahokoupilovi za spolupr´aci pˇri v´ yvoji osvˇetlovac´ıho modelu vlas˚ u. Dˇekuji tak´e studiu UPP (Universal Production Partners), pˇredevˇs´ım Viktoru Plchovi za cenn´e pˇripom´ınky a testov´an´ı t´eto pr´ace. V neposledn´ı ˇradˇe patˇr´ı d´ık moj´ı matce za jazykovou korekturu textu. v
vi
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem svou diplomovou pr´aci vypracoval samostatnˇe a pouˇzil jsem pouze podklady uveden´e v pˇriloˇzen´em seznamu. Z d˚ uvodu komerˇcn´ıho vyuˇzit´ı pr´ ace odp´ır´am udˇelit souhlas s uˇzit´ım tohoto ˇskoln´ıho d´ıla ve smyslu §60 Z´ akona ˇc. 121/2000 Sb., o pr´avu autorsk´em, o pr´avech souvisej´ıc´ıch s pr´avem autorsk´ ym a o zmˇenˇe nˇekter´ ych z´ akon˚ u (autorsk´ y z´akon).
ˇ em Brodˇe dne 20.5. 2008 V Cesk´
.............................................................
vii
viii
Abstract This diploma thesis deals with efficient photo-realistic hair or fur rendering for a production high-quality rendering, which is mainly used in movies. The rendering of huge number of hair is still a difficult task for computer graphics. The goal of this thesis was an implementation of a technique for accelerating hair rendering with preserved visual quality. A large part of the thesis presents also the lighting models for photo-realistic hair rendering. The implementation is for a RenderMan-compliant renderer, which is nearly always used in production environment.
Abstrakt Tato diplomov´ a pr´ ace se zab´ yv´ a efektivn´ım foto-realistick´ ym zobrazov´an´ım vlas˚ u a chlup˚ u pro produkˇcn´ı vysoce kvalitn´ı vykreslov´an´ı, kter´e se pouˇz´ıv´a zejm´ena ve filmov´em pr˚ umyslu. Zobrazov´ an´ı velk´eho mnoˇzstv´ı vlas˚ u patˇr´ı i dnes k obt´ıˇzn´ ym u ´kol˚ um poˇc´ıtaˇcov´e grafiky. C´ılem pr´ace byla implementace techniky pro zrychlen´ı vykreslov´an´ı vlas˚ u pˇri zachov´an´ı dostateˇcn´e vizu´ aln´ı kvality. Velk´ a ˇc´ ast pr´ace se tak´e vˇenuje osvˇetlovac´ım model˚ um, kter´e se obvykle pouˇz´ıvaj´ı pro foto-realistick´e zobrazov´an´ı vlas˚ u. Implementace je urˇcena pro vykreslovac´ı program standardu RenderMan, kter´ y se t´emˇeˇr v´ yluˇcnˇe pouˇz´ıv´a v produkˇcn´ım prostˇred´ı.
ix
x
Obsah Seznam obr´ azk˚ u
xiii
Seznam tabulek
xv
´ 1 Uvod
1
2 Zobrazov´ an´ı vlas˚ u 2.1 Reprezentace vlas˚ u . . . . . . . . . . . 2.1.1 V´ alce . . . . . . . . . . . . . . 2.1.2 P´ asky . . . . . . . . . . . . . . ˇ ary . . . . . . . . . . . . . . . 2.1.3 C´ 2.1.4 Textury . . . . . . . . . . . . . 2.2 Modelov´ an´ı vlas˚ u . . . . . . . . . . . . 2.3 Algoritmy pro vykreslov´ an´ı . . . . . . 2.3.1 GPU Z-buffer . . . . . . . . . . 2.3.2 Sledov´ an´ı paprsku (ray tracing) 2.3.3 Reyes . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
3 3 3 4 4 4 4 5 5 6 7
3 Osvˇ etlovac´ı modely 3.1 Model Kajiya & Kay . . . . . . . . . . . . . . . 3.1.1 Dif´ uzn´ı sloˇzka . . . . . . . . . . . . . . . 3.1.2 Zrcadlov´ a sloˇzka . . . . . . . . . . . . . 3.2 Marschner˚ uv model . . . . . . . . . . . . . . . . 3.2.1 Geometrie vlasu . . . . . . . . . . . . . 3.2.2 Funkce rozptylu . . . . . . . . . . . . . 3.2.2.1 Pod´eln´ a funkce rozptylu M . . 3.2.2.2 Azimut´ aln´ı funkce rozptylu N 3.3 Dalˇs´ı osvˇetlovac´ı modely . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
9 9 9 10 11 11 13 14 14 16
. . . . . . . . .
19 19 19 20 20 21 21 22 22 23
. . . . . . . .
25 25 26 27 28 29 29 30 30
4 Zjednoduˇ sov´ an´ı modelu vlas˚ u 4.1 Statick´e u ´rovnˇe detailu . . . . 4.2 Progresivn´ı modely . . . . . . 4.3 Textury . . . . . . . . . . . . 4.4 Stochastick´ a simplifikace . . . 4.4.1 Urˇcen´ı u ´rovnˇe detailu 4.4.2 Priorita vykreslov´ an´ı . 4.4.3 Zachov´ an´ı povrchu . . 4.4.4 Zachov´ an´ı kontrastu . 4.4.5 Plynul´ a animace . . . 5 Produkˇ cn´ı prostˇ red´ı 5.1 Autodesk Maya . . . . . . . . 5.2 Shave and a Haircut . . . . . 5.3 3Delight RenderMan . . . . . 5.3.1 St´ınovac´ı programy . . 5.3.2 Procedur´ aln´ı primitiva 5.3.3 Podm´ınˇen´e v´ yrazy . . 5.3.4 Dalˇs´ı rozˇs´ıˇren´ı . . . . 5.4 Tvorba a vykreslov´ an´ı vlas˚ u .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . . xi
. . . . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . .
6 Implementace 6.1 Sch´ema funkce . . . . . . . . . . . . . . . . . . 6.2 furSimplification – z´ asuvn´ y modul pro Mayu . 6.2.1 Struktura hlavn´ıho RIBu Shave . . . . . 6.2.2 Nastaven´ı pro st´ınov´ y pr˚ uchod . . . . . 6.2.3 Upraven´ y hlavn´ı RIB . . . . . . . . . . 6.2.4 Pˇr´ıkaz MEL pro Mayu . . . . . . . . . . 6.2.5 Uˇzivatelsk´e rozhran´ı pro Mayu . . . . . 6.3 furProc.dll – procedur´ aln´ı DSO pro RenderMan 6.3.1 Struktura DLL . . . . . . . . . . . . . . 6.3.2 Naˇcten´ı RIBu voxelu Shave . . . . . . . 6.3.3 Algoritmus stochastick´e simplifikace . . 6.3.4 V´ ystup do rendereru . . . . . . . . . . . 6.4 St´ınovac´ı programy . . . . . . . . . . . . . . . . 6.4.1 Kajiya & Kay . . . . . . . . . . . . . . . 6.4.2 Marschner . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
31 32 33 33 34 34 36 37 38 39 39 42 43 44 45 46
7 V´ ysledky 7.1 Osvˇetlovac´ı modely . . . 7.2 Simplifikace . . . . . . . 7.2.1 Animovan´ y vlk . 7.2.2 Hromadn´ a sc´ena
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
49 49 51 51 53
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
8 Z´ avˇ er
59
9 Seznam literatury
61
A Seznam pouˇ zit´ ych zkratek
63
B Uˇ zivatelsk´ a pˇ r´ıruˇ cka B.1 Instalace . . . . . . . . B.2 Nastaven´ı v Maye . . . B.3 Nastaven´ı simplifikace B.4 Log . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
C Obsah pˇ riloˇ zen´ eho CD
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
65 65 65 66 67 69
xii
Seznam obr´ azk˚ u 2.1 2.2 2.3 2.4
Typick´ a parametrizace vlasu, kter´a se pouˇz´ıv´a v poˇc´ıtaˇcov´e grafice. Srovn´ an´ı reprezentac´ı vlas˚ u. . . . . . . . . . . . . . . . . . . . . . . Mapy nepr˚ usvitnosti se vytv´aˇr´ı z pozice svˇetla. . . . . . . . . . . . Zjednoduˇsen´e sch´ema architektury reyes. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 4 6 7
3.1 3.2 3.3 3.4 3.5 3.6
Geometrie vlasu modelu Kajiya & Kay. . . . . . Dif´ uzn´ı sloˇzka pouˇzit´ a ve filmu ,,Myˇs´ak Stuart”. Zrcadlov´ a sloˇzka Kajiya & Kay. . . . . . . . . . . Sch´ematick´e zn´ azornˇen´ı vlasov´eho vl´akna. . . . . Porovn´ an´ı osvˇetlovac´ıch model˚ u s re´aln´ ymi vlasy. Souˇradn´ y syst´em vlasu je tvoˇren vektory ~u, ~v , w. ~
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
9 10 10 11 12 12
4.1 4.2 4.3 4.4 4.5
Kolaps hrany ecol a inverzn´ı operace vsplit. . . . λ jako funkce b pro r˚ uzn´e hodnoty h. . . . . . . . Pro menˇs´ı hodnoty λ je vylouˇceno v´ıce element˚ u. Pˇr´ıklad probl´emu zmˇeny kontrastu. . . . . . . . . Velikost vlas˚ u se sniˇzuje plynule. . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
19 21 22 23 23
5.1 5.2 5.3
Zjednoduˇsen´ a architektura editoru Maya. . . . . . . . . . . . . . . . . . . . . . Uk´ azka z aplikace Maya a n´astroje Shave and a Haircut. . . . . . . . . . . . . . Koule vykreslen´ a pomoc´ı 3Delight RenderMan. . . . . . . . . . . . . . . . . . .
26 26 28
6.1 6.2 6.3 6.4 6.5
Sch´ema ˇretˇezce pro zobrazov´an´ı vlas˚ u se simplifikac´ı. . . . . . . . Grafick´e rozhran´ı pro atributy uzlu DG (nastaven´ı simplifikace). Porovn´ an´ı typ˚ u kˇrivek pˇri bliˇzˇs´ım pohledu. . . . . . . . . . . . . Struktura tˇr´ıdy pro uloˇzen´ı vˇsech vlas˚ u (kˇrivek). . . . . . . . . . Pracovn´ı prostˇred´ı surface shader v RenderMan. . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
32 38 40 41 44
7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9
Porovn´ an´ı implementac´ı osvˇetlovac´ıch model˚ u. . . . . . . . . Sloˇzky Marschnerova osvˇetlovac´ıho modelu. . . . . . . . . . . Marschner˚ uv model vˇcetnˇe zadn´ıho nasv´ıcen´ı (TT sloˇzka). . . Srovn´ an´ı simplifikace v detailn´ım pohledu s referenˇcn´ı sc´enou. Graf doby vykreslov´ an´ı z´ avˇereˇcn´eho pr˚ uchodu. . . . . . . . . Vlk osvˇetlen´ y pomoc´ı modelu Kajiya & Kay. . . . . . . . . . Vlk osvˇetlen´ y pomoc´ı Marschnerova modelu. . . . . . . . . . Hromadn´ a sc´ena s vlky. . . . . . . . . . . . . . . . . . . . . . Hromadn´ a sc´ena s vlky. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
49 49 50 51 54 55 56 57 58
B.1 Uˇzivatelsk´e rozhran´ı pro nastaven´ı simplifikace. . . . . . . . . . . . . . . . . . .
66
xiii
. . . . . . . . .
. . . . . . . . .
xiv
Seznam tabulek 3.1
Pouˇzit´e symboly pˇri v´ ypoˇctu azimut´aln´ıch funkc´ı rozptylu N . . . . . . . . . . .
15
6.1 6.2 6.3
Popis parametr˚ u, kter´e je tˇreba zapsat do RIBu. . . . . . . . . . . . . . . . . . Popis parametr˚ u pˇr´ıkazu RiCurves. . . . . . . . . . . . . . . . . . . . . . . . . . Popis parametr˚ u prostˇred´ı surface shader. . . . . . . . . . . . . . . . . . . . . .
36 41 44
7.1 7.2 7.3 7.4 7.5
Porovn´ an´ı rychlosti osvˇetlovac´ıch model˚ u. Doba vykreslov´ an´ı sn´ımku 1. . . . . . . . Doba vykreslov´ an´ı sn´ımku 95. . . . . . . . Doba vykreslov´ an´ı sn´ımku 155. . . . . . . Doba vykreslov´ an´ı hromadn´e sc´eny. . . . .
. . . . .
50 52 52 52 53
B.1 Popis parametr˚ u pro nastaven´ı simplifikace. . . . . . . . . . . . . . . . . . . . . B.2 V´ yznam poloˇzek logu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66 67
xv
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
xvi
´ KAPITOLA 1. UVOD
1
´ 1 Uvod Dneˇsn´ı poˇc´ıtaˇcov´ a grafika jiˇz skoro nezn´a hranic. D˚ ukazem je hern´ı a filmov´ y pr˚ umysl. Souˇcasn´e trojrozmˇern´e hry obsahuj´ı i efekty glob´aln´ıho osvˇetlen´ı, a vypadaj´ı tak velmi realisticky. Kaˇzd´ ym rokem doch´ az´ı d´ıky rychl´emu rozvoji hardware k dalˇs´ım pokrok˚ um v zobrazov´ an´ı poˇc´ıtaˇcov´e reality. Oproti poˇc´ıtaˇcov´ ym hr´am nen´ı ve filmech nutn´e zobrazov´an´ı v re´aln´em ˇcase, ale jeden sn´ımek se vykresluje tˇreba i nˇekolik minut. Jedn´ım z pˇrevratn´ ych film˚ u vytvoˇren´ ych v poˇc´ıtaˇci je ,,Final Fantasy: Esence ˇzivota” (Final Fantasy: The Spirits Within – Square Pictures 2001). Tento film se od vˇsech ostatn´ıch odliˇsuje, je cel´ y vytvoˇren v poˇc´ıtaˇci a jde o vˇernou simulaci reality. ,,Final Fantasy” byl prvn´ı film hran´ y umˇel´ ymi herci, kteˇr´ı ale nakonec byli opravdu troˇsku umˇel´ı oproti sv´ ym ˇziv´ ym konkurent˚ um. V tomto filmu se objevuje probl´em s modelov´an´ım a zobrazov´an´ım vlas˚ u, kdy na lidsk´e hlavˇe je asi 50 000 aˇz 100 000 vlas˚ u. Takov´e mnoˇzstv´ı dok´aˇze sluˇsnˇe zamˇestnat i dneˇsn´ı generaci poˇc´ıtaˇc˚ u. Nav´ıc vlasy maj´ı velmi mal´ y pr˚ umˇer (cca 0.1 mm), coˇz m˚ uˇze pˇri vykreslov´ an´ı zp˚ usobovat neˇz´ adouc´ı aliasing. T´emˇeˇr v kaˇzd´em nov´em filmu se dnes vyuˇz´ıv´a speci´aln´ıch efekt˚ u a postprodukce. Pro vˇern´e zobrazen´ı lid´ı a zv´ıˇrat je tedy nutn´e modelovat i vlasy a chlupy v mnoˇzstv´ı, kter´e odpov´ıd´ a realitˇe. V oblasti animovan´eho filmu nejde o zcela vˇern´e zachycen´ı reality. Cel´ y film dnes ˇcasto vznik´ a v poˇc´ıtaˇci. Asi nejzn´ amˇejˇs´ı firma v t´eto oblasti se jmenuje Pixar Animation Studios. Dneˇsn´ı animovan´e filmy obsahuj´ı obrovsk´e mnoˇzstv´ı detail˚ u, pˇr´ıkladem jsou rozmanit´e scen´erie ve filmu ,,Auta” (Cars – Pixar 2006). Ve filmu ,,Ratatouille” (Pixar 2007) se nach´az´ı dokonce dynamick´e hromadn´e sc´eny pln´e animovan´ ych chlupat´ ych krys. Zde se opˇet objevuje probl´em s dlouhou dobou vykreslov´ an´ı chlup˚ u. Pr´ avˇe o tomto probl´emu je tato diplomov´a pr´ace. Aˇt uˇz se jedn´ a o animovan´ y film nebo o postprodukci, obˇe odvˇetv´ı pouˇz´ıvaj´ı stejn´e technologie (pˇredevˇs´ım standard RenderMan), a ˇreˇs´ı tedy i podobn´e probl´emy. V t´eto diplomov´e pr´ aci se budu vˇenovat realistick´emu a efektivn´ımu zobrazov´an´ı velk´eho mnoˇzstv´ı vlas˚ u a chlup˚ u s d˚ urazem na moˇzn´e pouˇzit´ı v produkˇcn´ım prostˇred´ı. Hlavn´ı n´apln´ı pr´ace je zjednoduˇsov´ an´ı modelu chlup˚ u pˇri vykreslov´an´ı. C´ılem je vytvoˇrit aplikaci, kterou bude moˇzn´e pouˇz´ıt ve st´ avaj´ıc´ım produkˇcn´ım ˇretˇezci. Zde je nutn´e respektovat omezen´ı a moˇznosti jednotliv´ ych softwar˚ u. D˚ uleˇzit´e je tak´e, aby vytvoˇren´a aplikace pˇr´ıliˇs nemˇenila zaˇzit´e postupy v produkci. atce zab´ yv´ a reprezentac´ı vlas˚ u pro vykreslov´an´ı a vysvˇetluje pˇr´ıˇciny, proˇc je Kapitola 2 se kr´ zobrazov´ an´ı tak obt´ıˇzn´e. V kapitole 3 jsou uvedeny osvˇetlovac´ı modely pouˇz´ıvan´e pro zobrazen´ı vlas˚ u. N´asleduj´ıc´ı kapitola 4 je o metod´ach zjednoduˇsov´an´ı modelu pro efektivn´ı vykreslov´ an´ı. 5. kapitola se zab´ yv´ a aplikacemi, kter´e se pouˇz´ıvaj´ı v produkˇcn´ım prostˇred´ım. Kapitola 6 se vˇenuje vlastn´ı implementaci v kontextu softwaru popsan´eho v pˇredchoz´ı ˇc´asti. Posledn´ı kapitola 7 obsahuje v´ ysledky – nˇekolik pˇr´ıklad˚ u a mˇeˇren´ı rychlosti vykreslov´an´ı vlas˚ u a chlup˚ u.
2
´ KAPITOLA 1. UVOD
´ ´I VLASU ˚ KAPITOLA 2. ZOBRAZOVAN
3
2 Zobrazov´ an´ı vlas˚ u 2.1
Reprezentace vlas˚ u
Nejprve se kr´ atce zm´ın´ım o moˇzn´ ych reprezentac´ıch vlas˚ u v poˇc´ıtaˇci. I kdyˇz pˇri pouˇzit´ı vykreslovac´ıho programu standardu RenderMan je n´am vlastn´ı implementace skryta. Budu se zab´ yvat jen reprezentacemi, kter´e se pouˇz´ıvaj´ı pro zobrazov´an´ı. Modelovac´ı f´aze vˇetˇsinou pouˇz´ıvaj´ı r˚ uzn´e hladk´e kˇrivky, kter´e se ale vˇzdy teseluj´ı na reprezentaci vhodnou pro vykreslov´an´ı. Kaˇzd´ y model vlas˚ u se skl´ ad´ a z jednotliv´ ych vlasov´ ych vl´aken, kde kaˇzd´e vl´akno je tvoˇreno segmenty. Jednotliv´e reprezentace se liˇs´ı pr´avˇe v definici vl´aken resp. segment˚ u. Na obr´azku 2.1 je uk´ azka typick´e parametrizace vlasu, kter´a se pouˇz´ıv´a v poˇc´ıtaˇcov´e grafice. Vlas je pops´ an pomoc´ı ˇr´ıd´ıc´ıch vrchol˚ u, jejichˇz ˇretˇezec tvoˇr´ı segmenty. Prvn´ı vrchol, ze kter´eho vlas vyr˚ ust´ a, se naz´ yv´ a koˇren (root), posledn´ı vrchol ˇspiˇcka (tip). Kaˇzd´ y segment je tedy ~ urˇcen dvˇema body a smˇerov´ ym vektorem T (tangentou), kter´ y m´a typicky poˇc´atek ve vrcholu, kter´ y je bl´ıˇze koˇrene. D´ ale je vlas pops´an pr˚ umˇerem vl´akna v ˇr´ıd´ıc´ıch vrcholech. Typicky jsou vlasy/chlupy ˇsirˇs´ı u koˇrene vlasu. M˚ uˇzou se hodit tak´e informace o m´ıstˇe na povrchu, ~ srf ) a souˇradnice textury (s, t), ty lze pouˇz´ıt odkud vlas vyr˚ ust´ a – norm´ alov´ y vektor povrchu (N napˇr´ıklad pro urˇcen´ı barvy vlas˚ u z textury.
Špička T Segment
Nsrf
Řídící vrchol Průměr
Kořen s, t
Obr´ azek 2.1: Typick´ a parametrizace vlasu, kter´a se pouˇz´ıv´a v poˇc´ıtaˇcov´e grafice.
2.1.1
V´ alce
Nejobecnˇejˇs´ı reprezentac´ı vlasov´ ych vl´aken jsou tzv. zobecnˇen´e v´alce (generalized cylinders), obr´azek 2.2a. Ty je moˇzn´e pˇr´ımo zobrazit napˇr´ıklad pomoc´ı metody sledov´an´ı paprsku [BK85], ˇcastˇeji se nejprve provede triangulace tˇechto v´alc˚ u [GM03].
´ ´I VLASU ˚ KAPITOLA 2. ZOBRAZOVAN
4
Z obr´azku 2.2b je vidˇet, ˇze na jedno vl´ akno je potˇreba pomˇernˇe velk´e mnoˇzstv´ı troj´ uheln´ık˚ u. Tato reprezentace se kv˚ uli sv´e n´ aroˇcnosti pˇr´ıliˇs nevyuˇz´ıv´a ani pˇri produkˇcn´ım vykreslov´an´ı. Vlasy jsou ˇcasto zobrazeny z pomˇernˇe velk´e d´alky, takˇze je nen´ı nutn´e modelovat jako v´alce. 2.1.2
P´ asky
P´asky (ribbons) jsou polygony, kter´e se ot´aˇc´ı do smˇeru pohledu (velmi podobn´e v poˇc´ıtaˇcov´e grafice zn´am´ ym billboard˚ um). P´ asky se pouˇz´ıvaj´ı pˇri zobrazov´an´ı v re´aln´em ˇcase (zejm´ena tam, kde nejsou podporov´ any ˇc´ ary s anti-aliasingem) [Kim03], ale i pˇri produkˇcn´ım vykreslov´an´ı (ˇcast´a implementace pˇr´ıkazu RiCurves v RenderMan). Na obr´azku 2.2c je vidˇet, ˇze p´asky vyˇzaduj´ı mnohem menˇs´ı poˇcet troj´ uheln´ık˚ u neˇz v´alce. 2.1.3
ˇ ary C´
Vzhledem k tomu, ˇze jsou vlasy mal´e, m˚ uˇze b´ yt vlasov´e vl´akno reprezentov´ano dvojrozmˇernou ˇc´arou (viz obr´azek 2.2d). Nˇekter´e grafick´e syst´emy podporuj´ı kreslen´ı ˇcar s anti-aliasingem, ˇ ary se proto ˇcasto pouˇz´ıvaj´ı pˇri zobrazov´an´ı takov´ ym syst´emem je napˇr´ıklad OpenGL. C´ v re´aln´em ˇcase [Kim03]. 2.1.4
Textury
Vlasy nemus´ı b´ yt explicitnˇe reprezentov´ any pomoc´ı skuteˇcn´ ych grafick´ ych primitiv. Lze pouˇz´ıt jednoduˇsˇs´ı reprezentaci pomoc´ı 2D ˇci 3D-volumetrick´ ych textur, kter´e jsou naneseny na polygon´aln´ı geometrii. Takov´ a reprezentace se vˇetˇsinou hod´ı jen pro velmi kr´atk´e chlupy. V´ıce o textur´ach v ˇc´ asti 4.3.
a)
b)
c)
d)
Obr´azek 2.2: Srovn´ an´ı reprezentac´ı: a) zobecnˇen´e v´alce, b) triangulovan´e v´alce, c) p´asky, d) ˇc´ary.
2.2
Modelov´ an´ı vlas˚ u
Pˇredchoz´ı ˇc´ast se zab´ yvala reprezentac´ı vlas˚ u, kter´e je ovˇsem nutn´e vytvoˇrit – vymodelovat. Tato pr´ace se soustˇred´ı pˇredevˇs´ım na zobrazov´an´ı, pˇresto uv´ad´ım alespoˇ n velmi struˇcn´e uveden´ı do problematiky.
´ ´I VLASU ˚ KAPITOLA 2. ZOBRAZOVAN
5
Pˇri modelov´ an´ı se ˇcasto pracuje jen s velmi omezen´ ym mnoˇzstv´ım vlas˚ u, tzv. ˇr´ıd´ıc´ımi vlasy, kter´e jsou ˇcasto reprezentov´ any hladk´ ymi kˇrivkami s ˇr´ıd´ıc´ımi body. Pouze tyto vlasy jsou ,,uˇces´any” do poˇzadovan´eho tvaru a animace (dynamika) se prov´ad´ı tak´e pouze s tˇemito vlasy. Tento pˇr´ıstup je v´ yhodn´ y, protoˇze je m´enˇe v´ ypoˇcetnˇe n´aroˇcn´ y. Ostatn´ı vlasy, kter´e jsou nutn´e pro vytvoˇren´ı realistick´eho modelu, se z´ıskaj´ı interpolac´ı tˇechto ˇr´ıd´ıc´ıch vlas˚ u aˇz tˇesnˇe pˇred zobrazov´an´ım – vygeneruje se n´ahodn´a pozice (pravdˇepodobnost d´ana hustotou vlas˚ u) na povrchu, ze kter´eho vlasy vyr˚ ustaj´ı. Nov´e vl´akno se z´ısk´a interpolac´ı nejbliˇzˇs´ıch soused˚ u. Proces generov´an´ı se opakuje, dokud nen´ı povrch modelu dostateˇcnˇe zarostl´ y. Pˇri modelov´ an´ı srsti krys ve filmu ,,Ratatouille” (Pixar 2007) se do posledn´ı chv´ıle pracuje s kompaktn´ı reprezentac´ı vlas˚ u, kterou tvoˇr´ı ˇr´ıd´ıc´ı kˇrivky a ostatn´ı vlasy jsou vygenerov´ any v poˇzadovan´em mnoˇzstv´ı aˇz pˇri vykreslov´an´ı [Ryu07]. Modelov´an´ı vlas˚ u je samozˇrejmˇe souˇc´ast´ı grafick´ ych 3D editor˚ u jako je napˇr´ıklad Autodesk Maya (z´asuvn´ y modul MayaFur nebo extern´ı z´asuvn´ y modul Shave and a Haircut [Alt08]).
2.3
Algoritmy pro vykreslov´ an´ı
ˇ ım se vlasy odliˇsuj´ı od klasick´e polygon´ Proˇc je zobrazov´ an´ı vlas˚ u vlastnˇe tak n´aroˇcn´e? C´ aln´ı geometrie? Z´ akladn´ı probl´emy pˇri vykreslov´an´ı vlas˚ u jsou: • Vlas˚ u/chlup˚ u je ve sc´enˇe obvykle obrovsk´e mnoˇzstv´ı (50 000 aˇz 100 000 pro jednoho ˇclovˇeka, stovky tis´ıc pro srst zv´ıˇrete). • Pr˚ umˇer vlasu je velmi mal´ y, jedn´ım pixelem obr´azku tak ˇcasto proch´az´ı mnoho r˚ uzn´ ych vlas˚ u. Pˇri nedostateˇcn´em vzorkov´an´ı, tak vznik´a neˇz´adouc´ı aliasing. • Vlasy jsou ˇc´ asteˇcnˇe pr˚ uhledn´e, coˇz je d˚ uleˇzit´e pˇri ˇreˇsen´ı viditelnosti. • Vlasy vrhaj´ı st´ıny a to i na sebe sama – tzv. self-shadows. Nyn´ı uv´ad´ım tˇri algoritmy, kter´e se pouˇz´ıvaj´ı pro vykreslov´an´ı (nejen) vlas˚ u s ohledem na uveden´e probl´emy. 2.3.1
GPU Z-buffer
Pamˇeˇt hloubky [ZBSF04] se pouˇz´ıv´a k vyˇsetˇren´ı viditelnosti zejm´ena na GPU. Vlasy se zoˇ jako ˇc´ brazuj´ı bud ary nebo pruhy troj´ uheln´ık˚ u (p´asky). Pro korektn´ı vykreslov´an´ı je ovˇsem nutn´e pouˇz´ıvat pr˚ uhlednost, takˇze Z-buffer (resp. jeho souˇcasnou implementaci na GPU) nen´ı moˇzn´e pouˇz´ıt. Pro spr´ avn´e m´ıch´ an´ı barev je totiˇz nutn´e, aby segmenty vlas˚ u byly nakresleny ve spr´avn´em poˇrad´ı, tj. odzadu (nejdˇr´ıve nejvzd´alenˇejˇs´ı). Pouˇz´ıv´a se aproximativn´ı technika ˇrazen´ı segment˚ u podle vzd´ alenosti k pozorovateli [Kim03] a kreslen´ı s vypnut´ ym Z-bufferem. ˇ Casto je nutn´e zobrazovat pr˚ uhledn´e i nepr˚ uhledn´e povrchy. V tomto pˇr´ıpadˇe jsou nejprve vykresleny nepr˚ uhledn´e povrchy se zapnut´ ym Z-bufferem a pak se teprve kresl´ı seˇrazen´e pr˚ uhledn´e plochy. Jinou technikou pro kreslen´ı pr˚ uhledn´ ych objekt˚ u na GPU je tzv. depth peeling [Eve01], kdy se obr´azek kresl´ı postupnˇe po vrstv´ ach. Tato technika vyˇzaduje pouˇzit´ı dvou Z-buffer˚ u, kdy druh´ y je na dneˇsn´ıch GPU nutn´e simulovat. Metoda je vhodn´a pouze pro mal´ y poˇcet pr˚ uhledn´ ych ploch, kter´e se pˇrekr´ yvaj´ı, protoˇze kaˇzd´a vrstva pˇredstavuje jeden vykreslovac´ı pr˚ uchod. Tud´ıˇz tuto techniku nelze efektivnˇe vyuˇz´ıt pro zobrazov´an´ı vlas˚ u.
´ ´I VLASU ˚ KAPITOLA 2. ZOBRAZOVAN
6
Anti-aliasing polygon˚ u a ˇcar je pˇr´ımo podporov´an na GPU, mal´eho pr˚ umˇeru vlas˚ u se ˇcasto dos´ahne nastaven´ım mal´e pr˚ uhlednosti (pr˚ uhlednˇejˇs´ı polygon vypad´a tenˇc´ı). Tato metoda ,,sniˇzov´an´ı pr˚ umˇeru vl´ akna” se pouˇz´ıv´ a i u ostatn´ıch n´ıˇze uveden´ ych algoritm˚ u. Celoobrazovkov´ y anti-aliasing (FSAA) nestaˇc´ı pouˇz´ıt samotn´ y vzhledem k opravdu velmi mal´ ym rozmˇer˚ um vlasu. Lze jej pouze kombinovat s anti-aliasingem polygon˚ u resp. ˇcar. Pro st´ıny ve vlasech se pouˇz´ıvaj´ı mapy nepr˚ usvitnosti (opacity maps) [KN01]. Metoda je zaloˇzena podobnˇe jako klasick´e st´ınov´e mapy na vykreslen´ı modelu z pozice svˇetla. V pˇr´ıpadˇe map nepr˚ usvitnosti se vytvoˇr´ı nˇekolik ˇrez˚ u, kde v kaˇzd´em jsou vykreslen´e vlasy mezi t´ımto ˇrezem a svˇetlem (viz obr´ azek 2.3). Pˇri vykreslov´an´ı obr´azku se interpolac´ı hodnot ze sousedn´ıch ˇrez˚ u urˇc´ı poˇcet vlas˚ u, kter´e jsou mezi svˇetlem a aktu´alnˇe zpracov´avan´ ym fragmentem. Z t´eto hodnoty se vypoˇc´ıt´ a velikost zast´ınˇen´ı. i
Obr´azek 2.3: Mapy nepr˚ usvitnosti se vytv´aˇr´ı vykreslen´ım z pozice svˇetla s pouˇzit´ım nˇekolika ˇrez˚ u. Obr´azek pˇrejat z [Kim03].
Zobrazov´an´ı vlas˚ u na GPU funguje v re´ aln´em ˇcase a pouˇz´ıv´a se dnes i v poˇc´ıtaˇcov´ ych hr´ach. Nev´ yhodou je nepˇresn´e ˇreˇsen´ı viditelnosti a st´ın˚ u.
2.3.2
Sledov´ an´ı paprsku (ray tracing)
Metodu sledov´an´ı paprsku [ZBSF04] lze bez probl´em˚ u pouˇz´ıt pro zobrazov´an´ı vlas˚ u. S vyˇsetˇren´ım viditelnosti vˇcetnˇe pr˚ uhlednosti zde nen´ı probl´em a v´ ysledky jsou mnohem pˇresnˇejˇs´ı neˇz v pˇr´ıpadˇe GPU. Pr˚ uhlednost je ˇreˇsena zaznamen´ an´ım vˇsech vlas˚ u, kter´e prot´ınaj´ı prim´arn´ı paprsek, a jejich spr´avn´ ym mixov´ an´ım. Pro odstranˇen´ı aliasingu je nutn´e pouˇz´ıt vˇetˇs´ı mnoˇzstv´ı paprsk˚ u na pixel, coˇz je hlavn´ı v´ ykonnostn´ı probl´em metody. Proto lze tak´e, jako v pˇredchoz´ım pˇr´ıpadˇe, sniˇzovat opticky pr˚ umˇer vlas˚ u pomoc´ı pr˚ uhlednosti, potom m˚ uˇze staˇcit i menˇs´ı mnoˇzstv´ı paprsk˚ u. Pro st´ıny lze pouˇz´ıt techniku vrhnut´ı sekund´arn´ıho st´ınov´eho paprsku ke svˇetlu, kdy je ovˇsem stejnˇe jako u prim´ arn´ıho paprsku nutn´e uvaˇzovat vˇsechny vlasy mezi svˇetlem a vyˇsetˇrovan´ ym fragmentem. To m˚ uˇze b´ yt velmi pomal´e, ˇcastˇeji se proto pouˇz´ıvaj´ı tzv. deep shadow maps [LV00]. Tyto st´ınov´e mapy se opˇet vytv´aˇr´ı z pozice svˇetla a maj´ı dvˇe velk´e v´ yhody – jsou
´ ´I VLASU ˚ KAPITOLA 2. ZOBRAZOVAN
7
pˇredfiltrovan´e a kaˇzd´ y pixel obsahuje pomˇernˇe pˇresnou funkci viditelnosti, coˇz nelze srovn´ avat s nˇekolika diskr´etn´ımi ˇrezy v pˇr´ıpadˇe map nepr˚ usvitnosti. Nev´ yhodou mohou b´ yt o nˇeco vyˇsˇs´ı pamˇeˇtov´e n´ aroky. Metoda sledov´ an´ı paprsku je sice mnohem pˇresnˇejˇs´ı oproti GPU, co se viditelnosti a st´ın˚ u t´ yˇce, ale tak´e mnohem pomalejˇs´ı. 2.3.3
Reyes
Ve vykreslovac´ıch programech standardu RenderMan se ˇcasto pouˇz´ıv´a implementace scan-line zobrazovac´ıho algoritmu, kter´ y je zn´am jako reyes. Reyes byl vyvinut v 80. letech v Lucasfilm Ltd. (nyn´ı Pixar ) speci´ alnˇe pro filmov´ y pr˚ umysl [CCC87]. C´ılem bylo vytvoˇrit syst´em, kter´ y by bylo moˇzn´e vyuˇz´ıt pro vykreslov´an´ı velk´ ych sloˇzit´ ych realistick´ ych sc´en v pˇrijateln´em ˇcase – pokud vykreslen´ı jednoho sn´ımku trv´a tˇri minuty, potom dvouhodinov´ y film pˇri 24 sn´ımc´ıch za sekundu trv´ a pˇribliˇznˇe jeden rok, coˇz je povaˇzov´ano za pˇrijateln´ y ˇcas. Syst´em aproximuje mnoho efekt˚ u glob´aln´ıho osvˇetlov´an´ı pomoc´ı textur (napˇr´ıklad environment mapping a shadow mapping) a nemus´ı vyuˇz´ıvat pomal´ y ray tracing.
Obr´ azek 2.4: Zjednoduˇsen´e sch´ema architektury reyes. Architektura reyes je detailnˇe pops´ana napˇr´ıklad v [CCC87] nebo [Apo00]. Zde uvedu alespoˇ n struˇcn´ y v´ yklad t´eto architektury, protoˇze tento algoritmus nen´ı tak zn´am´ y jako implementace Z-bufferu na GPU ˇci metoda sledov´an´ı paprsku.
8
´ ´I VLASU ˚ KAPITOLA 2. ZOBRAZOVAN
Zjednoduˇsen´a architektura Reyes je na obr´azku 2.4. Vstupem je soubor RIB (RenderMan Interface Bytestream), ze kter´eho jsou naˇcteny pˇr´ıkazy pro RenderMan (napˇr´ıklad definice geometrie). Algoritmus nejprve rozloˇz´ı vˇsechna geometrick´a primitiva na menˇs´ı kousky a odstran´ı ty, kter´e se nach´ az´ı mimo v´ yseˇc kamery (frustum test). Menˇs´ı kousky jsou n´aslednˇe rozloˇzeny na tzv. mikropolygony. Mikropolygony jsou ˇctyˇru ´heln´ıky, kter´e maj´ı velikost strany asi 1/2 pixelu a dohromady vytv´ aˇr´ı mˇr´ıˇzku mikropolygon˚ u. N´asleduje aplikace st´ınovac´ıch program˚ u (shaders) na vrcholy mikropolygon˚ u. Pak teprve doch´az´ı k vyˇsetˇren´ı viditelnosti pomoc´ı Zbufferu. Pˇri zpracov´an´ı pr˚ uhledn´ ych povrch˚ u si algoritmus udrˇzuje nˇekolik z´aznam˚ u o viditelnosti v Zbufferu. To bohuˇzel m˚ uˇze znamenat dramatick´ y n´ar˚ ust pamˇeti implementace Z-bufferu. Pro zv´ yˇsen´ı v´ ykonu byl algoritmus doplnˇen o tzv. bucketing – obraz je na zaˇc´atku rozdˇelen na mal´e ˇctvercov´e oblasti, kter´e se vykresluj´ı samostatnˇe. Proto se pˇri vykreslov´an´ı v RenderMan v´ ysledn´ y obr´azek objevuje po charakteristick´ ych ˇctverc´ıch. Nˇekter´e st´ınovac´ı programy mohou b´ yt velmi n´aroˇcn´e na v´ ypoˇcet, proto byl reyes pozdˇeji tak´e doplnˇen o occlusion culling, kdy doch´az´ı nejprve k ˇreˇsen´ı viditelnosti a aˇz pot´e k aplikace st´ınovac´ıch program˚ u. St´ınov´an´ı se tak prov´ad´ı jen pro skuteˇcnˇe viditeln´e mikropolygony. Mezi v´ yhody architektury Reyes patˇr´ı napˇr´ıklad mal´e pamˇeˇtov´e n´aroky i v pˇr´ıpadˇe velk´ ych sc´en, velk´e moˇznosti paralelizace a vektorizace v´ ypoˇct˚ u (SIMD), podpora efekt˚ u rozostˇren´ı pohybem (motion blur ) a hloubky ostrosti (depth of field ). Reyes je tak hojnˇe vyuˇz´ıv´an v produkˇcn´ım prostˇred´ı. Jak si Reyes porad´ı se zobrazov´ an´ım vlas˚ u? D´ıky rozdˇelen´ı geometrick´ ych primitiv (tj. vˇsech segment˚ u vlas˚ u) do oblast´ı (bucket), doch´ az´ı ke zmenˇsen´ı pamˇeˇtov´ ych n´arok˚ u a t´ım i ke zv´ yˇsen´ı rychlosti vykreslov´ an´ı. Zobrazov´ an´ı pr˚ uhledn´ ych ploch je podporov´ano (viz v´ yˇse) a pro st´ıny lze pouˇz´ıt deep shadow maps podobnˇe jako u metody sledov´an´ı paprsku. Aliasing se odstraˇ nuje opˇet vyˇsˇs´ım vzorkov´ an´ım a u ´pravou pr˚ uhlednosti vlasu m´ısto jeho pr˚ umˇeru. Reyes d´av´a pˇresn´e ˇreˇsen´ı viditelnosti a st´ın˚ u podobnˇe jako metoda sledov´an´ı paprsku. Je sice v´ yraznˇe pomalejˇs´ı neˇz GPU, ale ˇcasto rychlejˇs´ı neˇz sledov´an´ı paprsku.
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
9
3 Osvˇ etlovac´ı modely Osvˇetlovac´ı model n´ am ˇr´ık´ a, jak´ ym zp˚ usobem se chov´a svˇetlo po dopadu na povrch dan´eho materi´alu. V r´ amci standardu RenderMan se osvˇetlovac´ı modely implementuj´ı pomoc´ı st´ınovac´ıch program˚ u (surface shaders), v´ıce v ˇc´asti 6.4.
3.1
Model Kajiya & Kay
Tento osvˇetlovac´ı model poch´ az´ı z roku 1989 [KK89], pˇresto je pro svou jednoduchost nejpouˇz´ıvanˇejˇs´ı v hern´ım a dokonce i produkˇcn´ım prostˇred´ı. Kajiya & Kay uvaˇzuje dvˇe sloˇzky osvˇetlen´ı – dif´ uzn´ı a zrcadlovou. Dif´ uzn´ı komponenta je odvozena z Lambertova osvˇetlovac´ıho modelu, pokud jej aplikujeme na velmi tenk´ y v´alec. Zrcadlov´a komponenta je podobn´ a Phongovu modelu, kter´ y byl upraven pro v´alcov´e povrchy. Na obr´azku 3.1 je nakreslena geometrie vlasu pro tento model.
E
L
T
~ je vektor ke svˇetlu Obr´azek 3.1: Geometrie vlasu modelu Kajiya & Kay. T~ je tangenta vlasu, L ~ je vektor k pozorovateli. aE
3.1.1
Dif´ uzn´ı sloˇ zka
Dif´ uzn´ı komponentu osvˇetlovac´ıho modelu vlasu z´ısk´ame integrac´ı Lambertova povrchu po obvodu poloviny v´ alce pˇrivr´ acen´e ke svˇetlu. Zadn´ı strana v´alce nen´ı osvˇetlen´a. Vzorec pro v´ ypoˇcet dif´ uzn´ı sloˇzky (odvozen´ı viz [KK89]): ~ Ψdiffuse = Kd sin (T~ , L)
(3.1)
~ vektor ke svˇetlu (viz obr´azek 3.1). Velikost Kde Kd je velikost dif´ uzn´ı sloˇzky, T~ je tangenta a L dif´ uzn´ı sloˇzky tedy z´ avis´ı na sinu u ´hlu mezi tangentou a vektorem ke svˇetlu. Pokud je tangenta rovnobˇeˇzn´ a s vektorem ke svˇetlu, bude osvˇetlovan´ y vlas tmav´ y. ˇ Casto se pouˇz´ıv´ a jin´ y typ dif´ uzn´ı sloˇzky, protoˇze pˇredchoz´ı verze trp´ı nˇekolika nedostatky. Prvn´ı byl jiˇz zm´ınˇen – vlas je ˇcern´ y, pokud je rovnobˇeˇzn´ y se smˇerem ke svˇetlu, d´ale pak neintuitivn´ı chov´an´ı pro sv´ıcen´ı. Vlasy tak ˇcasto nevypadaj´ı pˇrirozenˇe. N´asleduj´ıc´ı pˇr´ıstup byl pouˇzit ve filmu ,,Myˇs´ak Stuart” (Stuart Little – Sony Pictures 1999) [Bre00]. Norm´ alov´ y vektor pro v´ ypoˇcet dif´ uzn´ı komponenty se z´ısk´a pomoc´ı tangenty vlasu a norm´alov´eho vektoru povrchu, ze kter´e vlas vyr˚ ust´a (viz obr´azek 3.2). Pokud je vlas kolm´ y na ~ srf , jinak se pouˇzije vektor N ~ hair . Oba vektory povrch, pouˇzije se norm´ alov´ y vektor povrchu N ~: lze sm´ıchat pomoc´ı line´ arn´ı interpolace. V´ ypoˇcet vektoru N
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
10
~ S ~ hair N l ~ N
= = = =
~ srf × T~ N ~ T~ × S ~ srf · T~ , 0, 1) clamp(N ~ ~ hair ) (l · Nsrf ) + ((1 − l) · N
(3.2)
~ se pot´e pouˇzije pro v´ N ypoˇcet dif´ uzn´ı komponenty pomoc´ı Lambertova modelu. V´ yhodou modelu je oˇcek´ avanˇejˇs´ı vzhled pˇri sv´ıcen´ı sc´eny oproti klasick´emu Kajiya & Kay v´ ypoˇctu. Nsrf
Nh air
~ hair Obr´azek 3.2: Dif´ uzn´ı sloˇzka pouˇzit´ a ve filmu ,,Myˇs´ak Stuart” se vypoˇc´ıt´a pomoc´ı vektor˚ uN ~ resp. Nsrf . Obr´ azek pˇrekreslen podle [Bre00].
3.1.2
Zrcadlov´ a sloˇ zka
Kaˇzd´ y paprsek, kter´ y pˇrich´ az´ı na vlasov´e vl´akno, se odr´aˇz´ı zrcadlovˇe podle tangenty (viz alov´ y vektor tenk´eho v´alce ukazuje do vˇsech smˇer˚ u, paprsek se obr´azek 3.3). Protoˇze norm´ vlastnˇe odr´aˇz´ı do kuˇzelu. Vzorec pro v´ ypoˇcet zrcadlov´e sloˇzky (odvozen´ı viz [KK89]): ~ T~ · E) ~ + sin (T~ , L) ~ sin (T~ , E)] ~ p Ψspecular = Ks [(T~ · L)(
(3.3)
~ E ~ jsou vektory z obr´ Kde T~ , L, azku 3.3 a p je Phong˚ uv exponent specifikuj´ıc´ı ostrost odlesku.
E L
T
Obr´azek 3.3: Zrcadlov´ a sloˇzka Kajiya & Kay. Paprsek se odr´aˇz´ı zrcadlovˇe do kuˇzelu, protoˇze norm´alov´ y vektor tenk´eho v´ alce ukazuje do vˇsech smˇer˚ u. V´ ysledky m´e implementace modelu Kajiya & Kay jsou uvedeny v ˇc´asti 7.1.
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
3.2
11
Marschner˚ uv model
Nov´a mˇeˇren´ı [MJC+ 03] rozptylu svˇetla ve vlasech uk´azala nov´e efekty, kter´e nejsou predikov´ any uhledn´ y standardn´ım modelem Kajiya & Kay (obr´azek 3.5). Vlas je zde simulov´an jako pr˚ eliptick´ y v´ alec, jehoˇz vnitˇrek absorbuje urˇcitou ˇc´ast svˇetla. Povrch v´alce je tvoˇren pokoˇzkou, kter´a je pokryta m´ırnˇe vych´ ylen´ ymi ˇsupinami (viz obr´azek 3.4). R
Kořen
TRT
TT
Špička
Obr´azek 3.4: Sch´ematick´e zn´ azornˇen´ı vlasov´eho vl´akna a moˇzn´ ych cest rozptylu paprsku. Efekty predikovan´e nov´ ym modelem: R (odraz) – prim´ arn´ı odraz. Paprsek je odraˇzen od povrchu vlasu zpˇet. Odraz z´avis´ı i na vych´ ylen´ı ˇsupin na povrchu vlasu. Tento odraz je b´ıl´ y a odpov´ıd´a zrcadlov´e sloˇzce, kterou predikuje osvˇetlovac´ı model Kajiya & Kay. TT (lom, lom) – zadn´ı nasv´ıcen´ı. Paprsek se lom´ı pˇri vstupu do prostˇred´ı vlasu a pˇri v´ ystupu do voln´eho prostoru. Vlasy (blond, b´ıl´e, hnˇed´e a ˇsed´e) se tak jev´ı velmi jasn´e, pokud jsou nasv´ıceny zezadu. TRT (lom, odraz, lom) – sekund´ arn´ı odraz. Barevn´ y sekund´arn´ı odraz je um´ıstˇen nad prim´ arn´ım odrazem, vypad´ a jako tˇrpyt vlas˚ u. TT a TRT nejsou predikov´ any modelem Kajiya & Kay. Marschner˚ uv model vych´az´ı z fyzik´ aln´ı anal´ yzy a neobsahuje proto empirickou dif´ uzn´ı sloˇzku, kter´a je pˇr´ıtomna v modelu Kajiya & Kay. V praktick´em st´ınovac´ım programu je ˇcasto dif´ uzn´ı sloˇzka implementov´ana (viz ˇc´ast 7.1). Na obr´azku 3.5 je porovn´ an´ı osvˇetlovac´ıch model˚ u s re´aln´ ymi vlasy. Nyn´ı se pod´ıvejme na rozbor Marschnerova modelu. Nezbytn´a teorie je uvedena v p˚ uvodn´ım + a se zde budu vˇenovat pouze nˇekter´ ym implementaˇcn´ım detail˚ um modelu. ˇcl´anku [MJC 03], j´ 3.2.1
Geometrie vlasu
Na obr´azku 3.6 je pops´ ana geometrie vlasu. ~u je tangenta vlasu, kter´a spolu s vektory ~v a w ~ tvoˇr´ı ortonorm´ aln´ı b´ azi. Vektor w ~ lze tedy spoˇc´ıtat pomoc´ı vektorov´eho souˇcinu w ~ = ~u × ~v . Jak urˇcit vektor ~v ? Tento vektor mus´ı leˇzet v rovinˇe urˇcen´e vektorem ~u a mus´ı b´ yt spojit´ y v r´amci kaˇzd´eho jednoho vlasu. Pˇri praktick´e implementaci tedy lze pouˇz´ıt n´ahodn´ y vektor, kter´ y je kolm´ y na ~u.
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
12
(a) Kajiya & Kay
(b) Marschner
(c) Re´aln´e vlasy (foto)
Obr´azek 3.5: Porovn´ an´ı osvˇetlovac´ıch model˚ u s re´aln´ ymi vlasy. (a) obsahuje dif´ uzn´ı sloˇzku a zrcadlov´ y odraz, (b) obsahuje b´ıl´ y prim´arn´ı odraz a nad n´ım um´ıstˇen´ y barevn´ y sekund´arn´ı odraz. Obr´azky pˇrejaty z [MJC+ 03].
w ωi θi
u
φi
φr
v
θr
ωr
Obr´azek 3.6: Souˇradn´ y syst´em vlasu je tvoˇren vektory ~u, ~v , w. ~ Vektor ω~i je smˇer ke svˇetlu, ω~r + k pozorovateli. Obr´ azek pˇrejat z [MJC 03].
M´ame-li vektor ~u = (ux , uy , uz ), potom jeden z kolm´ ych (jednotkov´ ych) vektor˚ u na ~u je: ~v =
(uy , −ux , 0) ||(uy , −ux , 0)||
(3.4)
Pro spr´avnou funkˇcnost modelu je ovˇsem nutn´e, aby jednotliv´e vlasy mˇely r˚ uzn´e (n´ahodn´e) smˇery vektor˚ u ~v . Je to kv˚ uli spr´ avn´e funkˇcnosti TRT komponenty, kter´a je z´avisl´a pr´avˇe na orientaci vektoru ~v . Pokud by vektory byly stejn´e, v sekund´arn´ım odraze by se neobjevily kaustiky r˚ uzn´e intenzity, kter´e zp˚ usobuj´ı tˇrpyt vlas˚ u. Vektor ~v je proto nutn´e randomizovat, napˇr´ıklad pomoc´ı n´ ahodn´e rotace kolem osy ~u. Vektory ke svˇetlu ω~i a k pozorovateli ω~r se transformuj´ı do souˇradn´eho syst´emu vlasu. Model pracuje se sf´erick´ ymi u ´hly: • θi resp. θr je inklinace (−90◦ aˇz 90◦ ; ~u je 90◦ , −~u je −90◦ , 0◦ v pˇr´ıpadˇe kolmosti na ~u). • φi resp. φr je azimut okolo vlasu (0◦ aˇz 360◦ ; ~v je 0◦ , w ~ je 90◦ ).
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
13
Pro osvˇetlovac´ı model se d´ ale hod´ı rozd´ılov´e a poloviˇcn´ı u ´hly: θd φ θh φh
= = = =
(θr − θi )/2 φr − φi (θr + θi )/2 (φr + φi )/2
(3.5)
Shrˇ nme si cel´ y postup v´ ypoˇctu u ´hl˚ u – na zaˇc´atku zn´ame pouze tangentu vlasu ~u = (ux , uy , uz ) a vektory ω~i (ke svˇetlu) a ω~o (k pozorovateli). Vˇsechny vektory jsou ve svˇetov´ ych souˇradnic´ıch. Urˇc´ıme vektor ~v podle vzorce (3.4) a w ~ = ~u × ~v . Sestav´ıme matici souˇradn´eho syst´emu:
M1 =
vx wx ux vy wy uy vz wz uz 0 0 0
0 0 0 1
(3.6)
Urˇc´ıme n´ ahodn´ yu ´hel α rotace, kter´ y mus´ı b´ yt shodn´ y vˇzdy pro cel´ y vlas (v´ıce v ˇc´asti 6.4.2) a na souˇradn´ y syst´em aplikujeme rotaci: M2 = M1 ∗ MZ (α)
(3.7)
Kde MZ je standardn´ı matice pro rotaci kolem osy Z [ZBSF04]. Vypoˇc´ıt´ame matici M3 , kter´ a bude slouˇzit pro transformaci vektor˚ u ω~i a ω~r do souˇradn´eho syst´emu vlasu. Jedn´a se o inverzn´ı matici k M2 , a protoˇze je souˇradn´ y syst´em ortonorm´aln´ı, odpov´ıd´a tak´e matici transponovan´e: M3 = M2 −1 = M2 T = (M1 ∗ MZ (α))T
(3.8)
Transformujeme vektory ω~i a ω~r do souˇradn´eho syst´emu vlasu pomoc´ı matice M3 : ω~i 0 = M3 · ω~i ω~r 0 = M3 · ω~r
(3.9)
Vypoˇc´ıt´ame sf´erick´e u ´hly: θ
= − arccos(ωz0 + π/2) ω0
φ = arctan( ωy0 )
(3.10)
x
´ Uhel φ by mˇel b´ yt upraven do intervalu h0◦ , 360◦ ). Dosazen´ım vektor˚ u ω~r 0 resp. ω~i 0 tak z´ısk´ ame θr , φr resp. θi , φi . Pot´e provedeme v´ ypoˇcet rozd´ılov´ ych a poloviˇcn´ıch u ´hl˚ u, kter´ y byl uveden ve vzorci (3.5). 3.2.2
Funkce rozptylu
Odchoz´ı kˇrivkov´ a radiance (viz ˇc´ ast 2.2 v [MJC+ 03]) se spoˇc´ıt´a: Z
Lr (ω~r ) = D
S(ω~i , ω~r )Li (ω~i ) cos θi dωi Ω
Kde: • D je pr˚ umˇer vlasu (tlust´e vl´ akno pˇrij´ım´a v´ıce svˇetla neˇz tenk´e).
(3.11)
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
14
• S je funkce rozptylu podobn´ a BRDF (Bidirectional Reflectance Distribution Function) • Li je pˇr´ıchoz´ı radiance Uveden´ y integr´ al je pˇres celou sf´eru. Funkce rozptylu S, se spoˇc´ıt´a jako (ˇc´ast 4.4 v [MJC+ 03]): S(φi , θi , φr , θr ) = SR · MR (θh ) · NR (η 0 (η, θd ); φ) / cos2 θd STT · MTT (θh ) · NTT (η 0 (η, θd ); φ) / cos2 θd 0 ∗ STRT · MTRT (θh ) · NTRT (η (η (φh ), θd ); φ) / cos2 θd
+ + (3.12)
Oproti p˚ uvodn´ımu ˇcl´ anku jsem pˇridal konstanty SR , STT a STRT , kter´e urˇcuj´ı velikost jednotliv´ ych sloˇzek modelu. V´ ypoˇcet funkc´ı M a N je uveden d´ale. 3.2.2.1
Pod´ eln´ a funkce rozptylu M
Funkce MR , MTT a MTRT pˇredstavuj´ı z´ avislost odrazu v pod´eln´em smˇeru vlasu. Podle ˇc´asti + 5.1 v [MJC 03] lze funkce aproximovat: MR (θh ) = g(βR ; θh − αR ) MTT (θh ) = g(βTT ; θh − αTT ) MTRT (θh ) = g(βTRT ; θh − αTRT )
(3.13)
Kde βx (pod´eln´ a ˇs´ıˇrka) resp. αx (pod´eln´e posunut´ı) jsou nastaviteln´e parametry a g(σ, x) je funkce Gaussova rozdˇelen´ı: 1 −x2 g(σ, x) = √ exp (3.14) 2σ 2 σ 2π Typick´e hodnoty pod´eln´eho posunut´ı: αR ∈ (−10◦ , 10◦ ) αTT = −αR /2 αTRT = −3αR /2
(3.15)
βR ∈ (5◦ , 10◦ ) βTT = βR /2 βTRT = 2βR
(3.16)
Typick´e hodnoty pod´eln´e ˇs´ıˇrky:
3.2.2.2
Azimut´ aln´ı funkce rozptylu N
Aproximace azimut´ aln´ıch funkc´ı je mnohem sloˇzitˇejˇs´ı neˇz funkc´ı pod´eln´ ych, implementace m˚ uˇze ˇcinit znaˇcn´e probl´emy. Pro zv´ yˇsen´ı pˇrehlednosti t´eto ˇc´asti textu je zde tabulka 3.1 pouˇzit´ ych symbol˚ u. Teoretick´e odvozen´ı a v´ yznam v´ ypoˇct˚ u viz [MJC+ 03]. V´ ypoˇcty vˇsech N funkc´ı jsou si podobn´e, jen v´ ypoˇcet NTRT je na nˇekolika m´ıstech jin´ y. Nejprve vypoˇc´ıt´ ame indexy lomu podle vzorc˚ u: η0 η 00
q
= η 2 − sin2 θd / cos θd 2 = η / η0
Kde η je index lomu vl´ akna (typicky 1.55) a θd je rozd´ıl inklinac´ı ze vzorce (3.5).
(3.17)
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC η σa a η 0 , η 00 p c γi γt T Fp D η∗
15
Index lomu vl´ akna (typicky 1.55) Absorpce vl´ akna (RGB) Excentricita elipsy vl´akna (typicky 0.85) Indexy lomu podle rovnic (3.17) Parametr dle typu funkce N (0 pro NR , 1 pro NTT , 2 pro NTRT ) Promˇenn´ a podle rovnice (3.19) ´ Uhel z´ıskan´ y vyˇreˇsen´ım kubick´e rovnice (3.18) ´ Uhel z´ıskan´ y pomoc´ı aproximace Snellova z´akona (3.20) Absorpce podle rovnice (3.21) Fresnelovy faktory podle rovnice (3.23) Hustota paprsku podle rovnice (3.27) Modifikovan´ y index lomu podle rovnice (3.29) pro v´ ypoˇcet NTRT
Tabulka 3.1: Pouˇzit´e symboly pˇri v´ ypoˇctu azimut´aln´ıch funkc´ı rozptylu N . V prvn´ı ˇc´ asti tabulky jsou uvedeny nastaviteln´e parametry. Vyˇreˇs´ıme kubickou rovnici a z´ısk´ ame γi :
φ=
8pc 6pc − 2 γi − 3 γi3 + pπ π π
´ Uhel φ zn´ ame, mˇel by b´ yt ovˇsem pˇreveden do intervalu h−π, πi. n´asleduj´ıc´ıch hodnot:
(3.18) Promˇenn´a p nab´ yv´ a
• p = 0 pˇri v´ ypoˇctu NR • p = 1 pˇri v´ ypoˇctu NTT • p = 2 pˇri v´ ypoˇctu NTRT Za c dosad´ıme: c = arcsin(1/η 0 )
(3.19)
Kubick´a rovnice m˚ uˇze m´ıt obecnˇe aˇz 3 ˇreˇsen´ı. Koˇreny, kdy γi vyjde mimo interval h−π/2, π/2i, ignorujeme. V pˇr´ıpadˇe funkc´ı NR a NTT vyjde vˇzdy pˇresnˇe jeden (validn´ı) koˇren, NTRT m˚ uˇze m´ıt 1 aˇz 3 koˇreny. Pomoc´ı aproximace Snellova z´ akona urˇc´ıme u ´hel lomen´eho paprsku: γt =
4c 3c γi − 3 γi3 π π
(3.20)
γi je koˇren kubick´e rovnice (3.18) a c viz vzorec (3.19). Absorpce svˇetla T se spoˇc´ıt´ a jako (na tomto m´ıstˇe v ˇcl´anku [MJC+ 03] je chybnˇe urˇcena d´elka cesty paprsku): σa0 = σa / cos(θ p d) (3.21) T = exp(− 2 + 2 cos(2γt ) σa0 ) Kde σa je absorpce vl´ akna (nastaviteln´ y parametr). Nastavovat absorpci m´ısto barvy je neintuitivn´ı, proto se ˇcasto pouˇz´ıv´ a barva a absorpce se potom vypoˇcte jako: σa = −k log hc
(3.22)
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
16
Kde hc je barva vlasu (RGB parametr) a k je kladn´a konstanta. V´ ysledn´a absorpce m´a, stejnˇe jako barva, tˇri sloˇzky (RGB) a m˚ uˇze nab´ yvat hodnot z intervalu (0, ∞). Zˇredˇen´ı d´ıky odrazu a lomu se spoˇc´ıt´ a pomoc´ı Fresnelov´ ych faktor˚ u. Zde se v´ ypoˇcet liˇs´ı podle typu funkce N : FR = fresnel(γi , γt , η 0 , η 00 ) FTT = (1 − fresnel(γi , γt , η 0 , η 00 ))2 FTRT = (1 − fresnel(γi , γt , η 0 , η 00 ))2 fresnel(γt , γi , 1/η 0 , 1/η 00 )
(3.23)
Fresnelovy faktory se vypoˇc´ıtaj´ı podle rovnice: fresnel(ρi , ρt , n1 , n2 ) =
Fp (ρi , ρt , n1 )2 + Fs (ρi , ρt , n2 )2 2
Fp je paraleln´ı sloˇzka:
(3.24)
Fp (ρi , ρt , n1 ) =
n1 cos ρi − cos ρt n1 cos ρi + cos ρt
(3.25)
Fs (ρi , ρt , n2 ) =
cos ρi − n2 cos ρt cos ρi + n2 cos ρt
(3.26)
Fs je kolm´a sloˇzka:
Zb´ yv´a vypoˇc´ıtat hustotu paprsku (ray density) pomoc´ı derivace kubick´e rovnice (3.18), kde h = sin γi : −1 6pc dφ dφ −1 24pc 2 1 −1 = 2 D = 2 = 2 − 2 − 3 γi ) dh dγi cos γi π π cos γi
(3.27)
A koneˇcnˇe v´ ysledn´ y vzorec pro v´ ypoˇcet funkc´ı N (NR = N0 , NTT = N1 a NTRT = N2 ), v sumˇe se sˇc´ıt´a pˇres vˇsechny validn´ı koˇreny r: Np =
X
Fp · T p · D
(3.28)
r
Jak jsem zm´ınil na zaˇc´ atku, v´ ypoˇcet NTRT vyˇzaduje jeˇstˇe nˇekolik u ´prav. Za prv´e je nutn´e pouˇz´ıt modifikovan´ y index lomu η ∗ m´ısto η ve vzorc´ıch (3.17): η1∗ = 2(η − 1)a2 − η + 2 η2∗ = 2(η − 1)a−2 − η + 2 η ∗ = 12 [(η1∗ + η2∗ ) + cos(2φh )(η1∗ − η2∗ )]
(3.29)
Kde a je excentricita elipsy (typicky 0.85). Dalˇs´ı u ´pravou je odstranˇen´ı ostr´ ych singularit v NTRT , tzv. smooth caustic. Procedura je uvedena v ˇc´asti 5.2.2 ˇcl´ anku [MJC+ 03]. V´ ysledky m´e implementace Marschnerova modelu jsou uvedeny v ˇc´asti 7.1.
3.3
Dalˇ s´ı osvˇ etlovac´ı modely
Marschner˚ uv model d´ av´ a dobr´e v´ ysledky zejm´ena u tmav´ ych (hnˇed´ ych, ˇcern´ ych) vlas˚ u. Horˇs´ıch v´ ysledk˚ u dosahuje na vlasech svˇetl´ ych (blond). Existuje rozˇs´ıˇren´ı Marschnerova modelu pro blond vlasy [ZSW04]. Dalˇs´ı zobecnˇen´ı osvˇetlovac´ıho modelu vlas˚ u je BFSDF (Bidirectional
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
17
Fiber Scattering Distribution Function) [Zin07], kde vlasy jsou vlastnˇe jen jedn´ım z typ˚ u vl´ aken podobnˇe jako napˇr´ıklad tkanina. Na GPU byl Marschner˚ uv model implementov´an pomoc´ı pˇredpoˇc´ıt´an´ı hodnot modelu pro r˚ uzn´e u ´hly do textury. Poprv´e se tak stalo v demu ,,Nalu” (NVidia 2000) [PF05]. Model je zde ovˇsem zjednoduˇsen: TRT sloˇzka je aproximov´ana pomoc´ı TT a z´akladn´ı barva vˇsech vlasov´ ych vl´ aken je stejn´a, coˇz nen´ı u ´plnˇe realistick´e. Jinou cestou jsou r˚ uzn´e aproximativn´ı modely. Fotorealistick´e osvˇetlovac´ı modely b´ yvaj´ı bohuˇzel pomˇernˇe dost sloˇzit´e a v´ ypoˇcetnˇe n´aroˇcn´e. Proto se nijak zvl´aˇsˇt nehod´ı pro zobraˇ zov´an´ı v re´ aln´em ˇcase na GPU. Casto se tedy pouˇz´ıv´a model Kajiya & Kay, kter´ y je doplnˇen r˚ uzn´ ymi aproximacemi efekt˚ u, kter´e predikuje Marschner. Napˇr´ıklad v demu ,,Ruby: The Double Cross” (ATI 2004) je pouˇzita dif´ uzn´ı a zrcadlov´a sloˇzka Kajiya & Kay a d´ ale je aproximov´ an sekund´arn´ı odraz (TRT) pomoc´ı ˇsumov´e textury [Sch04]. Ve filmu ,,101 Dalmatin˚ u” (101 Dalmatians – Industrial Light and Magic 1996) byl zase Kajiya & Kay model doplnˇen o aproximaci efektu zadn´ıho nasv´ıcen´ı [Gol97]. ´ Upln´ a aproximace vˇsech efekt˚ u Marschnerova modelu je uvedena napˇr´ıklad v [Kan04], bohuˇzel chyb´ı pˇresnˇejˇs´ı srovn´ an´ı s p˚ uvodn´ım modelem, zejm´ena pak efektu zadn´ıho nasv´ıcen´ı vlas˚ u.
18
ˇ ´I MODELY KAPITOLA 3. OSVETLOVAC
ˇ AN ´ ´I MODELU VLASU ˚ KAPITOLA 4. ZJEDNODUSOV
19
4 Zjednoduˇ sov´ an´ı modelu vlas˚ u V kapitole 2 jsem vysvˇetlil, proˇc je zobrazov´an´ı vlas˚ u tak n´aroˇcn´e. Nˇekdy je moˇzn´e pouˇz´ıt zjednoduˇsen´ y model vlas˚ u a t´ım vykreslov´an´ı v´ yznamnˇe urychlit. Napˇr´ıklad pokud je chlupat´ y objekt ve velk´e vzd´ alenosti od kamery. Takov´ y pˇr´ıstup je v poˇc´ıtaˇcov´e grafice zn´am´ y jako u ´roveˇ n detailu LOD (level of detail ). Pokud je model bl´ızko ke kameˇre, pouˇz´ıv´a se detailn´ı model – pokud je naopak d´ ale od kamery, lze pouˇz´ıt model zjednoduˇsen´ y. V t´eto kapitole uvedu nˇekolik technik, kter´e se pouˇz´ıvaj´ı v poˇc´ıtaˇcov´e grafice pro zjednoduˇsov´ an´ı model˚ u. Zamˇeˇr´ım se hlavnˇe na techniky pouˇziteln´e pro probl´em vlas˚ u. Vˇetˇsina existuj´ıc´ıch technik je bohuˇzel urˇcena sp´ıˇse pro klasick´e polygon´aln´ı modely, kter´e se ovˇsem chovaj´ı odliˇsnˇe oproti vlas˚ um.
4.1
Statick´ eu ´ rovnˇ e detailu
Je vytvoˇreno nˇekolik model˚ u, kter´e reprezentuj´ı nˇekolik u ´rovn´ı detailu (tzv. diskr´etn´ı stupnˇe [ZBSF04]). Mezi tˇemito modely se pot´e pˇrep´ın´a podle vzd´alenosti od kamery. Tento pˇr´ıstup je vyuˇzit napˇr´ıklad v jazyce VRML (Virtual Reality Modeling Language) a teoreticky jej lze pouˇz´ıt i pro probl´em zobrazov´ an´ı vlas˚ u. M´a ovˇsem hned nˇekolik nev´ yhod. Mus´ı b´ yt vymodelov´ ano nˇekolik model˚ u, coˇz m˚ uˇze b´ yt pomˇernˇe pracn´e a nav´ıc modely zab´ıraj´ı m´ısto v pamˇeti. Nejvˇetˇs´ı probl´em je pˇrechod mezi dvˇema u ´rovnˇemi detailu, kde ˇcasto doch´ az´ı k vizu´aln´ım artefakt˚ um (tzv. popping effect). To nemus´ı vadit pˇri zobrazov´an´ı v re´aln´em ˇcase, ale v produkˇcn´ım prostˇred´ı to ˇcin´ı tuto metodu nepouˇzitelnou.
4.2
Progresivn´ı modely
Nedostatky pˇredchoz´ı metody odstraˇ nuj´ı spojit´e stupnˇe detailu, napˇr´ıklad progresivn´ı modely (progressive meshes) [Hop96]. Polygon´aln´ı model je vymodelov´an v pln´ ych detailech a pot´e je na nˇej nˇekolikr´ at aplikov´ ana operace kolaps hrany (viz obr´azek 4.1), kter´a je invertibiln´ı. Do souboru se potom ukl´ ad´ a nejv´ıce zjednoduˇsen´a verze modelu a inverze vˇsech proveden´ ych operac´ı. Na z´ akladˇe pozice kamery se dynamicky urˇcuje u ´roveˇ n detailu modelu. Model se proto nemˇen´ı skokovˇe, ale po jednotliv´ ych operac´ıch kolaps hrany.
ecol
vt vl
vl
vr
vs
vr
vs vsplit Obr´ azek 4.1: Kolaps hrany ecol a inverzn´ı operace vsplit. Obr´azek pˇrejat z [Hop96].
Hrany pro operaci kolaps pˇri zjednoduˇsov´an´ı je nutn´e vyb´ırat s ohledem na topologii modelu, vyuˇz´ıvaj´ı se r˚ uzn´e chybov´e metriky [Hop96].
ˇ AN ´ ´I MODELU VLASU ˚ KAPITOLA 4. ZJEDNODUSOV
20
Tato metoda se nijak zvl´ aˇsˇt nehod´ı pro zjednoduˇsov´an´ı vlas˚ u, kde reprezentace vlas˚ u je odliˇsn´a od uzavˇren´ ych polygon´ aln´ıch povrch˚ u.
4.3
Textury
Zjednoduˇsenou geometrii lze reprezentovat pomoc´ı 2D ˇci 3D textur. Pouˇz´ıvaj´ı se napˇr´ıklad impostory ˇci billboardy [ZBSF04]. Obr´ azek (textura), kter´ y reprezentuje sloˇzitou geometrii, je namapov´an na jednoduch´ y polygon, kter´ y se nat´aˇc´ı smˇerem ke kameˇre. Je zde probl´em, kdyˇz se kamera v´ yraznˇe pohybuje nebo je zjednoduˇsovan´ y model animovan´ y. Tyto metody maj´ı pouˇzit´ı sp´ıˇse pˇri zobrazov´ an´ı v re´ aln´em ˇcase. Ve filmu ,,101 Dalmatin˚ u” (101 Dalmatians – Industrial Light and Magic 1996) byl pouˇzit pravdˇepodobnostn´ı model pro reprezentaci chlup˚ u nˇekter´ ych dalmatin˚ u d´ale od kamery [Gol97]. Metoda tak nepracuje se skuteˇcnou geometri´ı, ale chlupy jsou reprezentov´any texturou, kter´a je nanesena na trojrozmˇern´ y polygon´ aln´ı model. Kromˇe pouˇzit´ı textur je moˇzn´e srst vytv´aˇret procedur´alnˇe aˇz pˇri vykreslov´ an´ı modelu (napˇr´ıklad ve st´ınovac´ım programu). Do textur se ukl´ adaj´ı r˚ uzn´e parametry, kter´e jsou potˇrebn´e pro v´ ypoˇcet osvˇetlen´ı (napˇr´ıklad tangenty, hustota chlup˚ u, velikost dif´ uzn´ı sloˇzky, atd.). Pr˚ uhlednost i st´ıny (self-shadows) chlup˚ u jsou aproximov´ any tak´e na z´ akladˇe hodnot uloˇzen´ ych v textuˇre. Reprezentace chlup˚ u je tak silnˇe prov´ az´ ana s pouˇzit´ ym osvˇetlovac´ım modelem. Nev´ yhodou techniky je omezenost na velmi kr´atk´e chlupy a vykreslovan´ y objekt mus´ı b´ yt v pomˇernˇe velk´e vzd´ alenosti od kamery – pˇri bliˇzˇs´ıch pohledech je totiˇz pouˇzita stejn´a reprezentace (nejedn´a se o u ´rovnˇe detailu). Dalˇs´ı moˇznost´ı je vyuˇz´ıt 3D-volumetrick´e textury, kdy chlupy jsou uloˇzeny v 3D textuˇre. Tyto metody b´ yvaj´ı ovˇsem pamˇeˇtovˇe velmi n´aroˇcn´e, d´ıky nutnosti ukl´adat detailn´ı voxelovou reprezentaci chlup˚ u [CHPR07]. Tak´e animace chlup˚ u zde b´ yv´a problematick´a. Prvn´ı pouˇzit´ı volumetrick´ ych textur navrhl uˇz Kajiya & Kay v ˇcl´anku [KK89]. Model byl d´ale rozˇs´ıˇren o moˇznost pˇredfiltrov´ an´ı textur (mip-mapping) a jednoduch´e animace na u ´rovni volumetrick´ ych textur [Ney98].
4.4
Stochastick´ a simplifikace
Idea stochastick´e simplifikace je velmi jednoduch´a. Mˇejme mnoˇzinu vlas˚ u, z n´ıˇz n´ahodnˇe vybereme ˇc´ast vlas˚ u, kter´e budou vylouˇceny (nevykresleny). Ostatn´ı vlasy budou zobrazeny. Aby se nezmˇenila plocha modelu vlas˚ u, je nutn´e upravit (zvˇetˇsit) pr˚ umˇer vykreslovan´ ych vlas˚ u. Statistick´e vlastnosti sc´eny tak z˚ ust´ avaj´ı zachov´any. Tento postup jsem se rozhodl realizovat, protoˇze oproti ostatn´ım m´a nˇekolik v´ yhod: • Pouˇzitelnost na kr´ atk´e i delˇs´ı chlupy (vlasy) ´ • Urovnˇ e detailu (LOD) • Spojit´ y pˇrechod mezi u ´rovnˇemi detailu • Jednoduch´ y algoritmus Nyn´ı n´asleduje struˇcn´ y popis t´eto metody, detaily viz [CHPR07]. Aby algoritmus fungoval, je nutn´e zohlednit pˇet aspekt˚ u: Urˇ cen´ı u ´ rovnˇ e detailu. Urˇcen´ı poˇctu vlas˚ u, kter´e je tˇreba vylouˇcit.
ˇ AN ´ ´I MODELU VLASU ˚ KAPITOLA 4. ZJEDNODUSOV
21
Priorita vykreslov´ an´ı. Urˇcen´ı poˇrad´ı, ve kter´em se vlasy vyluˇcuj´ı. ´ Zachov´ an´ı povrchu. Uprava pr˚ umˇeru vlas˚ u, aby v´ ysledn´a plocha byla stejn´a. ´ Zachov´ an´ı kontrastu. Uprava barvy vlas˚ u, aby v´ ysledn´ y kontrast byl stejn´ y. Plynul´ a animace. Plynul´e mizen´ı vlas˚ u pˇri animaci m´ısto skokov´eho. V´ ysledky implementace jsou uvedeny v ˇc´asti 7.2. 4.4.1
Urˇ cen´ı u ´ rovnˇ e detailu
Pro kaˇzd´ y vykreslovan´ y model je nutn´e urˇcit u ´roveˇ n detailu (0 aˇz 1 – pln´ y detail). Lze zohlednit mnoho aspekt˚ u, napˇr´ıklad vzd´ alenost od kamery, rozostˇren´ı pohybem (motion blur ), hloubku ostrosti (depth of field ), atd. Nejd˚ uleˇzitˇejˇs´ı je vzd´alenost od kamery. Kaˇzd´ y vykreslovan´ y objekt m´ a svoji hraniˇcn´ı ob´alku (bounding box ). Velikost simplifikace ˇ ım menˇs´ı bude z´aviset na aktu´ aln´ım poˇctu pixel˚ u B – ob´alky viditeln´ ych pˇri vykreslov´an´ı. C´ poˇcet pixel˚ u ob´ alka zab´ır´ a, t´ım v´ıce m˚ uˇze b´ yt model zjednoduˇsen. B0 oznaˇcme jako poˇcet pixel˚ u ob´ alky, kde zjednoduˇsov´ an´ı zaˇc´ın´a. Pˇri poˇctu pixel˚ u hB0 je poˇcet vykreslovan´ ych vlas˚ u poloviˇcn´ı. Parametry B0 a h jsou uˇzivatelsky nastaviteln´e. Jestliˇze b = B/B0 , pak pro b < 1 plat´ı: λ = blogh (1/2)
(4.1)
Pokud je b > 1, pak je λ = 1 (ˇz´ adn´ a simplifikace). Parametr B0 tedy urˇcuje, kde simplifikace zaˇc´ın´a (tj. vyˇsˇs´ı ˇc´ıslo – dˇr´ıvˇejˇs´ı simplifikace) a parametr h ∈ (0, 0.5i urˇcuje tvar kˇrivky v z´avislosti na b (viz obr´azek 4.2). Pro h = 0.5 se rovnice (4.1) redukuje na λ = b a simplifikace je line´arn´ı funkc´ı pomˇeru poˇctu pixel˚ u b. Parametr h tedy urˇcuje, jak agresivn´ı je zjednoduˇsov´an´ı pˇri oddalov´an´ı modelu. Volba niˇzˇs´ı hodnoty h znamen´ a pomalejˇs´ı zjednoduˇsov´an´ı ze zaˇc´atku a naopak – pokud je model ve velk´e vzd´ alenosti, zjednoduˇsov´ an´ı je velmi agresivn´ı. ! 1 0.75
h=0.5 h=0.4 h=0.3 h=0.2 h=0.1
0.5 0.25
b
0 0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Obr´ azek 4.2: λ jako funkce b pro r˚ uzn´e hodnoty h. Obr´azek pˇrejat z [CHPR07].
4.4.2
Priorita vykreslov´ an´ı
Odstraˇ nov´ an´ı vlas˚ u pˇri animaci mus´ı b´ yt n´ahodn´e, nesm´ı z´aviset na geometrick´e pozici ˇci jin´e charakteristice, jinak by mohlo doch´azet pˇri animaci k neˇz´adouc´ım artefakt˚ um.
ˇ AN ´ ´I MODELU VLASU ˚ KAPITOLA 4. ZJEDNODUSOV
22
Jak jsme zm´ınil v kapitole 2, vlasy se generuj´ı na n´ahodn´ ych pozic´ıch (dle hustoty) interpolac´ı vymodelovan´ ych ˇr´ıd´ıc´ıch vlas˚ u. Pro simplifikaˇcn´ı algoritmus je vhodn´e uloˇzit vˇsechny vytvoˇren´e vlasy v n´ahodn´em poˇrad´ı. Vykreslovac´ı program si pot´e naˇcte pouze ty vlasy, kter´e skuteˇcnˇe potˇrebuje. S n´ahodn´ ym poˇrad´ım je tedy vhodn´e poˇc´ıtat uˇz ve f´azi modelov´an´ı. Vlasy jsou vlastnˇe seˇrazeny v pomysln´e prioritn´ı frontˇe, ze kter´e se vyb´ıraj´ı pˇri vykreslov´an´ı v z´avislosti na velikosti simplifikace.
4.4.3
Zachov´ an´ı povrchu
Pokud zmenˇs´ıme poˇcet vlas˚ u, dojde pˇri vykreslov´an´ı k efekt˚ u ˇr´ıdnut´ı vlas˚ u, zvl´aˇsˇt pro velk´e hodnoty simplifikace. Proto je nutn´e upravovat pr˚ umˇer (ˇs´ıˇrku) vlas˚ u v z´avislosti na velikosti simplifikace. Lze pouˇz´ıt aproximativn´ı vzorec: (4.2)
s = 1/λ
Touto hodnotou staˇc´ı vyn´ asobit ˇs´ıˇrku kaˇzd´eho vlasu. Jednoduˇse ˇreˇceno: pokud vykreslujeme poloviˇcn´ı poˇcet vlas˚ u (λ = 0.5), potom mus´ıme zvˇetˇsit ˇs´ıˇrku kaˇzd´eho vlasu dvakr´at (s = 2). Uveden´ y vzorec funguje dobˇre, pokud simplifikace nen´ı pˇr´ıliˇs agresivn´ı (je zobrazeno v´ıce neˇz 10% chlup˚ u) [CHPR07]. Pˇr´ıliˇs velk´e zjednoduˇsov´an´ı proto nen´ı vhodn´e. Na obr´azku 4.3 je zobrazena hodnota s v z´avislosti na x, kde x je pozice vlasu v prioritn´ı frontˇe (0 aˇz 1). ! =.95 ! =.90 !=.70 ! =.50 ! =.30 ! =.10
s 4 3 2 1
x
0 0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Obr´azek 4.3: Pro menˇs´ı hodnoty λ je vylouˇceno v´ıce element˚ u a plocha vykreslovan´ ych element˚ u mus´ı b´ yt v´ıce zvˇetˇsena. Obr´ azek pˇrejat z [CHPR07].
4.4.4
Zachov´ an´ı kontrastu
Vzorkov´an´ı pixelu pˇri vykreslov´ an´ı v´ıce vzorky sniˇzuje rozptyl. Odstraˇ nov´an´ı element˚ u naopak vede ke zv´ yˇsen´ı rozptylu (tedy kontrastu), pˇr´ıklad je na obr´azku 4.4. Probl´em se d´a ˇreˇsit sn´ıˇzen´ım rozptylu barev, kter´e se pouˇz´ıvaj´ı pˇri st´ınov´an´ı. To je moˇzn´e prov´est napˇr´ıklad filtrov´ an´ım textur s barvami vlas˚ u pˇri vˇetˇs´ı simplifikaci. Simplifikace zde m˚ uˇze m´ıt pˇresto zniˇcuj´ıc´ı efekt na r˚ uzn´e ostr´e odlesky vytvoˇren´e d´ıky osvˇetlovac´ımu modelu. Vizu´alnˇe se probl´em kontrastu projevuje pˇri velmi velk´ ych simplifikac´ıch (je zobrazeno m´enˇe neˇz 10% element˚ u) a pouˇzit´ı hodnˇe kontrastn´ıch barev. V re´aln´ ych sc´en´ach v chlupech pˇr´ıliˇs ostr´e barevn´e pˇrechody neb´ yvaj´ı. Nejlepˇs´ı obranou proti zmˇenˇe kontrastu je nepˇripouˇstˇet pˇr´ıliˇs velk´e hodnoty simplifikace. V´ıce o tomto probl´emu viz [CHPR07].
ˇ AN ´ ´I MODELU VLASU ˚ KAPITOLA 4. ZJEDNODUSOV
23
Obr´azek 4.4: Pˇr´ıklad probl´emu zmˇeny kontrastu. Detailn´ı geometrie je vlevo nahoˇre, zjednoduˇsen´ a vpravo. Troj´ uheln´ıky jsou obarveny n´ahodnˇe dvˇema barvami, ˇctverce jsou pixely a teˇcky oznaˇcuj´ı vzorky. Obr´ azky dole ukazuj´ı v´ yslednou barvu pixel˚ u. Zjednoduˇsen´a verze m´a vˇetˇs´ı kontrast, protoˇze je pr˚ umˇerov´ano m´enˇe troj´ uheln´ık˚ u. Obr´azek pˇrejat z [CHPR07].
4.4.5
Plynul´ a animace
Velikost simplifikace se samozˇrejmˇe mˇen´ı s animac´ı dan´eho objektu. Je proto nutn´e, aby vlasy nemizely skokovˇe, ale postupnˇe. To lze zaˇr´ıdit vytvoˇren´ım urˇcit´e pˇrechodov´e z´ony, kdy se nˇekter´e vlasy postupnˇe zuˇzuj´ı, aˇz u ´plnˇe zmiz´ı. Na obr´azku 4.5 je uk´ azka tohoto pˇr´ıstupu s pˇrechodovou z´onou o velikosti t = 10% (na obˇe strany). Nˇekter´e vlasy tak nemaj´ı pr˚ umˇer zvˇetˇsen´ y pomoc´ı s = 1/λ, ale o hodnotu menˇs´ı (dle pozice v prioritn´ı frontˇe). Vˇsimnˇete si, ˇze plocha pod kaˇzdou kˇrivkou je stejn´a jako bez pouˇzit´ı pˇrechod˚ u (srovnejte obr´ azek 4.3 s 4.5). ! =.95 ! =.90 ! =.70 ! =.50 ! =.30 ! =.10
s 4 3 2 1
x
0 0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Obr´azek 4.5: Velikost vlas˚ u se sniˇzuje plynule, plocha pod kˇrivkami je stejn´a jako na obr´ azku 4.3. Obr´azek pˇrejat z [CHPR07].
Pˇri implementaci plynul´e animace je nutn´e pamatovat na hraniˇcn´ı pˇr´ıpady, kter´e se mohou liˇsit v n´asleduj´ıc´ıch parametrech: • te – Skuteˇcn´ a velikost pˇrechodov´e z´ony (nepˇresahuj´ıc´ı interval h0, 1i v prioritn´ı frontˇe) • smax – Maxim´ aln´ı zvˇetˇsen´ı plochy (odpov´ıd´a hodnotˇe v x = 0) • smin – Minim´ aln´ı zvˇetˇsen´ı plochy (odpov´ıd´a hodnotˇe v x = 1) Je-li λ−t < 0, potom je simplifikace vˇetˇs´ı neˇz pˇrechodov´a z´ona. Na obr´azku 4.5 by to odpov´ıdalo hodnot´am λ < 0.1.
ˇ AN ´ ´I MODELU VLASU ˚ KAPITOLA 4. ZJEDNODUSOV
24
Je-li λ + t > 1, potom je simplifikace pˇr´ıliˇs mal´a. Na obr´azku 4.5 by to odpov´ıdalo hodnot´am λ > 0.9. Ostatn´ı pˇr´ıpady se nach´ az´ı mezi tˇemito dvˇema hranicemi. Na obr´azku 4.5 by to odpov´ıdalo hodnot´am λ ∈ h0.1, 0.9i.
te =
λ
pokud λ − t < 0 1 − λ pokud λ + t > 1 t pokud λ − t ≥ 0 ∧ λ + t ≤ 1 (
smax = (
smin =
1/λ 1 1−t2e /t
pokud λ + t ≤ 1 pokud λ + t > 1
0 pokud λ + t ≤ 1 smax (1 − te /t) pokud λ + t > 1
(4.3)
(4.4)
(4.5)
Skuteˇcn´a hodnota u ´pravy pr˚ umˇeru vlasu s se urˇc´ı dle pozice v prioritn´ı frontˇe x pomoc´ı line´arn´ı interpolace: s = smin + (smax − smin ) · i(x)
(4.6)
Parametr i(x) z´ avis´ı na pozici elementu v prioritn´ı frontˇe:
i(x) =
1
0
λ+te −x 2te
pokud x ≤ λ − te (pln´e zvˇetˇsen´ı) pokud x ≥ λ + te (minim´aln´ı zvˇetˇsen´ı) pokud x > λ − te ∧ x < λ + te (pˇrechodov´a z´ona)
(4.7)
ˇ ´I PROSTRED ˇ ´I KAPITOLA 5. PRODUKCN
25
5 Produkˇ cn´ı prostˇ red´ı Implementace je urˇcena pro produkˇcn´ı prostˇred´ı, kde se samozˇrejmˇe pouˇz´ıvaj´ı technologie typick´e pro toto odvˇetv´ı. Pro tvorbu 3D grafiky (modelov´an´ı, animace, nasv´ıcen´ı) slouˇz´ı grafick´e editory jako napˇr´ıklad Autodesk Maya, Softimage XSI nebo 3D Studio MAX. Zobrazov´ an´ı prob´ıh´a ve vykreslovac´ıch programech (rendererech) standardu RenderMan jako napˇr´ıklad 3Delight, PRMan nebo Pixie. Grafick´e studio je samozˇrejmˇe jiˇz zvykl´e na nˇekter´e n´astroje a pouˇz´ıv´a osvˇedˇcen´e postupy pro tvorbu grafiky. To je nutn´e respektovat pˇri volbˇe prostˇred´ı pro implementaci. Programov´e vybaven´ı pouˇz´ıvan´e ve studiu UPP pro modelov´an´ı a vykreslov´an´ı vlas˚ u/chlup˚ u: Autodesk Maya – Program pro tvorbu 3D grafiky. http://www.autodesk.com/maya/ Joe Alter Shave and a Haircut – Z´asuvn´ y model do Mayi pro modelov´an´ı vlas˚ u a chlup˚ u, d´ale jen Shave. http://www.joealter.com/ 3Delight RenderMan – Vykreslovac´ı program dle specifikace RenderMan [Pix05]. http://www.3delight.com/
5.1
Autodesk Maya
Maya je jedn´ım z mnoha program˚ u pro tvorbu 3D grafiky a animace. V t´eto aplikaci je vymodelov´ana a nasv´ıcena cel´ a sc´ena vˇcetnˇe vlas˚ u. Vykreslov´an´ı zpravidla prob´ıh´a v extern´ım rendereru, kter´ y b´ yv´ a ˇcasto integrov´ an do rozhran´ı grafick´eho editoru. ym zp˚ usobem Architektura programu Maya je naznaˇcena na obr´azku 5.1. Jakmile uˇzivatel nˇejak´ pracuje s uˇzivatelsk´ ym rozhran´ım (napˇr. vytvoˇren´ı ˇci modifikace geometrick´ ych objekt˚ u), Maya pro kaˇzdou akci generuje MEL (Maya Embedded Language) pˇr´ıkazy, kter´e lze zad´ avat i samostatnˇe do pˇr´ıkazov´e ˇr´ adky v Maye. Tyto pˇr´ıkazy jsou teprve interpretov´any a vˇetˇsina z nich operuje nad grafem sc´eny DG (dependency graph), kter´ y vlastnˇe pˇredstavuje celou sc´enu (vˇsechny 3D objekty, materi´ aly, animace, atd.). DG je tvoˇren uzly, kter´e obsahuj´ı data i operace. Data b´ yvaj´ı uloˇzena v podobˇe atribut˚ u, kter´e je moˇzn´e nastavovat prostˇrednictv´ım uˇzivatelsk´eho rozhran´ı (resp. pˇr´ıkaz˚ u MEL). Typick´ ym uzlem DG je napˇr´ıklad geometrick´ y objekt. Jedn´ım z moˇzn´ ych rozˇs´ıˇren´ı Mayi jsou r˚ uzn´e uˇzivatelsk´e MEL skripty, kter´e se vyuˇz´ıvaj´ı pro automatizaci ˇcasto opakovan´ ych ˇcinnost´ı. MEL je tak´e moˇzn´e pouˇz´ıt pro vytvoˇren´ı nebo u ´pravu grafick´eho rozhran´ı editoru. Maya d´ale obsahuje C++ API, pomoc´ı kter´eho je moˇzn´e vytv´aˇret z´asuvn´e moduly. V t´eto pr´aci bude potˇreba vyrobit z´ asuvn´ y modul, kter´ y vytvoˇr´ı nov´ y: DG uzel – Uzly pˇredstavuj´ı z´ akladn´ı stavebn´ı kameny DG. Kromˇe obecn´ ych uzl˚ u je moˇzn´e vytv´ aˇret i specializovan´e uzly (napˇr´ıklad nov´a geometrick´a primitiva). Velkou v´ yhodou je, ˇze Maya sama automaticky zajist´ı uloˇzen´ı/naˇcten´ı nov´ ych uzl˚ u do/z souboru spolu s celou sc´enou v podobˇe DG. V´ıce v ˇc´asti 6.2.5. MEL pˇ r´ıkaz – Novˇe vytvoˇren´e pˇr´ıkazy je moˇzn´e volat z pˇr´ıkazov´e ˇr´adky ˇci skript˚ u. Chovaj´ı se identicky jako vestavˇen´e pˇr´ıkazy. V´ıce v ˇc´asti 6.2.4.
ˇ ´I PROSTRED ˇ ´I KAPITOLA 5. PRODUKCN
26
Obr´ azek 5.1: Zjednoduˇsen´a architektura editoru Maya.
5.2
Shave and a Haircut
Pro tvorbu vlas˚ u resp. chlup˚ u v Maye standardnˇe slouˇz´ı n´astroje Maya Hair resp. Maya Fur. V produkci se ˇcasto pouˇz´ıv´ a pro modelov´ an´ı vlas˚ u z´asuvn´ y modul Shave and a Haircut od Joe y m´ a oproti standardn´ım n´astroj˚ um pˇr´ıtomn´ ych v Maye Altera (uk´azka na obr´ azku 5.2), kter´ nˇekolik v´ yhod: • Uˇzivatelsky pˇr´ıvˇetivˇejˇs´ı modelov´ an´ı vlas˚ u (napˇr´ıklad moˇznosti ˇces´an´ı). • Stejn´e rozhran´ı pro chlupy i vlasy. • Podpora exportu vlas˚ u do souboru RIB, kter´ y pouˇz´ıv´a RenderMan. • Shave je zabudov´ an i v dalˇs´ıch grafick´ ych editorech – Softimage XSI a 3D Studio MAX.
Obr´ azek 5.2: Uk´ azka z aplikace Maya a n´astroje Shave and a Haircut.
Shave m´a i vlastn´ı API SDK, kter´e ale obsahuje velk´e mnoˇzstv´ı chyb a m´a omezen´e pouˇzit´ı. Umoˇzn ˇuje totiˇz operovat jen nad vygenerovan´ ymi vlasy nikoliv nad ˇr´ıd´ıc´ımi.
ˇ ´I PROSTRED ˇ ´I KAPITOLA 5. PRODUKCN
27
D˚ uleˇzit´a je podpora exportu vlas˚ u do RIBu pomoc´ı pˇr´ıkazu MEL: shaveWriteRib [flags] "ribFilename" Kde • ribFilename je jm´eno souboru do kter´eho se zap´ıˇs´ı vˇsechny vlasy. • flags jsou r˚ uzn´e parametry [Alt08], kter´e lze nastavit i prostˇrednictv´ım grafick´eho rozhran´ı Shave. Tento pˇr´ıkaz vytvoˇr´ı spoleˇcn´ y soubor RIB pro vˇsechny instance vlas˚ u Shave ve sc´enˇe. Pro pouˇzit´ı r˚ uzn´ ych druh˚ u vlas˚ u v jedn´e sc´enˇe je nutn´e modelovat vlasy (generovat RIB) oddˇelenˇe. Vlasy jsou v Shave generov´ any na n´ahodn´ ych m´ıstech polygon´aln´ı geometrie a ukl´ad´any jsou do souboru RIB samozˇrejmˇe tak´e v n´ahodn´em poˇrad´ı, coˇz je pro simplifikaˇcn´ı algoritmus velmi pˇr´ızniv´a okolnost. Shave um´ı generovat vlasy i do tzv. voxel˚ u. Nevznik´a tak pouze jeden soubor RIB, ale hned nˇekolik soubor˚ u. Je vytvoˇren hlavn´ı RIB, kter´ y obsahuje odkazy na soubory RIB jednotliv´ ych voxel˚ u. Vlasy (geometrie) jsou potom obsaˇzeny v RIBech voxelu, kaˇzd´e vl´akno patˇr´ı pr´avˇe do jednoho voxelu. V´ yhodou tohoto pˇr´ıstupu je sn´ıˇzen´ı pamˇeti pˇri vykreslov´an´ı, protoˇze vlasy se naˇc´ıtaj´ı a zobrazuj´ı postupnˇe. V´ıce o vlasech ve form´atu RIB v ˇc´asti 6.2.1. Voxel zde nen´ı u ´plnˇe spr´ avn´ y term´ın, protoˇze ve skuteˇcnosti jde o pˇrekr´ yvaj´ıc´ı se AABB (AxisAligned Bounding Box ). Nicm´enˇe jedn´a se o zavedenou terminologii Shave, kter´e se i j´a budu v dalˇs´ım textu drˇzet.
5.3
3Delight RenderMan
Pro vykreslov´ an´ı se v produkˇcn´ım prostˇred´ı t´emˇeˇr v´ yluˇcnˇe pouˇz´ıv´a renderer standardu RenderMan. RenderMan je vlastnˇe technick´a specifikace pro interakci mezi modelovac´ım a vykreslovac´ım programem. Prvn´ı zm´ınka o RenderMan je z roku 1988, kdy byl vyvinut v Pixar Animation Studios [CCC87]. Od t´e doby byl samozˇrejmˇe RenderMan zdokonalen, z´akladn´ı idea z˚ ust´av´a st´ ale stejn´ a. Pro vykreslov´an´ı je zpravidla pouˇzit algoritmus reyes (pops´an v ˇc´ asti 2.3.3), lze pouˇz´ıt i ray tracing a glob´aln´ı osvˇetlen´ı. Existuje mnoho r˚ uzn´ ych implementac´ı, mezi nejzn´amˇejˇs´ı renderery patˇr´ı: PRMan – PhotoRealistic RenderMan je asi nejzn´amˇejˇs´ı komerˇcn´ı renderer vytvoˇren´ y v Pixar Animation Studios, jedn´ a se pravdˇepodobnˇe o nejpouˇz´ıvanˇejˇs´ı vykreslovac´ı program. PRMan je moˇzn´e integrovat do editoru Maya. Nev´ yhodou PRMan m˚ uˇze b´ yt vysok´ a poˇrizovac´ı cena. https://renderman.pixar.com/ 3Delight RenderMan – 3Delight je tak´e komerˇcn´ı renderer (od spoleˇcnosti dna research), ale za mnohem niˇzˇs´ı cenu. Licence na jedno PC bez technick´e podpory je dokonce k dispozici zdarma. 3Delight je moˇzn´e integrovat do editoru Maya a XSI. http://www.3delight.com/ Pixie – Nejzn´ amˇejˇs´ı open source renderer, kter´ y ovˇsem v souˇcasn´e verzi nen´ı moˇzn´e integrovat do ˇz´ adn´eho z grafick´ ych editor˚ u. http://www.renderpixie.com/
ˇ ´I PROSTRED ˇ ´I KAPITOLA 5. PRODUKCN
28
ˇ prostˇrednictv´ım RI API Grafick´e editory mohou s vykreslovac´ım programem komunikovat bud (RenderMan Interface) nebo soubor˚ u RIB. Obˇe formy jsou z hlediska funkce ekvivalentn´ı. Renderer totiˇz interpretuje soubor RIB pr´avˇe pomoc´ı pˇr´ıkaz˚ u RI API. Uk´azka jednoduch´eho RIBu a odpov´ıdaj´ıc´ıch vol´an´ı RI API v C++: Format 1024 1024 1 Projection "perspective" "fov" 45
WorldBegin Color 1 1 1 LightSource "distantlight" Surface "matte" Translate 0 0 3 Sphere 1 -1 1 360 WorldEnd
RiFormat(1024, 1024, 1); RtFloat fov = 45; RiProjection(RI_PERSPECTIVE, "fov", &fov, RI_NULL); RiWorldBegin(); RtColor white = {1,1,1}; RiColor(white); RiLightSource("distantlight", RI_NULL); RiSurface("matte", RI_NULL); RiTranslate(0, 0, 3); RiSphere(1, -1, 1, 360, RI_NULL); RiWorldEnd();
Uveden´ y pˇr´ıklad je velmi jednoduch´ y (v´ yznam jednotliv´ ych pˇr´ıkaz˚ u viz [Pix05]) – po vykreslen´ı se zobraz´ı koule (obr´ azek 5.3).
Obr´ azek 5.3: Koule vykreslen´a pomoc´ı 3Delight RenderMan. 3Delight RenderMan lze integrovat do grafick´eho editoru Maya. Pˇri spuˇstˇen´ı vykreslov´an´ı je cel´a sc´ena (geometrie, svˇetla, materi´ aly, . . . ) z Mayi posl´ana do vykreslovac´ıho programu prostˇrednictv´ım RI API. V´ yjimku tvoˇr´ı pr´avˇe vlasy vytvoˇren´e extern´ım z´asuvn´ ym modulem Shave. Ty je nutn´e vyexportovat do form´ atu RIB (viz v´ yˇse). Vykreslovac´ı programy standardu RenderMan je moˇzn´e rozˇsiˇrovat zejm´ena pomoc´ı st´ınovac´ıch program˚ u (shaders), novˇe je podporov´ ana i modifikace zobrazovac´ıho ˇretˇezce prostˇrednictv´ım procedur´aln´ıch primitiv. Pod´ıvejme se nyn´ı na tyto moˇznosti rozˇsiˇrov´an´ı bl´ıˇze. 5.3.1
St´ınovac´ı programy
Vytv´aˇren´ı fotorealistick´ ych obr´ azk˚ u vyˇzaduje specifikaci materi´al˚ u a vlastnost´ı osvˇetlen´ı. RenderMan pro tvorbu uˇzivatelsk´ ych materi´al˚ u obsahuje vlastn´ı jazyk RSL (RenderMan Shading Language), kter´ y vych´ az´ı z jazyka C. RenderMan podporuje nˇekolik typ˚ u uˇzivatelsk´ ych st´ınovac´ıch program˚ u: Surface shaders – Nejpouˇz´ıvanˇejˇs´ı ze vˇsech typ˚ u. Pouˇz´ıvaj´ı se k implementaci r˚ uzn´ ych druh˚ u materi´al˚ u aplikuj´ı se na vˇsechna geometrick´a primitiva. V´ıce v ˇc´asti 6.4.
ˇ ´I PROSTRED ˇ ´I KAPITOLA 5. PRODUKCN
29
Light source shaders – Aplikuj´ı se na zdroje svˇetla a upravuj´ı napˇr´ıklad rozdˇelen´ı vyzaˇrovan´e intenzity v z´ avislosti na smˇeru. Displacement shaders – Slouˇz´ı k modifikac´ı bod˚ u povrchu, pouˇz´ıvaj´ı se napˇr´ıklad pro vytv´ aˇren´ı hrbol˚ u (bumps). Volume shaders – Upravuj´ı barvu paprsku pˇri pr˚ uchodu objemem (atmosf´era). Imager shaders – Aplikuj´ı se na pixely pˇred v´ ystupem do koneˇcn´eho obr´azku. V 3Delight for maya (integrace 3Delight RenderMan do editoru Maya) jsou prostˇrednictv´ım pˇripraven´ ych st´ınovac´ıch program˚ u standardnˇe podporov´any materi´aly vytv´aˇren´e v hyper st´ınovaˇci (hypershade) v Maye. D´ale je moˇzn´e pouˇz´ıvat i klasick´e st´ınovac´ı programy pro RenderMan napsan´e v RSL. 5.3.2
Procedur´ aln´ı primitiva
Pro dalˇs´ı rozˇsiˇrov´ an´ı moˇznost´ı RenderMan bylo nutn´e umoˇznit vˇetˇs´ı modifikace zobrazovac´ıho ˇretˇezce. Proto byl v roce 1997 standard obohacen o moˇznost zpoˇzdˇen´eho naˇc´ıt´an´ı (delayed read archive) soubor˚ u RIB aˇz pˇri vykreslov´an´ı [Pix97]. D´ale lze pouˇz´ıvat procedur´aln´ı primitiva – dynamicky sd´ılen´e objekty DSO (Dynamic Shared Object) [Pix97], kdy renderer pˇri vykreslov´ an´ı vol´ a uˇzivatelsky vytvoˇrenou knihovnu. V´ yhodou zpoˇzdˇen´eho naˇc´ıt´ an´ı je, ˇze RIB je naˇcten (vykreslen) pouze tehdy, kdyˇz je hraniˇcn´ı ob´alka objektu ve viditeln´e oblasti. T´ım se zpoˇzdˇen´e naˇc´ıt´an´ı liˇs´ı od pˇr´ıkazu RiReadArchive, kter´ y naˇcte soubor RIB ihned. Napˇr´ıklad pˇr´ıkaz Procedural "DelayedReadArchive" [ "file.rib" ] [ -1 1 -1 1 0 6 ] zp˚ usob´ı naˇcten´ı souboru file.rib pokud je hraniˇcn´ı ob´alka (zde [ -1 1 -1 1 0 6 ]) pˇri vykreslov´ an´ı ve viditeln´e oblasti. V´ıce moˇznost´ı nab´ızej´ı DSO, jejichˇz tvorba je z´avisl´a na pouˇzit´em vykreslovac´ım programu. Je nutn´e pouˇz´ıt jazyk C/C++ a pˇr´ısluˇsn´e hlaviˇckov´e soubory a knihovny implementace rendereru. Renderer po v´ yskytu pˇr´ıkazu RiProcedural s parametrem DynamicLoad tak pˇri vykreslov´ an´ı vol´a DSO. Napˇr´ıklad pˇr´ıkaz Procedural "DynamicLoad" [ "furProc.dll" "1.0" ] [ -1 1 -1 1 0 6 ] zp˚ usob´ı, ˇze renderer pˇri vykreslov´ an´ı zavol´a furProc.dll a t´eto knihovnˇe pˇred´a parametry (v tomto pˇr´ıpadˇe hodnotu 1.0). Vol´ an´ı se opˇet uskuteˇcn´ı pouze, pokud je ob´alka pˇri vykreslov´ an´ı ve viditeln´e oblasti. V´ yhodn´e je, ˇze RenderMan kromˇe parametr˚ u specifikovan´ ych v RIBu pˇred´ a do DSO i poˇcet viditeln´ ych pixel˚ u ob´alky, coˇz lze vyuˇz´ıt pr´avˇe pˇri implementaci simplifikace. V´ıce o programov´ an´ı DSO v ˇc´ asti 6.3.1. 5.3.3
Podm´ınˇ en´ e v´ yrazy
Od roku 2001 je moˇzn´e v souboru RIB pouˇz´ıvat podm´ınˇen´e v´ yrazy a t´ım vˇetvit naˇc´ıt´an´ı RIBu. Umoˇzn ˇuj´ı to pˇr´ıkazy RiIfBegin, RiElseIf, RiElse a RiIfEnd. V podm´ınce lze pouˇz´ıvat r˚ uzn´e relace pro porovn´av´an´ı, uˇzivatelsk´e atributy nebo stavov´e promˇenn´e rendereru. Pˇr´ıklad pouˇzit´ı podm´ınky v RIBu: Attribute "user" "string renderpass" ["shadow"]
ˇ ´I PROSTRED ˇ ´I KAPITOLA 5. PRODUKCN
30
IfBegin "$user:renderpass == ’shadow’" Surface "null" Else Surface "matte" IfEnd
Podle nastaven´eho atributu renderpass (pomoc´ı pˇr´ıkazu RiAttribute) se v tomto pˇr´ıkladˇe zvol´ı st´ınovac´ı program. Nev´ yhodou je urˇcit´a omezenost testovan´ ych hodnot, napˇr´ıklad mus´ıme y stavov´ y atribut, sami zajistit nastaven´ı atributu renderpass. Specifikace [Pix05] totiˇz ˇz´adn´ kter´ y by oznaˇcoval typ pr˚ uchodu, neobsahuje (v´ıce o tomto probl´emu v ˇc´asti 6.2.2). 5.3.4
Dalˇ s´ı rozˇ s´ıˇ ren´ı
RenderMan je samozˇrejmˇe neust´ ale rozˇsiˇrov´an o nov´e moˇznosti uˇzivatelsk´ ych u ´prav zobrazovac´ıho ˇretˇezce. Dalˇs´ı modifikace pˇrin´ aˇsej´ı RI Filters, kdy lze filtrovat (upravovat) obsah RIBu tˇesnˇe pˇred vykreslov´ an´ım. V tomto textu jsem se soustˇredil jen na vˇeci potˇrebn´e pro implementaci simplifikace. V´ıce o zobrazovac´ım ˇretˇezci a moˇznostech modifikace napˇr´ıklad v [Bat03].
5.4
Tvorba a vykreslov´ an´ı vlas˚ u
Shave i 3Delight jsou integrov´ any do grafick´eho editoru Maya a ovl´adaj´ı se prostˇrednictv´ım rozhran´ı tohoto programu. Zat´ımco Shave je n´astroj, kter´ y cel´ y funguje v r´amci Mayi, tak 3Delight je samostatn´ a aplikace, kterou lze pouˇz´ıt pro vykreslov´an´ı i mimo Mayu. V r´amci produkce se samozˇrejmˇe pro konfiguraci vykreslovac´ıho programu vyuˇz´ıv´a grafick´e rozhran´ı, kter´e je dostupn´e v Maye. Jak tedy n´astroje spolupracuj´ı ve standardn´ım produkˇcn´ım ˇretˇezci pro vykreslov´an´ı vlas˚ u? Nejprve je nutn´e vytvoˇrit model vlas˚ u v Maye pomoc´ı Shave [Alt08]. Z vymodelovan´ ych vlas˚ u se pˇr´ıkazem shaveWriteRib vytvoˇr´ı soubor RIB (resp. soubory v pˇr´ıpadˇe pouˇzit´ı voxel˚ u). Tento pˇr´ıkaz je nutn´e spouˇstˇet pˇred vykreslen´ım kaˇzd´eho sn´ımku, protoˇze vlasy mohou b´ yt animov´any a model se tak m˚ uˇze mˇenit. Maya podporuje spouˇstˇen´ı skript˚ u (MEL) pˇred kaˇzd´ ym sn´ımkem [3De07b]. Typicky se pouˇz´ıv´ a pˇr´ıkaz: eval("shaveWriteRib \"" + "C:/shave/hair." + ‘currentTime -query‘ + ".rib" + "\"");
‘currentTime -query‘ slouˇz´ı pro vytvoˇren´ı unik´atn´ıho jm´ena souboru pomoc´ı ˇc´ısla sn´ımku (napˇr´ıklad C:/shave/hair.1.rib je jm´eno souboru pro prvn´ı sn´ımek). 3Delight automaticky generuje RI API pro vˇsechny standardn´ı primitiva ve sc´enˇe. V´ yjimku tvoˇr´ı pr´avˇe vlasy, kde je nutn´e odeslat do rendereru vygenerovan´ y RIB, coˇz lze udˇelat napˇr´ıklad pomoc´ı speci´aln´ıho uzlu DG – RIB Archive Node. Pˇri vykreslov´an´ı je tak pˇred kaˇzd´ ym sn´ımkem nejprve vygenerov´ an RIB, kter´ y je pot´e naˇcten d´ıky uveden´emu uzlu. Pro st´ınov´an´ı se pouˇz´ıvaj´ı st´ınovac´ı programy napsan´e pro RenderMan v RSL. Ty lze samozˇrejmˇe nastavovat pomoc´ı integrovan´eho rozhran´ı v Maye. Toto je zaveden´ y postup, kter´ y se standardnˇe pouˇz´ıv´a pro vykreslov´an´ı vlas˚ u v produkci. Pˇri implementaci simplifikace je samozˇrejmˇe nutn´e tento postup respektovat a co nejm´enˇe jej modifikovat!
KAPITOLA 6. IMPLEMENTACE
31
6 Implementace Zobrazov´ an´ı chlup˚ u a vlas˚ u trv´ a velmi dlouhou dobu ve srovn´an´ı s klasick´ ymi polygon´aln´ımi objekty, proto se vyplat´ı tento probl´em ˇreˇsit. Kdyˇz je chlupat´ y objekt d´ale od kamery, lze vykreslov´ an´ı urychlit pomoc´ı simplifikace. Pˇri animac´ıch se napˇr´ıklad chlupat´e zv´ıˇre ˇcasto pohybuje vzhledem ke kameˇre, takˇze simplifikace se uplatˇ nuje v mnoha sn´ımc´ıch. V hromadn´ ych sc´en´ach lze potom pouˇz´ıt stejn´ y detailn´ı model pro vˇsechny entity a aˇz pˇri vykreslov´an´ı doch´ az´ı ke zjednoduˇsen´ı. V r´amci t´eto pr´ ace jsem implementoval stochastickou simplifikaci, kter´a je vhodn´a pro pouˇzit´ı v produkˇcn´ım prostˇred´ı specifikovan´em v kapitole 5. D´ale jsem implementoval osvˇetlovac´ı model Kayjia & Kay i Marschner˚ uv model jako st´ınovac´ı programy pro RenderMan. V pˇredchoz´ı kapitole jsem uk´ azal, jak funguje vykreslov´an´ı vlas˚ u bez simplifikace. Pˇri implementaci simplifikace je tˇreba respektovat poˇzadavky produkce: • Je nutn´e pouˇz´ıt aplikaˇcn´ı prostˇred´ı – Maya, Shave, 3Delight (viz pˇredchoz´ı kapitola). • Nelze drasticky zmˇenit zabˇehnut´e postupy (viz ˇc´ast 5.4) pro vykreslov´an´ı vlas˚ u. • Simplifikace nez´ avis´ı na osvˇetlovac´ım modelu (st´ınovac´ım programu). • Nastaven´ı simplifikace se mus´ı prov´adˇet pomoc´ı grafick´eho rozhran´ı v Maye. • Pokud nelze zjednoduˇsovat, nesm´ı algoritmus zpomalovat vykreslov´an´ı. Dalˇs´ı poˇzadavky a omezen´ı vypl´ yvaj´ı z pouˇzit´eho aplikaˇcn´ıho prostˇred´ı: • Vlasy lze naˇc´ıtat pouze prostˇrednictv´ım soubor˚ u RIB, kter´e jsou vygenerov´any z´asuvn´ ym modulem Shave. • Nelze pˇr´ımo upravovat zobrazovac´ı ˇretˇezec (napˇr´ıklad zdrojov´ y k´od 3Delight). • Pro editor Maya je moˇzn´e implementovat: – Z´ asuvn´e moduly v jazyce C/C++ – MEL skripty • 3Delight RenderMan lze rozˇs´ıˇrit pomoc´ı: – St´ınovac´ıch program˚ u – Procedur´ aln´ıch primitiv DSO – Filtr˚ u RIB (RI Filters) Vytvoˇren´e ˇreˇsen´ı vˇsechny uveden´e poˇzadavky splˇ nuje. Implementace je pomˇernˇe krkolomn´ a d´ıky omezen´ım produkˇcn´ıho prostˇred´ı, pˇrestoˇze vlastn´ı simplifikaˇcn´ı algoritmus je celkem jednoduch´ y. V n´asleduj´ıc´ım textu jsou pops´ any vˇsechny komponenty, kter´e jsou nezbytn´e pro implementaci simplifikaci vlas˚ u/chlup˚ u. Nejprve uv´ad´ım sch´ema, ze kter´eho je jasnˇe vidˇet, kter´e komponenty jsem pˇridal a jak to cel´e dohromady funguje.
32
6.1
KAPITOLA 6. IMPLEMENTACE
Sch´ ema funkce
Sch´ema ˇretˇezce pro zobrazov´ an´ı vlas˚ u s pˇridanou simplifikac´ı je na obr´azku 6.1. Novˇe implementovan´e komponenty jsou or´ amov´ any ˇcervenˇe. Jednotliv´e kroky zobrazovac´ıho ˇretˇezce jsou oˇc´ıslov´any a zv´ yraznˇeny modˇre. Popisuji postup pro vykreslen´ı jednoho sn´ımku – dalˇs´ı sn´ımky se budou vykreslovat naprosto stejnˇe (proveden´ım stejn´e posloupnosti krok˚ u).
Obr´azek 6.1: Sch´ema ˇretˇezce pro zobrazov´an´ı vlas˚ u se simplifikac´ı. Novˇe implementovan´e komponenty jsou or´ amov´ any ˇcervenˇe – jedn´a se o z´asuvn´ y modul pro Mayu furSimplification a procedur´aln´ı DSO furProc.dll pro RenderMan.
Shave vygeneruje soubory RIB stejnˇe jako bez pouˇzit´ı simplifikace (1). V´ ysledkem je nˇekolik soubor˚ u s geometri´ı vlas˚ u rozdˇelenou do voxel˚ u a hlavn´ı RIB s odkazy na tyto voxely pro zpoˇzdˇen´e naˇc´ıt´ an´ı (delayed read archive, viz ˇc´ast 5.3.2). Hlavn´ı RIB je nutn´e upravit tak, aby RenderMan pˇri vykreslov´an´ı volal procedur´aln´ı DSO (dynamic load m´ısto delayed read archive). Pˇri zpoˇzdˇen´em naˇc´ıt´an´ı by RenderMan pouze naˇcetl a vykreslil vˇsechny voxely, nyn´ı p˚ ujde vykreslov´an´ı ˇr´ıdit v DSO.
KAPITOLA 6. IMPLEMENTACE
33
´ Upravu hlavn´ıho RIBu realizuje nov´ y pˇr´ıkaz MEL (z´asuvn´ y modul) pro Mayu furSimplification (2, 3). Nyn´ı m˚ uˇze probˇehnout vykreslov´an´ı v RenderMan, kdy renderer naˇcte upraven´ y hlavn´ı RIB m´ısto p˚ uvodn´ıho (4). RenderMan pˇri poˇzadavku na vykreslen´ı voxelu vol´a procedur´aln´ı DSO furProc.dll (5). V t´eto dynamick´e knihovnˇe jsou nejprve naˇcteny vlasy z RIBu voxelu a pot´e prob´ıh´a simplifikaˇcn´ı algoritmus (6). V´ ysledek (zjednoduˇsen´ y model vlas˚ u) je vr´acen do rendereru (7) prostˇrednictv´ım RI API. Pot´e RenderMan provede vlastn´ı zobrazen´ı chlup˚ u s aplikac´ı st´ınovac´ıho programu Hair shader (8). Tento st´ınovac´ı program jsem tak´e implementoval, protoˇze nen´ı standardn´ı souˇc´ast´ı 3Delight. Tato komponenta se pouˇzije i v pˇr´ıpadˇe vykreslov´an´ı vlas˚ u bez simplifikace (proto nen´ı zv´ yraznˇena ˇcervenˇe). Z uˇzivatelsk´eho hlediska nen´ı vykreslov´an´ı se simplifikac´ı o mnoho sloˇzitˇejˇs´ı neˇz standardn´ı postup. Instalace a pouˇzit´ı simplifikace je pops´ano v uˇzivatelsk´e pˇr´ıruˇcce (pˇr´ıloha B).
6.2
furSimplification – z´ asuvn´ y modul pro Mayu
Prvn´ı krokem je u ´prava hlavn´ıho RIBu, kter´ y byl vytvoˇren z´asuvn´ ym modulem Shave. Tento soubor je tedy nutn´e zmˇenit tak, aby RenderMan pˇri vykreslov´an´ı voxel˚ u zavolal naˇsi dynamickou knihovnu. Tuto modifikaci lze snadno realizovat implementac´ı nov´eho pˇr´ıkazu MEL pro Mayu. Pod´ıvejme se nyn´ı na strukturu a v´ yznam hlavn´ıho souboru RIB, kter´ y budeme upravovat.
6.2.1
Struktura hlavn´ıho RIBu Shave
Tento soubor obsahuje pˇr´ıkazy pro zpoˇzdˇen´e naˇcten´ı soubor˚ u RIB jednotliv´ ych voxel˚ u. Shave pouˇz´ıv´a bin´ arn´ı variantu RIB soubor˚ u [Pix05] s moˇznou gzip kompres´ı, proto je vhodn´e pˇri implementaci pouˇz´ıt pro naˇc´ıt´ an´ı soubor˚ u napˇr´ıklad knihovnu zlib (http://www.zlib.net/). ASCII variantou RIBu se nem´ a smysl zab´ yvat kv˚ uli ohromn´e velikosti ASCII soubor˚ u. Pˇr´ıklad hlavn´ıho RIBu vytvoˇren´eho Shave (pro srozumitelnost v ASCII), kter´ y obsahuje pro pˇrehlednost pouze ˇctyˇri voxely: ##RenderMan RIB version 3.04 TransformBegin Procedural "DelayedReadArchive" ["fur.1_shaveHairShape1_0.rib"] [-2.2281 0.705768 -3.59416 -0.0687717 -1.55476 0.452316] Procedural "DelayedReadArchive" ["fur.1_shaveHairShape1_1.rib"] [0.415756 2.12441 -3.6025 -0.0808415 -1.65198 -0.0726115] Procedural "DelayedReadArchive" ["fur.1_shaveHairShape1_2.rib"] [-2.30347 0.35287 -0.748081 1.14806 -1.73588 0.353727] Procedural "DelayedReadArchive" ["fur.1_shaveHairShape1_3.rib"] [0.265323 2.91705 -0.652254 3.35846 -1.65049 0.175184] TransformEnd
Tento soubor je potˇreba naˇc´ıst a upravit. Z pˇr´ıkladu je vidˇet, ˇze Shave odkazuje na RIBy jednotliv´ ych voxel˚ u prostˇrednictv´ım Procedural "DelayedReadArchive". Pro prvn´ı voxel v pˇr´ıkladu je to soubor fur.1_shaveHairShape1_0.rib.
34
KAPITOLA 6. IMPLEMENTACE
Pro pouˇzit´ı DSO pˇri vykreslov´ an´ı m´ısto zpoˇzdˇen´eho naˇcten´ı, staˇc´ı uv´est DynamicLoad m´ısto DelayedReadArchive. D´ ale je nutn´e zapsat jm´eno DSO aplikace a uv´est vˇsechny parametry simplifikace, protoˇze RIB je jedin´ ym m´ıstem pro pˇred´an´ı parametr˚ u do DSO. 6.2.2
Nastaven´ı pro st´ınov´ y pr˚ uchod
Pˇri vykreslov´an´ı vlas˚ u se v RenderMan pro st´ıny pouˇz´ıvaj´ı deep shadow maps [LV00]. Ty se vykresluj´ı na zaˇc´ atku z pozice vˇsech svˇetel. Simplifikace tak prob´ıh´a nejen v z´avˇereˇcn´em (vykreslen´ı obr´ azku), ale i ve st´ınov´em pr˚ uchodu (vykreslen´ı st´ınov´ ych map). Bylo by vhodn´e, aby st´ınov´e pr˚ uchody mohly m´ıt jin´e nastaven´ı parametr˚ u simplifikace neˇz pr˚ uchod z´avˇereˇcn´ y. Nastaven´ı simplifikace totiˇz z´avis´ı na pouˇzit´em rozliˇsen´ı, kter´e je u st´ınov´ ych map vˇetˇsinou jin´e neˇz z´ avˇereˇcn´eho obr´azku. Typicky se pro st´ınov´e mapy pouˇz´ıv´a rozliˇsen´ı 512×512. Na st´ıny je d´ ale moˇzn´e aplikovat agresivnˇejˇs´ı zjednoduˇsov´an´ı a to i v detailn´ıch pohledech – rozd´ıl nen´ı tak vizu´ alnˇe znateln´ y jako v pˇr´ıpadˇe velk´e simplifikace v z´avˇereˇcn´em pr˚ uchodu (viz ˇc´ ast 7.2). Bohuˇzel standard RenderMan (implementace 3Delight 7.0 ) nedovoluje rozpoznat v procedur´aln´ım DSO typ pr˚ uchodu pˇri vykreslov´ an´ı. Probl´em lze vyˇreˇsit pomoc´ı podm´ınˇen´ ych v´ yraz˚ u v RIBu a nastaven´ım zvl´ aˇstn´ıho atributu (viz ˇc´ast 5.3.3). Pˇred zaˇc´atkem vykreslov´an´ı st´ınov´e mapy nastav´ıme uˇzivatelsk´ y atribut: Attribute "user" "string renderpass" ["shadow"] Po ukonˇcen´ı vykreslov´ an´ı st´ınov´e mapy jej nastav´ıme na hodnotu: Attribute "user" "string renderpass" ["final"] Tyto pˇr´ıkazy je nutn´e zadat do RIBu na pˇr´ısluˇsn´a m´ısta (tj. zaˇc´atek a konec st´ınov´eho pr˚ uchodu). V pˇr´ıpadˇe pouˇzit´ı 3Delight for maya lze nastavit atributy pomoc´ı MEL verze pˇr´ıkazu RiAttribute (viz pˇr´ıloha B). Typ pr˚ uchodu lze nyn´ı rozpoznat pˇr´ımo v RIBu pomoc´ı pˇr´ıkazu RiIfBegin. Takˇze upraven´ y hlavn´ı RIB by mˇel obsahovat dvˇe vˇetve – shadow a final, mezi kter´ ymi se rozhodne s´am renderer aˇz v dobˇe vykreslov´ an´ı. 6.2.3
Upraven´ y hlavn´ı RIB
Jak bude vypadat upraven´ y hlavn´ı RIB? Je nutn´e vytvoˇrit dvˇe vˇetve a jeˇstˇe uloˇzit parametry nastaven´ı simplifikace, protoˇze procedur´ aln´ı DSO nem´a jinou moˇznost naˇc´ıt´an´ı parametr˚ u neˇz prostˇrednictv´ım souboru RIB. Z´apis upraven´eho souboru lze realizovat pomoc´ı standardn´ıch funkc´ı jazyka C/C++. V´ yhodnˇejˇs´ı je pouˇz´ıt RI API, kdy pro v´ ystup do souboru staˇc´ı zavolat RiBegin(file). Kde file je jm´eno souboru, do kter´eho se bude zapisovat. V´ ystup do souboru se ukonˇc´ı vol´an´ım RiEnd(). Vˇsechny ostatn´ı funkce z RI API (napˇr´ıklad RiIfBegin, RiProcedural) vol´ame mezi tˇemito dvˇema pˇr´ıkazy. Pˇr´ıklad upraven´eho souboru RIB (jako zdroj byla pouˇzita pˇredchoz´ı uk´azka RIBu se ˇctyˇrmi voxely): ##RenderMan RIB-Structure 1.0 ##Creator 3Delight 7.0.0 win32 (Nov 29 2007) "Django" ##CreationDate Tue Mar 25 12:35:00 2008 TransformBegin # { IfBegin "$user:renderpass == ’shadow’"
KAPITOLA 6. IMPLEMENTACE
35
Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_0.rib’ ’log.txt’ 1 116220 0.4 0.1 0.1 0.5 -1" ] [ -2.2280987 0.705768 -3.5941607 -0.06877169 -1.5547591 0.4523164 ] Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_1.rib’ ’log.txt’ 1 71195.5 0.4 0.1 0.1 0.5 -1" ] [ 0.41575632 2.1244107 -3.6024987 -0.08084149 -1.6519802 -0.07261145 ] Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_2.rib’ ’log.txt’ 1 72550.9 0.4 0.1 0.1 0.5 -1" ] [ -2.3034714 0.35286983 -0.74808144 1.1480577 -1.7358801 0.35372708 ] Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_3.rib’ ’log.txt’ 1 113684 0.4 0.1 0.1 0.5 -1" ] [ 0.2653229 2.9170478 -0.65225386 3.358459 -1.6504905 0.17518365 ] Else Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_0.rib’ ’log.txt’ 1 11622 0.4 0.1 0.1 -1 -1" ] [ -2.2280987 0.705768 -3.5941607 -0.06877169 -1.5547591 0.4523164 ] Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_1.rib’ ’log.txt’ 1 7119.55 0.4 0.1 0.1 -1 -1" ] [ 0.41575632 2.1244107 -3.6024987 -0.08084149 -1.6519802 -0.07261145 ] Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_2.rib’ ’log.txt’ 1 7255.09 0.4 0.1 0.1 -1 -1" ] [ -2.3034714 0.35286983 -0.74808144 1.1480577 -1.7358801 0.35372708 ] Procedural "DynamicLoad" [ "furProc.dll" "’fur.1_shaveHairShape1_3.rib’ ’log.txt’ 1 11368.4 0.4 0.1 0.1 -1 -1" ] [ 0.2653229 2.9170478 -0.65225386 3.358459 -1.6504905 0.17518365 ] IfEnd TransformEnd # }
V pˇr´ıkladu jsou dvˇe vˇetve (IfBegin a Else) pro st´ınov´ y resp. z´avˇereˇcn´ y pr˚ uchod a pˇr´ıkazy Procedural pro zavol´ an´ı DSO pˇri vykreslov´an´ı. Pro u ´plnost uv´ ad´ım syntaxi jednoho pˇr´ıkazu Procedural v upraven´em RIBu: Procedural "DynamicLoad" [ "jm´ enoDLL" "’jm´ enoRIBu’ ’jm´ eno_LOGu’ simplifikovat? B0 h trans min max debugLambda" ] [ boundingBox ]
Popis jednotliv´ ych parametr˚ u je uveden v tabulce 6.1. Nastaven´ı parametr˚ u z uˇzivatelsk´eho pohledu je pops´ ano v pˇr´ıloze B.3. Maxim´aln´ı poˇcet vlas˚ u m´a smysl zad´avat pouze pro st´ınov´ y pr˚ uchod, kde je moˇzn´e simplifikovat i v detailnˇejˇs´ıch pohledech (viz kapitola 7.2). Jedin´ ym probl´emem m˚ uˇze b´ yt urˇcen´ı parametru B0 (poˇcet pixel˚ u, kde simplifikace zaˇc´ın´ a). Voxely jsou totiˇz, jak jiˇz bylo ˇreˇceno, pˇrekr´ yvaj´ıc´ı se AABB a m˚ uˇzou b´ yt r˚ uznˇe velk´e. Jednotliv´e voxely tak mohou m´ıt odliˇsn´e hodnoty B0 v z´avislosti na velikosti voxelu, jak je vidˇet i ve v´ ypisu upraven´eho RIBu. B0 jsem aproximoval pomoc´ı plochy hraniˇcn´ı ob´alky voxelu: B0 =
SB · P0 SM
Kde • SB je plocha ob´ alky (kv´ adru) aktu´aln´ıho voxelu. • SM je plocha ob´ alky (kv´ adru), kter´a obklopuje vˇsechny voxely modelu.
(6.1)
36
KAPITOLA 6. IMPLEMENTACE • P0 je poˇcet pixel˚ u vztaˇzen´ y k cel´emu modelu, kde zaˇc´ın´a simplifikace.
Kaˇzd´ y voxel tak m˚ uˇze m´ıt B0 nastaveno jinak. Pouˇzit´ı plochy m´ısto napˇr´ıklad objemu je lepˇs´ı, protoˇze obecnˇe nen´ı zn´ amo, jak je voxel (kter´ y m˚ uˇze m´ıt i prot´ahl´ y tvar) orientov´an ke kameˇre. jm´ enoDLL jm´ enoRIBu jm´ enoLOGu simplifikovat? B0 h trans min max debugLambda boundingBox
Jm´eno DSO, kter´ y implementuje simplifikaci RIB, kter´ y obsahuje vygenerovan´e vlasy v dan´em voxelu Soubor, kter´ y se pouˇz´ıv´a pro v´ ystup ladic´ıch informac´ı 1 = algoritmus simplifikace je zapnut, 0 = nepouˇz´ıvat simplifikaci Poˇcet pixel˚ u, kde simplifikace zaˇc´ın´a Simplifikace 50% je pˇri hB0 pixelech Velikost pˇrechodov´e z´ony Minim´ aln´ı poˇcet vlas˚ u (0 aˇz 1) Maxim´ aln´ı poˇcet vlas˚ u (0 aˇz 1), pouze pro st´ınov´ y pr˚ uchod N´ asiln´e nastaven´ı simplifikace λ (0 aˇz 1) pro testovac´ı u ´ˇcely Hraniˇcn´ı ob´ alka (6 × float), stejn´a jako u DelayedReadArchive
Tabulka 6.1: Popis parametr˚ u, kter´e je tˇreba zapsat do RIBu. jm´ enoRIBu a boundingBox jsou naˇcteny z hlavn´ıho RIBu, B0 se spoˇc´ıt´ a podle vzorce (6.1). Uˇzivatelsk´ y pohled na nastaven´ı parametr˚ u je pˇr´ıloze B.3.
6.2.4
Pˇ r´ıkaz MEL pro Mayu
ˇ ım tuto u Nyn´ı v´ıme, jak m´ a vypadat upraven´ y RIB. C´ ´pravu realizovat? Podrˇz´ıme se standardn´ıho postupu, kter´ y se pouˇz´ıv´ a pro export vlas˚ u do RIBu. Vlasy se generuj´ı v Maye pomoc´ı pˇr´ıkazu MEL (viz ˇc´ ast 5.4): shaveWriteRib "ribFilename" ´ Upravu hlavn´ıho RIBu tak lze prov´est implementac´ı nov´eho pˇr´ıkazu MEL, kter´ y dostane na vstup stejn´e jm´eno souboru jako pˇredchoz´ı pˇr´ıkaz Shave: shaveWriteRibProc "ribFilename" Pˇr´ıkazy se pot´e spouˇst´ı oba – prvn´ı vygeneruje RIBy a druh´ y provede poˇzadovanou u ´pravu hlavn´ıho souboru. Generov´ an´ı vˇsech vlas˚ u m˚ uˇze trvat pomˇernˇe dlouhou dobu, proto jsem implementoval i moˇznost u ´pravy jiˇz zpracovan´eho hlavn´ıho RIBu. Pˇri zmˇenˇe nastaven´ı simplifikace tak generov´ an´ı pomoc´ı shaveWriteRib odpadne a spouˇst´ı se pouze shaveWriteRibProc. Oba pˇr´ıkazy lze zadat ruˇcnˇe do pˇr´ıkazov´e ˇr´adky v Maye nebo vyuˇz´ıt moˇznost´ı skript˚ u spouˇstˇen´ ych pomoc´ı 3Delight (viz pˇr´ıloha B). K´od v C++ (Maya API) pro tvorbu nov´ ych pˇr´ıkaz˚ u pro Mayu je pomˇernˇe jednoduch´ y, staˇc´ı implementovat nov´eho potomka tˇr´ıdy MPxCommand: class shaveWriteRibProc : public MPxCommand { public: MStatus doIt(const MArgList& args); static void* creator() { return new shaveWriteRibProc; } };
Ve funkci doIt je k´ od, kter´ y se spust´ı pˇri zavol´an´ı pˇr´ıkazu (args jsou parametry z pˇr´ıkazov´e ˇr´adky – v tomto pˇr´ıpadˇe jm´eno souboru RIB). Funkce creator vrac´ı novou instanci tˇr´ıdy.
KAPITOLA 6. IMPLEMENTACE
37
V´ıce o implementov´ an´ı nov´ ych pˇr´ıkaz˚ u jako z´asuvn´ ych modul˚ u pro Mayu lze nal´ezt napˇr´ıklad v [Gou02]. Nov´ y pˇr´ıkaz shaveWriteRibProc prov´ad´ı tedy pouze dvˇe vˇeci: 1. Naˇcten´ı parametr˚ u voxel˚ u (Procedural "DelayedReadArchive") z hlavn´ıho RIBu nebo naˇcten´ı jiˇz upraven´eho hlavn´ıho souboru (Procedural "DynamicLoad"). 2. Pˇreps´ an´ı hlavn´ıho RIBu pomoc´ı RI API na Procedural "DynamicLoad" s vˇetven´ım podle typu pr˚ uchodu a nastaven´ım parametr˚ u simplifikace. 6.2.5
Uˇ zivatelsk´ e rozhran´ı pro Mayu
Nastaven´ı simplifikace uˇzivatelem by bylo moˇzn´e prov´adˇet napˇr´ıklad prostˇrednictv´ım parametr˚ u pˇr´ıkazu shaveWriteRibProc. To je ovˇsem uˇzivatelsky nepˇr´ıvˇetiv´e. Jedn´ım z poˇzadavk˚ u produkce je pouˇzit´ı grafick´eho uˇzivatelsk´eho rozhran´ı v Maye. Ide´aln´ı ˇreˇsen´ı je vytvoˇrit nov´ y uzel DG. Maya pak sama vytvoˇr´ı grafick´e rozhran´ı pro atributy uzlu a zajist´ı i ukl´ ad´ an´ı do souboru (maya file format). Grafick´e rozhran´ı atribut˚ u uzlu je y uzel bude m´ıt jedinou moˇzn´e d´ale vylepˇsit pomoc´ı MEL skriptu (viz napˇr´ıklad [Str03]). Nov´ instanci v cel´e sc´enˇe – Shave totiˇz pro vˇsechny vlasy ve sc´enˇe vytv´aˇr´ı spoleˇcn´ y RIB. Nejobecnˇejˇs´ı uzel DG se vytvoˇr´ı implementac´ı nov´eho potomka tˇr´ıdy MPxNode: class furSimplification : public MPxNode { public: static MStatus initialize(); bool setInternalValueInContext(const MPlug &plug, const MDataHandle &dataHandle, MDGContext &ctx); static void* creator() { return new shaveWriteRibProc; } static MTypeId id; private: static MObject attr1; // ... dalˇ s´ ı atributy };
Funkce initialize vytvoˇr´ı vˇsechny atributy uzlu (urˇcen´ı datov´eho typu, rozsahu, v´ ychoz´ı hodnoty). Jednotliv´e atributy jsou pˇriˇrazeny promˇenn´e typu MObject (zde napˇr´ıklad attr1). setInternalValueInContext je funkce zpˇetn´eho vol´an´ı, kterou Maya spouˇst´ı pˇri jak´ekoliv zmˇenˇe atribut˚ u. Tato funkce m˚ uˇze b´ yt vyuˇzita pro z´ısk´av´an´ı hodnot atribut˚ u uzlu. Za zm´ınku jeˇstˇe stoj´ı promˇenn´ a id, kter´a je jednoznaˇcnou identifikac´ı uzlu pro ukl´ad´an´ı do bin´arn´ıho souboru v Maye (maya binary file format). Pro lok´aln´ı testov´an´ı je moˇzn´e pouˇz´ıvat ˇc´ısla z rozsahu 0x00000000 a 0x0007ffff. Jinak jsou unik´atn´ı id pˇridˇelov´ana technickou podporou Autodesku. Tˇr´ıda s implementac´ı pˇr´ıkazu shaveWriteRibProc m´a pˇr´ıstup k atribut˚ um, kter´e jsou uloˇzeny prostˇrednictv´ım uzlu furSimplification. Ve sc´enˇe totiˇz existuje maxim´alnˇe jedna instance uzlu furSimplification, kter´ a je vytvoˇrena pˇri prvn´ım poˇzadavku na simplifikaci. Instanci nov´eho uzlu je moˇzn´e vytvoˇrit napˇr´ıklad pomoc´ı MEL skriptu pˇri poˇzadavku (napˇr´ıklad v menu) na zobrazen´ı grafick´eho rozhran´ı s atributy uzlu: string $n[] = ‘ls furSimplification‘;
38
KAPITOLA 6. IMPLEMENTACE
if(size($n) <= 0) createNode furSimplification -n furSimplification; else showEditor("furSimplification");
Nejprve se pomoc´ı ls zjist´ı, zda existuje instance uzlu furSimplification. Pokud ne, je vytvoˇrena pomoc´ı createNode a Maya automaticky zobraz´ı atributy uzlu. Pokud instance jiˇz existuje, staˇc´ı zobrazit atributy vol´ an´ım showEditor. Uk´azka vytvoˇren´eho uˇzivatelsk´eho rozhran´ı je na obr´azku 6.2. Jednotliv´e atributy odpov´ıdaj´ı parametr˚ um, kter´e jsou zaps´ any do RIBu v obou vˇetv´ıch. V´ıce o implementaci nov´ ych uzl˚ u DG jako z´asuvn´ ych modul˚ u pro Mayu lze nal´ezt napˇr´ıklad v [Gou02]. Popis uˇzivatelsk´eho rozhran´ı je v ˇc´asti B.3.
Obr´azek 6.2: Grafick´e rozhran´ı pro atributy uzlu DG (nastaven´ı simplifikace).
6.3
furProc.dll – procedur´ aln´ı DSO pro RenderMan
V procedur´aln´ım DSO prob´ıh´ a vlastn´ı simplifikace. RenderMan tuto aplikaci vol´a v pˇr´ıpadˇe poˇzadavku na vykreslen´ı voxelu. V DSO je tˇreba prov´est n´asleduj´ıc´ı akce: 1. Urˇcen´ı velikosti simplifikace na z´ akladˇe poˇctu viditeln´ ych pixel˚ u ob´alky. 2. Naˇcten´ı RIBu dan´eho voxelu s poˇctem vlas˚ u dle velikosti simplifikace. 3. Proveden´ı simplifikace vlas˚ u (vylouˇcen´ı nˇekter´ ych vlas˚ uau ´prava pr˚ umˇeru). 4. Vr´acen´ı vlas˚ u zpˇet do vykreslovac´ıho programu pomoc´ı RI API. DSO primitiva v RenderMan maj´ı nˇekolik omezen´ı, kter´e je tˇreba respektovat: • Parametry do DSO lze pˇred´ avat pouze prostˇrednictv´ım souboru RIB. • Jedin´ ym parametrem poslan´ ym do DSO od rendereru je poˇcet pixel˚ u ob´alky, kter´e jsou ve viditeln´e oblasti (to je pˇresnˇe hodnota, kterou potˇrebuje simplifikaˇcn´ı algoritmus). • Pomoc´ı RI API nen´ı moˇzn´e v DSO z´ıskat ˇz´adn´e dalˇs´ı informace (napˇr´ıklad o kameˇre ˇci jin´ ych nastaven´ı RenderMan).
KAPITOLA 6. IMPLEMENTACE
39
• DSO se velmi obt´ıˇznˇe lad´ı, v´ ysledek se d´a ˇcasto kontrolovat jen vizu´alnˇe v podobˇe vykreslen´ ych vlas˚ u. Nejprve se zm´ın´ım o struktuˇre aplikace DSO. V prostˇred´ı Windows se jedn´a o dynamickou knihovnu DLL. 6.3.1
Struktura DLL
V dynamick´e knihovnˇe je vyˇzadov´ana implementace tˇr´ı funkc´ı (je nutn´e pouˇz´ıt linkov´ an´ı v jazyce C nikoliv C++): RtPointer ConvertParameters(RtString paramstr); RtVoid Subdivide(RtPointer data, RtFloat detail); RtVoid Free(RtPointer data);
Prvn´ı funkce ConvertParameters, jak jiˇz n´azev napov´ıd´a, slouˇz´ı ke konverzi parametr˚ u. Na vstupu je ˇretˇezec pˇredan´ y ve vol´ an´ı Procedural. Tento ˇretˇezec mus´ı b´ yt rozebr´an na jednotliv´e parametry. Funkce vrac´ı obecn´ y ukazatel void* na dynamicky alokovanou pamˇeˇt, takˇze lze pomoc´ı pˇretypov´ an´ı pouˇz´ıt jakoukoliv vytvoˇrenou strukturu. Renderer vol´a tuto funkci vˇzdy jako prvn´ı – pˇri nov´em poˇzadavku na vykreslen´ı procedur´aln´ıho primitiva. Funkce Free je urˇcena k uvolnˇen´ı pamˇeti dynamicky alokovan´e pro vr´acen´ y ukazatel ve funkci ConvertParameters. Renderer tuto funkci vol´a automaticky, kdyˇz data nejsou d´ale potˇreba. Nejd˚ uleˇzitˇejˇs´ı funkce je Subdivide – na vstup dost´av´a ukazatel na konvertovan´e parametry (data) a parametr detail, kter´ y odpov´ıd´a poˇctu pixel˚ u ob´alky primitiva ve viditeln´e oblasti. Pr´avˇe tuto hodnotu pouˇzije simplifikaˇcn´ı algoritmus. V t´eto funkci prob´ıh´a naˇcten´ı vlas˚ u z RIBu a vlastn´ı simplifikace s v´ ystupem do rendereru, tj. vˇsechny kroky zm´ınˇen´e v´ yˇse. Renderer vol´ a tuto funkci hned po konverzi parametr˚ u funkc´ı ConvertParameters. 6.3.2
Naˇ cten´ı RIBu voxelu Shave
´ Uplnˇ e prvn´ım krokem by mˇelo b´ yt urˇcen´ı velikosti simplifikace, coˇz lze spoˇc´ıtat z parametr˚ u pˇredan´ ych do RIBu (viz algoritmus v ˇc´asti 6.3.3). Zn´ame-li procento zobrazen´ ych vlas˚ u, m˚ uˇzeme naˇc´ıst vlasy z RIBu dan´eho voxel. Jm´eno souboru je souˇc´ast´ı pˇredan´ ych parametr˚ u z hlavn´ıho RIBu. V Shave je opˇet pouˇzita bin´arn´ı varianta soubor˚ u RIB, pˇresto mohou m´ıt tyto soubory i s gzip kompres´ı velikost nˇekolik des´ıtek megabajt˚ u d´ıky obrovsk´emu mnoˇzstv´ı vl´aken. Jak tedy takov´ y soubor voxelu vytvoˇren´ y pomoc´ı Shave vypad´a? Zde je pˇr´ıklad RIBu (opˇet v ASCII) obsahuj´ıc´ı pro pˇrehlednost pouh´e tˇri vlasy: ##RenderMan RIB version 3.04 TransformBegin Basis "catmull-rom" 1 "catmull-rom" 1 Declare "width" "varying float" Declare "N_Srf" "uniform normal" Declare "SHAVEambdiff" "constant float" Declare "SHAVEopacity" "constant float" Declare "SHAVEgloss" "constant float" Declare "SHAVEselfshad" "constant float" Declare "SHAVEspec" "constant float"
40
KAPITOLA 6. IMPLEMENTACE
Declare "SHAVEspec_color" "constant color" ShadingInterpolation "smooth" Declare "s" "uniform float" Declare "t" "uniform float" Curves "cubic" [6 6 6] "nonperiodic" "P" [-0.311655 0.0267191 1.46655 -0.311655 0.0267191 1.46655 -0.310125 -0.130192 1.51178 -0.309074 -0.294351 1.52142 -0.308726 -0.452484 1.54429 -0.308726 -0.452484 1.54429 1.97353 -0.469898 1.00425 1.97353 -0.469898 1.00425 1.99099 -0.63085 1.00817 1.94517 -0.793607 1.00339 1.88514 -0.95955 0.996393 1.88514 -0.95955 0.996393 0.638394 -1.04928 0.322612 0.638394 -1.04928 0.322612 0.749549 -1.09488 0.392676 0.870997 -1.08406 0.473121 0.994826 -1.05935 0.561633 0.994826 -1.05935 0.561633] "width" [0.021101 0.0164119 0.0117228 0.00703368 0.021101 0.0164119 0.0117228 0.00703368 0.021101 0.0164119 0.0117228 0.00703368] "N_Srf" [0.00313625 0.0155051 0.999875 0.991099 0.0116936 0.132616 -0.215395 -0.96797 -0.128992] "s" [0.480522 0.664827 0.5399]"t" [0.126423 0.0711691 0.901884] "SHAVEambdiff" [0.75]"SHAVEopacity" [1]"SHAVEgloss" [0.098]"SHAVEselfshad" [1] "SHAVEspec" [0.9]"SHAVEspec_color" [1 1 1] TransformEnd
V pˇr´ıkladu vid´ıme deklarace (Declare) nestandardn´ıch parametr˚ u kˇrivek. Parametry SHAVE* nejsou pouˇzity pˇri vykreslov´ an´ı ani ve st´ınovac´ım programu, takˇze je m˚ uˇzeme pˇri naˇc´ıt´an´ı ignorovat. Nejd˚ uleˇzitˇejˇs´ı ˇc´ ast´ı jsou kˇrivky zadan´e pˇr´ıkazem RiCurves. Pˇr´ıkaz RiCurves dle specifikace RenderMan [Pix05]: RiCurves ( RtToken type, RtInt ncurves, RtInt nvertices[], RtToken wrap, ...parameterlist...) Popis parametr˚ u je uveden v tabulce 6.2. Shave podporuje oba typy kˇrivek – cubic i linear. Srovn´an´ı obou typ˚ u je vidˇet na obr´ azku 6.3. Typ linear je v´ ypoˇcetnˇe o nˇeco m´alo rychlejˇs´ı, ale pˇri bliˇzˇs´ım pohledu na kˇrivku je vidˇet navazov´an´ı rovn´ ych segment˚ u, takˇze se tento typ t´emˇeˇr nepouˇz´ıv´ a. V pˇr´ıpadˇe pouˇzit´ı linear je poˇcet hodnot v poli width roven celkov´emu poˇctu P P vrchol˚ u ncurves nvertices, v pˇr´ıpadˇe cubic je poˇcet ncurves (nvertices − 2). Atribut wrap je v pˇr´ıpadˇe Shave vˇzdy nonperiodic. Ne vˇsechny uveden´e parametry kˇrivek jsou modulem Shave vˇzdy exportov´ any, voliteln´e jsou s, t a N_Srf.
(a) Cubic
(b) Linear
Obr´azek 6.3: Porovn´ an´ı typ˚ u kˇrivek pˇri bliˇzˇs´ım pohledu. V (b) je vidˇet zlomy pˇri navazov´an´ı segment˚ u.
KAPITOLA 6. IMPLEMENTACE type ncurves nvertices wrap parameterlist "P" "width" "N_Srf" "s", "t"
41
Typ kˇrivky m˚ uˇze nab´ yvat hodnot linear nebo cubic Poˇcet kˇrivek (v souboru RIB odpov´ıd´a poˇctu ˇc´ısel mezi hranat´ ymi z´ avorkami) Pole o velikosti ncurves, kde je uloˇzen poˇcet vrchol˚ u na kaˇzdou kˇrivku (v pˇr´ıkladu odpov´ıd´a poli [6 6 6]) M˚ uˇze nab´ yvat hodnot nonperiodic (kˇrivky nenavazuj´ı) nebo periodic (navazuj´ı) Seznam parametr˚ u (nˇekter´e mus´ı b´ yt deklarovan´e pomoc´ı RiDeclare) P Pole vrchol˚ u (poˇcet je y standardn´ı ncurves nvertices), povinn´ parametr ˇıˇrky kˇrivek v r˚ S´ uzn´ ych m´ıstech (poˇcet z´avis´ı na typu) Norm´ alov´ y vektor povrchu v m´ıstˇe, kde kˇrivka vyr˚ ust´a (poˇcet je ncurves) Hodnota souˇradnic textury pro m´ısto na povrchu, kde kˇrivka vyr˚ ust´ a (poˇcet je ncurves) Tabulka 6.2: Popis parametr˚ u pˇr´ıkazu RiCurves.
V dobˇe naˇc´ıt´ an´ı kˇrivek je jiˇz zn´ ama velikost simplifikace a m˚ uˇzeme tedy nˇekter´e ˇc´asti v souboru pˇreskakovat. Pˇri pouˇzit´ı gzip komprese na soubor RIB je tento postup bohuˇzel ne´ uˇcinn´ y, protoˇze i pˇreskakovan´e ˇc´ asti mus´ı b´ yt rozbaleny. Kˇrivky m˚ uˇzeme naˇc´ıst do dynamicky alokovan´ ych pol´ı a zapouzdˇrit do tˇr´ıdy, jej´ıˇz struktura je na obr´azku 6.4. Struˇcn´ y popis t´eto tˇr´ıdy: • totalNumHair – Celkov´ y poˇcet vlas˚ u ve voxelu (bez simplifikace) • numSimplifiedHair – Poˇcet vlas˚ u, kter´e budou zobrazeny (odesl´any do rendereru) • nVertices – Poˇcet vrchol˚ u na jeden vlas (kˇrivku) • Scale(i, scale) – Vyn´ asob´ı ˇc´ıslem scale ˇs´ıˇrku i-t´eho vlasu, tj. uprav´ı hodnoty v poli width od adresy [i*nvertices] do [i*nvertices + nvertices - 1] vˇcetnˇe • Ostatn´ı atributy odpov´ıdaj´ı dat˚ um naˇcten´ ych z RIBu (tabulka 6.2) – width, nSrf, s, t a vertices (v souboru RIB odpov´ıd´a "P")
Obr´ azek 6.4: Struktura tˇr´ıdy pro uloˇzen´ı vˇsech vlas˚ u (kˇrivek).
42
KAPITOLA 6. IMPLEMENTACE
6.3.3
Algoritmus stochastick´ e simplifikace
Vˇsechna potˇrebn´ a data jsou naˇctena a nyn´ı je moˇzn´e na nˇe aplikovat simplifikaˇcn´ı algoritmus, kter´ y byl pops´an v ˇc´ asti textu 4.4. Na tomto m´ıstˇe uv´ad´ım k´od v jazyce C++, kter´ y vych´az´ı z pˇr´ılohy k ˇcl´anku [CHPR07]. void Simplify(Hair &hair, float B, float B0, float h, float trans) { float b = B / B0; float lambda = (b >= 1) ? 1 : pow(b, log(0.5) / log(h)); // urˇ cen´ ı spr´ avn´ e velikosti pˇ rechodov´ e z´ ony (limitn´ ı pˇ r´ ıpady) float transEnd; if(lambda - trans < 0) transEnd = lambda; // bl´ ızko lev´ e hranice else if(lambda+trans > 1.0f) transEnd = 1 - lambda; // bl´ ızko prav´ e hranice else transEnd = trans; // bˇ eˇ zn´ y pˇ r´ ıpad // hranice pˇ rechodov´ e z´ ony float transEndRight = lambda + transEnd; float transEndLeft = lambda - transEnd; // poˇ cet vlas˚ u, kter´ e budou zobrazeny int numHair = int( transEndRight * hair.totalNumHair ); float sMax; // maxim´ aln´ ı velikost zvˇ etˇ sen´ ı pro dan´ e lambda float sMin; // minim´ aln´ ı velikost zvˇ etˇ sen´ ı pro dan´ e lambda if(lambda + trans < 1) { sMax = 1 / lambda; sMin = 0; } else { float tr = transEnd / trans; sMax = 1 / (1 - transEnd*tr); sMin = sMax * (1 - tr); } // ´ uprava pr˚ umˇ eru vlas˚ u for(int i = 0; i < numHair; ++i) { float x = (i + 0.5f) / hair.totalNumHair; // pozice v prioritn´ ı frontˇ e // interpolace pr˚ umˇ eru float sLerp; if(x < transEndLeft) sLerp = 1; else if(x < transEndRight) sLerp = (transEndRight - x) / (2 * transEnd); else sLerp = 0; // zvˇ etˇ sen´ ı pr˚ umˇ eru pro tento vlas float s = sMin + (sMax - sMin) * sLerp; hair.Scale(i, s); } // poˇ cet vlas˚ u, kter´ e se poˇ slou do rendereru hair.numSimplifiedHair = numHair; }
KAPITOLA 6. IMPLEMENTACE
43
Popis parametr˚ u funkce Simplify: • hair – Tˇr´ıda (diagram na obr´ azku 6.3), kter´a obsahuje vˇsechny vlasy voxelu. Pˇredpokl´ ad´ a se n´ ahodn´e rozm´ıstˇen´ı vlas˚ u v tomto poli. Algoritmus je aplikov´an pˇr´ımo na data tˇr´ıdy! • B – Poˇcet pixel˚ u ob´ alky ve viditeln´e oblasti. Odpov´ıd´a promˇenn´e detail ve funkci Subdivide() v DLL. • B0 – Poˇcet pixel˚ u, kde zaˇc´ın´ a simplifikace. • h – Simplifikace je 50% pˇri h*B0 pixelech. • trans – Velikost pˇrechodov´e z´ony. Parametry B0, h a trans jsou z´ısk´ any z RIBu prostˇrednictv´ım funkce ConvertParameters (viz v´ yˇse). Jedin´ ym ,,v´ ystupem” funkce Simplify je vlastnˇe z´apis poˇctu simplifikovan´ ych vlas˚ u do hair.numSimplifiedHair a u ´prava pr˚ umˇeru vlas˚ u pomoc´ı funkce hair.Scale(). K urˇcen´ı poˇctu vlas˚ u, kter´e je potˇreba naˇc´ıst, doch´az´ı v re´aln´e implementaci samozˇrejmˇe dˇr´ıve (vlasy se nenaˇc´ıtaj´ı vˇsechny). V algoritmu uveden´em v´ yˇse pro jednoduchost uvaˇzuji, ˇze vlasy jsou naˇcteny vˇsechny. 6.3.4
V´ ystup do rendereru
Nyn´ı jsou k dispozici data, kter´e je tˇreba vr´atit do rendereru pro vykreslen´ı. Dos´ahneme toho zavol´an´ım funkc´ı RI API z knihovny implementace RenderMan. Pˇr´ıklad v jazyce C/C++ pro v´ ystup kˇrivek typu cubic: RiTransformBegin(); RiBasis(RiCatmullRomBasis, 1, RiCatmullRomBasis, 1); // deklarace parametr˚ u pro RiCurves RiDeclare("width", "varying float"); RiDeclare("N_Srf", "uniform normal"); RiDeclare("s", "uniform float"); RiDeclare("t", "uniform float"); // V´ ystup simplifikovan´ ych vlas˚ u pomoc´ ı RiCurves RiCurves("cubic", hair.numSimplifiedHairs, hair.nVertices, "nonperiodic", "P", hair.vertices, "width", hair.width, "N_Srf", hair.nSrf, "s", hair.s, "t", hair.t, RI_NULL); RiTransformEnd();
V pˇr´ıkladu je deklarace nestandardn´ıch parametr˚ u kˇrivek pomoc´ı RiDeclare a v´ ystup vlastn´ıch kˇrivek pomoc´ı pˇr´ıkazu RiCurves. Ve skuteˇcn´e implementaci je samozˇrejmˇe nutn´e poˇc´ıtat i s kˇrivkami typu linear. Nav´ıc ne vˇsechny parametry mus´ı b´ yt pomoc´ı Shave exportov´ any (nepovinn´e jsou s, t a N_Srf). Kaˇzdou moˇznost je nutn´e realizovat vlastn´ım vol´an´ım RiCurves. Pokud je simplifikace vypnuta resp. λ = 1, nen´ı v˚ ubec nutn´e naˇc´ıtat RIB. Staˇc´ı vr´atit rendereru p˚ uvodn´ı RIB voxelu, kter´ y je potom vykreslen cel´ y (tj. bez simplifikace). To lze prov´est napˇr´ıklad vol´ an´ım funkce RiReadArchive. Nedoch´az´ı tak ke zpomalen´ı vykreslov´an´ı z d˚ uvodu zbyteˇcn´eho naˇc´ıt´ an´ı RIBu voxelu.
44
KAPITOLA 6. IMPLEMENTACE
6.4
St´ınovac´ı programy
St´ınov´an´ı mus´ı b´ yt implementov´ ano, aˇt uˇz se pouˇzije simplifikace nebo ne. St´ınovac´ı programy vhodn´e pro vlasy neb´ yvaj´ı souˇc´ ast´ı standardn´ıho vybaven´ı vykreslovac´ıch program˚ u. Jak bylo naps´ano v ˇc´asti 5.3.1, RenderMan pouˇz´ıv´a surface shaders, kter´e renderer vol´a po vyˇsetˇren´ı viditelnosti. St´ınovac´ı programy se implementuj´ı v jazyce RSL. Kaˇzd´ y shader je pˇreloˇzen do bajtk´odu a interpretov´an pˇri vykreslov´ an´ı. 3Delight zde nab´ız´ı zaj´ımavou moˇznost automatick´eho pˇrekladu z RSL do C++ (viz ˇc´ ast 7.1). Takto pˇreloˇzen´ y st´ınovac´ı program potom m˚ uˇze b´ yt velmi efektivn´ı. ´ Ukolem st´ınovac´ıho programu je vr´ atit barvu fragmentu osvˇetlovan´eho povrchu v z´avislosti na pozici pozorovatele a jednotliv´ ych svˇetel. Light Source
E
Vantage Point N
L
Illuminance Cone
I dPdu
P (u,v)
dPdv
Primitive Surface
Obr´azek 6.5: Pracovn´ı prostˇred´ı surface shader v RenderMan. Obr´azek pˇrejat z [Pix05].
Jm´eno Cs Os P dPdv u, v s, t L Cl Ol I Ci Oi
Typ color color point vector float float vector color color vector color color
Popis Z´ akladn´ı barva povrchu Z´ akladn´ı nepr˚ usvitnost povrchu Souˇradnice st´ınovan´eho bodu povrchu Derivace povrchu v m´ıstˇe P podle v (odpov´ıd´a tangentˇe vlasu) Parametrizace povrchu Souˇradnice textury (stejn´e v r´amci jednoho vlasu) Vektor ke svˇetlu Barva paprsku pˇr´ıchoz´ıho ze svˇetla Nepr˚ usvitnost paprsku pˇr´ıchoz´ıho ze svˇetla Vektor k pozorovateli V´ ysledn´ a barva smˇerem k pozorovateli V´ ysledn´ a nepr˚ usvitnost smˇerem k pozorovateli
Tabulka 6.3: Popis parametr˚ u prostˇred´ı surface shader d˚ uleˇzit´ ych pro vlasov´ y st´ınovac´ı program. Kompletn´ı popis je moˇzn´e nal´ezt v [Pix05]
KAPITOLA 6. IMPLEMENTACE
45
Na obr´azku 6.5 je nakresleno pracovn´ı prostˇred´ı surface shader. V tabulce 6.3 je popis jednotliv´ ych parametr˚ u, kter´e jsou potˇreba pro vlasov´ y st´ınovac´ı program. Pˇri st´ınov´an´ı jiˇz nem´ame ˇz´ adn´e glob´ aln´ı informace o vlasov´e geometrii, ale pouze lok´aln´ı informace o st´ınovan´em ´ bodu. Upln´ y popis st´ınovac´ıch program˚ u v RenderMan lze naj´ıt v [Pix05]. 6.4.1
Kajiya & Kay
Zde je uvedena cel´ a implementace v jazyce RSL osvˇetlovac´ıho modelu Kajiya & Kay, kter´ y byl pops´an v ˇc´ asti 3.1: surface kajiya( float Ka = 0.1; // statick´ a ambientn´ ı sloˇ zka float Kd = 0.7; // dif´ uzn´ ı sloˇ zka float Ks = 0.2; // zrcadlov´ a sloˇ zka float Roughness = 0.05; // ostrost zrcadlov´ eho odrazu color RootColor = color(0.517, 0.383, 0.259); // barva vlas˚ u u koˇ rene string RootColorMap = ""; color TipColor = color(0.517, 0.383, 0.259); // barva vlas˚ u na ˇ spiˇ cce string TipColorMap = ""; color SpecularColor = color(0.916, 0.762, 0.620); // barva zrcadlov´ e sloˇ zky color TipOpacity = color(0.1); // pr˚ uhlednost na ˇ spiˇ cce ) { // z´ ısk´ an´ ı barev z textury color root = Cs * RootColor; if(RootColorMap != "") root *= texture(RootColorMap, s, t); color tip = Cs * TipColor; if(TipColorMap != "") tip *= texture(TipColorMap, s, t); // v´ ypoˇ cet a nepr˚ usvitnosti barvy interpolac´ ı color finalColor = mix(root, tip, v); color finalOpacity = mix(color(1), TipOpacity, v); vector T = normalize(dPdv); // vector V = -normalize(I); // float TV = T . V; // float sTV = sqrt(1.0 - TV*TV); // float invRough = 1.0 / Roughness;
tangenta vlasu vektor k pozorovateli skal´ arn´ ı souˇ cin sin(T,V)
// v´ ypoˇ cet osvˇ etlen´ ı ze vˇ sech svˇ etel color Cspec = 0, Cdiff = 0; illuminance(P) { vector nL = normalize(L); float TL = T . nL; float sTL = sqrt(1.0-TL*TL); // sin(T,L) Cdiff += Cl * sTL; Cspec += Cl * pow(TL*TV + sTL*sTV, invRough); } Oi = Os * finalOpacity; color amb = Ka * ambient() * finalColor; color diff = Kd * Cdiff * finalColor; color spec = Ks * Cspec * SpecularColor; Ci = (amb + diff + spec) * Oi; }
// // // // //
v´ ysledn´ a nepr˚ usvitnost statick´ a ambientn´ ı sloˇ zka dif´ uzn´ ı sloˇ zka zrcadlov´ a sloˇ zka v´ ysledn´ a barva
46
KAPITOLA 6. IMPLEMENTACE
Kaˇzd´ y surface shader mus´ı obsahovat deklaraci st´ınovac´ı funkce surface a v´ ychoz´ı nastaven´ı parametr˚ u. Tyto parametry lze nastavovat prostˇrednictv´ım grafick´eho rozhran´ı v Maye ystupem kaˇzd´eho programu pro st´ınov´an´ı povrchu je vˇzdy barva Ci a nepr˚ usvitnost [3De07b]. V´ Oi. Barva vlasu jako vstup do osvˇetlovac´ıho modelu se z´ısk´a interpolac´ı barvy u koˇrene resp. na ˇspiˇcce vlasu (promˇenn´ a finalColor). Barvu u koˇrene resp. na ˇspiˇcce je moˇzn´e naˇc´ıst z textury (RootColorMap resp. TipColorMap). Souˇradnice (s, t) odpov´ıdaj´ı parametrizaci plochy v m´ıstˇe odkud vlas vyr˚ ust´a. Kaˇzd´ y vlas tak m˚ uˇze m´ıt jinou barvu – urˇcenou z textury. Pokud nejsou textury k dispozici, pouˇzij´ı se uniformn´ı parametry RootColor resp. TipColor. Ve st´ınovac´ım programu je tak´e implementov´ano nastaviteln´e sniˇzov´an´ı pr˚ uhlednosti vlasu na jeho konci (viz v´ ypoˇcet finalOpacity), coˇz se vyuˇz´ıv´a pro sn´ıˇzen´ı aliasingu na tenk´e ˇspiˇcce vlasu. D´ale n´asleduje vlastn´ı v´ ypoˇcet sloˇzek osvˇetlen´ı dle Kajiya & Kay, z praktick´ ych d˚ uvod˚ u byl model doplnˇen o statickou ambientn´ı sloˇzku. V ˇc´asti illuminance se sˇc´ıtaj´ı pˇr´ıspˇevky od jednotliv´ ych svˇetel. Na z´avˇer je nutn´e v´ yslednou barvu Ci vyn´asobit vypoˇc´ıtanou nepr˚ usvitnost´ı Oi. Vlasy vykreslen´e pomoc´ı tohoto st´ınovac´ıho programu si m˚ uˇzete prohl´ednout v ˇc´asti 7.1. 6.4.2
Marschner
Implementace tohoto modelu byla teoreticky pops´ana v ˇc´asti 3.2. Je tˇreba vytvoˇrit ˇreˇsitel kubick´e rovnice a jedn´ım z probl´em˚ um m˚ uˇze b´ yt urˇcen´ı vektor˚ u tvoˇr´ıc´ıch souˇradn´ y syst´em vlasu. Ve st´ınovac´ım programu m´ ame totiˇz k dispozici pouze tangentu a Marschner˚ uv model potˇrebuje jeˇstˇe vektor urˇcuj´ıc´ı orientaci vlasu. Je moˇzn´e pouˇz´ıt n´ahodn´ y vektor, kter´ y je kolm´ y na tangentu. Tento vektor mus´ı b´ yt spojit´ y v r´amci vlasu. Pro inicializaci gener´ atoru n´ ahodn´ ych ˇc´ısel m˚ uˇzeme pouˇz´ıt (s, t) souˇradnice textury, kter´e jsou pro kaˇzd´e vl´ akno unik´ atn´ı. Bohuˇzel v RSL nen´ı k dispozici dostateˇcnˇe kvalitn´ı gener´ator n´ahodn´ ych ˇc´ısel. Pouˇzil jsem tento k´ od, kter´ y d´ av´ a pˇrijateln´e v´ ysledky: // pseudon´ ahodn´ e ˇ c´ ıslo (0, 1) float rand(float seed) { float next = seed * 1103515245 + 12345; return mod((next/65536), 32768) / 32767; } // unik´ atn´ ı identifik´ ator vlasu urˇ cen´ y pomoc´ ı souˇ radnic do textury (s, t) float hairID = s*4095 + t*16777215; // ´ uhel, kter´ y se pouˇ zije pro n´ ahodnou rotaci kolm´ eho vektoru float rnd = ( rand(hairID) + noise(hairID) ) * 180;
Pomoc´ı souˇradnic (s, t) se vypoˇcte unik´ atn´ı identifik´ator vlasu hairID, kter´ y slouˇz´ı pro inicializaci gener´atoru pseudon´ ahodn´ ych ˇc´ısel s rovnomˇern´ ym rozdˇelen´ım rand(). Tato jednoduch´a funkce je pˇr´ıliˇs systematick´ a, proto jsem pouˇzil jeˇstˇe vestavˇenou ˇsumovou funkci RSL noise(),
KAPITOLA 6. IMPLEMENTACE
47
kter´a samostatnˇe tak´e ned´ av´ a dobr´e v´ ysledky. Promˇenn´a rnd je u ´hel 0◦ aˇz 360◦ , kter´ y se d´ ale pouˇzije pro rotaci souˇradn´eho syst´emu (viz ˇc´ast 3.2.1). Na ,,kvalitˇe” n´ahodn´e rotace z´ avis´ı kaustiky v sekund´ arn´ım odrazu (tˇrpyt vlas˚ u). Cel´a implementace Marschnerova modelu je pomˇernˇe rozs´ahl´a a v´ ysledn´ y st´ınovac´ı program je o dost pomalejˇs´ı neˇz Kajiya & Kay. Vlasy vykreslen´e pomoc´ı tohoto st´ınovac´ıho programu si m˚ uˇzete prohl´ednout v ˇc´asti 7.1.
48
KAPITOLA 6. IMPLEMENTACE
´ KAPITOLA 7. VYSLEDKY
49
7 V´ ysledky Vykreslov´ an´ı vˇsech sc´en prob´ıhalo pomoc´ı 3Delight RenderMan na poˇc´ıtaˇci Intel Core 2 Duo 2.13 GHz s 2 GB pamˇeti.
7.1
Osvˇ etlovac´ı modely
V t´eto ˇc´ asti uv´ ad´ım nˇekolik obr´ azk˚ u jako uk´azku st´ınovac´ıch program˚ u implementovan´ ych vlasov´ ych osvˇetlovac´ıch model˚ u.
(a) Kajiya & Kay
(b) Marschner
Obr´azek 7.1: Porovn´ an´ı implementac´ı osvˇetlovac´ıch model˚ u. Model Kajiya & Kay neobsahuje sekund´arn´ı odraz, Marschner˚ uv model zase dif´ uzn´ı sloˇzku.
(a) R – Prim´ arn´ı odraz
(b) TRT – Sekund´arn´ı odraz
Obr´ azek 7.2: Sloˇzky Marschnerova osvˇetlovac´ıho modelu.
´ KAPITOLA 7. VYSLEDKY
50
Pouˇzit´ y model obsahuje 50 000 vlas˚ u, rozliˇsen´ı obr´azku bylo 1400 × 1050 a vzorkov´an´ı pixelu 8 × 8. Rozliˇsen´ı st´ınov´e mapy bylo 512 × 512 a vzorkov´an´ı 8 × 8. V´ ykonnostn´ı srovn´an´ı osvˇetlovac´ıch model˚ u je v tabulce 7.1. Obr´ azek
Osvˇetlovac´ı Model
7.1 (a)
Kajiya & Kay
7.1 (b)
Marschner˚ uv
Pˇreklad RSL C++ RSL C++
ˇ (min) Cas 5:42 5:38 8:31 7:17
Tabulka 7.1: Porovn´ an´ı rychlosti osvˇetlovac´ıch model˚ u. St´ınovac´ı programy byly pˇreloˇzeny do bajtk´odu (RSL) a do strojov´eho k´ odu (C++). Uveden´e ˇcasy zahrnuj´ı pouze z´avˇereˇcn´ y pr˚ uchod (tj. bez generov´ an´ı RIBu a st´ınov´e mapy). St´ınovac´ı programy lze pˇreloˇzit do bajtk´ odu, kter´ y je interpretov´an pˇri vykreslov´an´ı: shaderdl kajiya.sl Pro zv´ yˇsen´ı rychlosti st´ınov´ an´ı podporuje 3Delight pˇreklad do strojov´eho k´odu: shaderdl --dso -O3 kajiya.sl Tento pˇr´ıkaz nejprve pˇrevede RSL na C++ k´od, kter´ y je pot´e pˇreloˇzen do strojov´eho k´odu (napˇr´ıklad Visual Studiem ˇci jin´ ym pˇrekladaˇcem) [3De07a]. Oba typy pˇrekladu jsem otestoval. Urychlen´ı st´ınov´ an´ı je patrn´e pouze u Marschnerova modelu, u jednoduch´ ych st´ınovac´ıch program˚ u typu Kajiya & Kay se pˇreklad do strojov´eho k´odu nevyplat´ı. Vizu´aln´ı srovn´an´ı obou osvˇetlovac´ıch model˚ u je na obr´azku 7.1. Na obr´azku 7.2 jsou vidˇet jednotliv´e sloˇzky (R a TRT) Marschnerova modelu. Ve sc´enˇe bylo pouˇzito pouze jedno svˇetlo (pˇribliˇznˇe v pozici kamery). Z obr´ azk˚ u je patrn´e, ˇze model Kajiya & Kay neobsahuje sekund´arn´ı odraz TRT (tˇrpyt vlas˚ u) a Marschner˚ uv model zase dif´ uzn´ı sloˇzku.
(a) s dif´ uzn´ı sloˇzkou
(b) bez dif´ uzn´ı sloˇzky
Obr´azek 7.3: Marschner˚ uv model vˇcetnˇe zadn´ıho nasv´ıcen´ı (TT sloˇzka). Bez dif´ uzn´ı sloˇzky je nasv´ıcen´ı pomoc´ı dvou svˇetel vˇetˇsinou nedostateˇcn´e.
Obr´azek 7.3 obsahuje i TT sloˇzku, tj. zadn´ı nasv´ıcen´ı zp˚ usoben´e svˇetlem um´ıstˇen´ ym za modelem vlas˚ u proti kameˇre. Bez dif´ uzn´ı sloˇzky je obr´azek nedostateˇcnˇe osvˇetlen. Pro samostatn´ y Marschner˚ uv model by bylo nutn´e pouˇz´ıt komplexn´ı environment mapu pro nasv´ıcen´ı, coˇz
´ KAPITOLA 7. VYSLEDKY
51
by bylo v´ ypoˇcetnˇe ne´ unosn´e. Proto je ˇcasto implementace doplnˇena o dif´ uzn´ı sloˇzku (zde vypoˇctenou pomoc´ı norm´ alov´eho vektoru povrchu – ,,Myˇs´ak Stuart”, viz ˇc´ast 3.1.1). Marschner˚ uv model je pomalejˇs´ı oproti jednoduch´emu st´ınovac´ımu programu Kajiya & Kay. Pˇresto se v produkci pouˇz´ıv´ a Marschner, protoˇze dosahuje realistiˇctˇejˇs´ıch v´ ysledk˚ u d´ıky efekt˚ um – sekundarn´ı odraz (tˇrpyt vlas˚ u) a zadn´ı nasv´ıcen´ı. Oba modely se daj´ı kombinovat, typicky je implementov´ ana dif´ uzn´ı sloˇzka jako doplnˇek Marschnera.
7.2 7.2.1
Simplifikace Animovan´ y vlk
Pro otestov´ an´ı simplifikace jsem zvolil sc´enu se 100 000 chlupy a tˇremi svˇetly. Ve skuteˇcnˇe re´aln´e sc´enˇe m˚ uˇze b´ yt i mili´ on chlup˚ u a pˇres deset svˇetel. Z ˇcasov´ ych d˚ uvod˚ u jsem zvolil menˇs´ı sc´enu, protoˇze bylo nutn´e otestovat animaci. I tak trvalo vykreslov´an´ı na pouˇzit´em poˇc´ıtaˇci ˇr´adovˇe hodiny. Pro st´ınov´ an´ı jsem pouˇzil Kajiya & Kay i Marschner˚ uv model. Cel´a sekvence m´ a 192 sn´ımk˚ u (8 sekund), kamera se postupnˇe vzdaluje od animovan´eho vlka. Rozliˇsen´ı sn´ımk˚ u je 768 × 576 (PAL), vzorkov´an´ı pixelu 4 × 4. St´ınov´e mapy (deep shadow maps) mˇely rozliˇsen´ı 512 × 512 a vzorkov´an´ı 8 × 8. Nastaven´ı parametr˚ u simplifikace (v´ yznam parametr˚ u je v pˇr´ıloze B.3): Number Of Pixels: Half Ratio: Transition Region: Minimum Of Hair: Maximum Of Hair:
Color pass 100 000 0.4 0.2 0.1 –
Shadow pass 100 000 0.4 0.2 0.05 0.3
Simplifikace ve st´ınov´em pr˚ uchodu z´avis´ı na pozici svˇetla a protoˇze se vlk v˚ uˇci svˇetlu pˇr´ıliˇs nepohybuje, je t´emˇeˇr celou sekvenci konstantn´ı. Na st´ıny ovˇsem nen´ı lidsk´e oko tak citliv´e, ve st´ınov´ ych pr˚ uchodech lze proto zjednoduˇsovat agresivnˇeji. V pouˇzit´ı sekvenci bylo kresleno pouze 10% chlup˚ u pro prvn´ı dvˇe svˇetla a asi 30% pro svˇetlo tˇret´ı, kter´e se nach´az´ı bl´ıˇze k modelu. ad´ım pro zaj´ımavost srovn´an´ı simplifikace v detailn´ım pohledu s referenˇcn´ı Na obr´azku 7.4 uv´ sc´enou. V b) jsou chlupy oproti a) viditelnˇe zvˇetˇseny.
(a) Referenˇcn´ı
(b) Simplifikace (20% chlup˚ u)
Obr´ azek 7.4: Srovn´ an´ı simplifikace v detailn´ım pohledu s referenˇcn´ı sc´enou.
´ KAPITOLA 7. VYSLEDKY
52
Prvn´ıch 40 sn´ımk˚ u animace je pomˇernˇe detailn´ı z´abˇer, takˇze simplifikace se v z´avˇereˇcn´em pr˚ uchodu vykreslov´ an´ı pˇr´ıliˇs neuplatˇ nuje. Se vzr˚ ustaj´ıc´ı vzd´alenost´ı roste pomalu i simplifikace – aˇz na koneˇcn´ ych 20% zobrazen´ ych chlup˚ u (asi od 150. sn´ımku). Vykreslen´ı cel´e sekvence trvalo (v hodin´ ach): Osvˇetlovac´ı model Kajiya & Kay Marschner
Referenˇcn´ı Simplifikace 3:36:05 2:05:19 4:34:45 2:47:27
Pomˇer 0.58 0.61
Do ˇcas˚ u nen´ı zapoˇc´ıt´ ano generov´ an´ı RIB soubor˚ u s chlupy v kaˇzd´em sn´ımku, kter´e dohromady trvalo 51:42 minut. Shave od verze 5.0 podporuje v´ıce-vl´aknov´e generov´an´ı RIBu. Vyt´ıˇzen´ı obou procesor˚ u bylo celou dobu jen 50%! Pravdˇepodobnˇe se jedn´a o chybu nebo ˇspatn´e nastaven´ı Shave a v´ ysledn´ y ˇcas by mohl b´ yt poloviˇcn´ı pˇri pln´em vyt´ıˇzen´ı obou procesor˚ u. Nyn´ı se pod´ıvejme bl´ıˇze na tˇri vybran´e sn´ımky (1, 95 a 155), kter´e se liˇs´ı vzd´alenost´ı kamery od modelu. Srovn´ an´ı simplifikace s referenˇcn´ı sc´enou je na obr´azku 7.6 (Kajiya & Kay model) a na obr´azku 7.7 (Marschner˚ uv model). Pr˚ uchod St´ınov´ y1 St´ınov´ y2 St´ınov´ y3 Z´avˇereˇcn´ y P
Referenˇcn´ı Kajiya Marschner 12.85 14.56 7.84 7.97 16.39 15.75 58.55 112.38 95.63 150.66
Simplifikace Chlup˚ u Kajiya Marschner 10% 3.35 3.66 10% 2.90 3.19 29.2% 10.78 10.83 100% 58.27 112.04 – 75.3 129.72
Bez chlup˚ u 2.82 2.47 9.01 10.55 24.85
Tabulka 7.2: Doba vykreslov´an´ı sn´ımku 1 (ˇcasy jsou v sekund´ach). Pr˚ uchod St´ınov´ y1 St´ınov´ y2 St´ınov´ y3 Z´avˇereˇcn´ y P
Referenˇcn´ı Kajiya Marschner 13.41 13.26 11.51 10.26 16.08 15.88 29.67 47.4 70.67 86.8
Simplifikace Chlup˚ u Kajiya Marschner 11.8% 3.65 3.69 10% 3.19 3.23 33.2% 11.30 11.08 50.5% 18.39 27.73 – 36.53 45.73
Bez chlup˚ u 2.82 2.41 8.67 8.65 22.55
Tabulka 7.3: Doba vykreslov´an´ı sn´ımku 95 (ˇcasy jsou v sekund´ach). Pr˚ uchod St´ınov´ y1 St´ınov´ y2 St´ınov´ y3 Z´avˇereˇcn´ y P
Referenˇcn´ı Kajiya Marschner 10.97 9.66 9.76 8.83 17.79 17.16 24.98 34.86 63.5 70.51
Simplifikace Chlup˚ u Kajiya Marschner 10.6% 3.73 3.67 10% 3.19 3.30 31.9% 11.32 11.14 20% 8.17 11.29 – 26.41 29.4
Bez chlup˚ u 2.83 2.38 8.71 4.53 18.45
Tabulka 7.4: Doba vykreslov´ an´ı sn´ımku 155 (ˇcasy jsou v sekund´ach). Sn´ımek 1 je detailn´ı z´ abˇer ze zaˇc´ atku animace, namˇeˇren´e hodnoty jsou uvedeny v tabulce 7.2. Uvedeny jsou i ˇcasy vykreslov´ an´ı sc´eny bez chlup˚ u (tj. pouze s polygon´aln´ı geometrii modelu)
´ KAPITOLA 7. VYSLEDKY
53
a v procentech je poˇcet vykreslovan´ ych chlup˚ u (velikost simplifikace). Vid´ıme, ˇze zjednoduˇsen´ı je pouze ve st´ınov´ ych pr˚ uchodech. Sn´ımek 95 je pˇribliˇznˇe v polovinˇe cel´e sekvence. Namˇeˇren´e hodnoty jsou v tabulce 7.3. Kamera je jiˇz d´ale, takˇze simplifikovat lze nyn´ı i v z´avˇereˇcn´em pr˚ uchodu. Doba vykreslov´an´ı chlup˚ u ˇ v z´avˇereˇcn´em pr˚ uchodu tak klesla skoro na polovinu. Casy pro vytvoˇren´ı st´ınov´ ych map jsou pˇribliˇznˇe stejn´e jako v pˇredchoz´ım pˇr´ıpadˇe. Sn´ımek 155 je ze z´ avˇeru animace, kdy je v z´avˇereˇcn´em pr˚ uchodu vykreslov´ano pouze 20% chlup˚ u. Namˇeˇren´e hodnoty jsou v tabulce 7.4. Na pˇriloˇzen´em CD (viz pˇr´ıloha C) jsou pro srovn´an´ı uloˇzeny vykreslen´e animovan´e sekvence. D˚ uleˇzit´e je, ˇze v simplifikovan´ ych sekvenc´ıch nejsou vidˇet artefakty (popping efect) pˇri ,,mizen´ı” chlup˚ u. Nastaven´ı simplifikace bylo provedeno tak, aby v´ ysledn´ y obr´azek byl t´emˇeˇr k nerozezn´an´ı od p˚ uvodn´ıho modelu se vˇsemi chlupy. P˚ uvodn´ı model ovˇsem div´ak nevid´ı, takˇze nem´a s ˇc´ım srovn´avat. Simplifikaci je tak moˇzn´e nastavit agresivnˇeji a doc´ılit vˇetˇs´ıho zrychlen´ı ˇ na vykreslen´ı sc´eny ,,bez Pouˇzit´a sc´ena neobsahuje pˇr´ıliˇs velk´e mnoˇzstv´ı chlup˚ u ani svˇetel. Cas chlup˚ u” tak nen´ı u ´plnˇe zanedbateln´ y. 7.2.2
Hromadn´ a sc´ ena
V pˇredchoz´ı sc´enˇe byl pomˇernˇe mal´ y poˇcet chlup˚ u a svˇetel. Pro lepˇs´ı zmˇeˇren´ı v´ ykonu simplifikace jsem proto pouˇzil sloˇzitˇejˇs´ı sc´enu. V t´eto hromadn´e sc´enˇe je celkem 1 000 000 chlup˚ ua 4 svˇetla (coˇz je maximum pˇri pouˇzit´ı voln´e licence 3Delight). Ve sc´enˇe se nach´az´ı deset vlk˚ u, kde kaˇzd´ y m´ a 100 000 chlup˚ u a byl osvˇetlen pomoc´ı Marschnerova modelu, kter´ y se pouˇz´ıv´ a v´ıce neˇz model Kajiya & Kay, protoˇze vykreslen´e obr´azky jsou re´alnˇejˇs´ı. Namˇeˇren´e hodnoty jsou uvedeny v tabulce 7.5. Vykresloval jsem pouze jeden sn´ımek. Referenˇcn´ı sc´ena a r˚ uznˇe simplifikovan´e sn´ımky jsou na obr´azc´ıch 7.8 a 7.9.
S1 S2 S3 S4 Z P
0% 6.86 4.19 4.99 5.09 6.38 27.51
23.3% 20.89 12.85 22.65 19.83 102.48 178.7
26.5% 20.6 12,85 22.81 20.01 109.1 185.37
32.4% 20.99 12.76 22.51 20.01 120.63 196.9
37.9% 20.48 12.83 22.37 20.01 135.59 211.28
47.9% 20.88 12.83 22.62 20.44 170.51 247.28
57.6% 22.1 13.11 22.39 20.66 194.6 272.86
73.4% 20.64 12.77 22.87 20.16 244.14 320.58
82.9% 20.69 13.06 22.84 20.44 269.72 346.75
100% 61.12 60.65 84.15 86.2 335.02 627.14
Tabulka 7.5: Doba vykreslov´ an´ı hromadn´e sc´eny v z´avislosti na poˇctu zobrazen´ ych chlup˚ u v z´avˇereˇcn´em pr˚ uchodu. V prvn´ım ˇr´adku jsou uvedena procenta zobrazen´ ych chlup˚ u v z´avˇereˇcn´em pr˚ uchodu. S1 aˇz S4 oznaˇcuj´ı st´ınov´e pr˚ uchody (pro simplifikovan´e sc´eny jsou ˇcasy pˇribliˇznˇe stejn´e), Z je z´ avˇereˇcn´ y pr˚ uchod. Vˇsechny ˇcasy jsou uvedeny v sekund´ach. Sloupec tabulky oznaˇcen´ y jako 0% odpov´ıd´a sc´enˇe bez chlup˚ u a 100% referenˇcn´ı sc´enˇe se vˇsemi chlupy. Uveden´ a procenta jsou pomˇer zobrazen´ ych chlup˚ u ku celkov´emu poˇctu v z´avˇereˇcn´em pr˚ uchodu. Vlci jsou v r˚ uzn´ ych vzd´ alenostech od kamery, takˇze chlupy nejsou u ´plnˇe rovnocenn´e. Uveden´a procenta tak berme jako orientaˇcn´ı. Simplifikace st´ınov´ ych map byla ve vˇsech pˇr´ıpadech kromˇe referenˇcn´ıho sn´ımku nastavena na stejnou hodnotu. Opˇet se ukazuje, ˇze ve st´ınov´em pr˚ uchodu lze simplifikovat daleko agresivnˇeji neˇz v z´avˇereˇcn´em. Vykreslov´ an´ı st´ınov´ ych map tak lze urychlit na ˇctvrtinu ˇci dokonce jeˇstˇe
´ KAPITOLA 7. VYSLEDKY
54
m´enˇe p˚ uvodn´ı doby bez v´ yrazn´e zmˇeny vizu´aln´ı kvality! To je velmi d˚ uleˇzit´e zjiˇstˇen´ı, protoˇze v re´alnˇe sc´enˇe m˚ uˇze b´ yt i pˇres deset svˇetel. Vykreslov´an´ı st´ınov´ ych map pak m˚ uˇze trvat delˇs´ı dobu neˇz samotn´ y z´ avˇereˇcn´ y pr˚ uchod. Na obr´azku 7.5 je graf doby vykreslov´ an´ı (jen z´avˇereˇcn´ y pr˚ uchod) v z´avislosti na velikosti simplifikace. Rychlost roste pˇribliˇznˇe line´arnˇe s velikost´ı simplifikace a algoritmus m´a velmi n´ızk´e n´aklady. 100
90
80
Zobrazených chlupů [%]
70
60
50
40
30
20
10
0 0
50
100
150
200
250
300
350
Čas [s]
Obr´azek 7.5: Graf doby vykreslov´ an´ı z´ avˇereˇcn´eho pr˚ uchodu v z´avislosti na velikosti simplifikace (procentu zobrazen´ ych chlup˚ u).
´ KAPITOLA 7. VYSLEDKY
(a) Referenˇcn´ı
55
(b) Simplifikace
Obr´azek 7.6: Vlk osvˇetlen´ y pomoc´ı modelu Kajiya & Kay. V prvn´ım ˇr´adku je sn´ımek 1, v druh´em sn´ımek 95 a ve tˇret´ım sn´ımek 155. Vlevo je referenˇcn´ı sn´ımek a vpravo simplifikovan´ a verze (1. ˇr´ adek – 100% chlup˚ u, 2. ˇr´ adek – 50% a 3. ˇr´adek – 20% v z´avˇereˇcn´em pr˚ uchodu).
´ KAPITOLA 7. VYSLEDKY
56
(a) Referenˇcn´ı
(b) Simplifikace
Obr´azek 7.7: Vlk osvˇetlen´ y pomoc´ı Marschnerova modelu. V prvn´ım ˇr´adku je sn´ımek 1, v druh´em sn´ımek 95 a ve tˇret´ım sn´ımek 155. Vlevo je referenˇcn´ı sn´ımek a vpravo simplifikovan´a verze (1. ˇr´adek – 100% chlup˚ u, 2. ˇr´ adek – 50% a 3. ˇr´adek – 20% v z´avˇereˇcn´em pr˚ uchodu).
´ KAPITOLA 7. VYSLEDKY
57
Obr´azek 7.8: Hromadn´ a sc´ena s vlky. V prvn´ım ˇr´adku je referenˇcn´ı sn´ımek (100% chlup˚ u, 10:27 minut), v druh´em simplifikovan´ y (73.4% chlup˚ u, 5:21 minut).
58
´ KAPITOLA 7. VYSLEDKY
Obr´azek 7.9: Hromadn´ a sc´ena s vlky. V prvn´ım ˇr´adku je simplifikovan´ y sn´ımek (47.9% chlup˚ u, 4:07 minut), v druh´em (23.3% chlup˚ u, 2:58 minut).
´ ER ˇ KAPITOLA 8. ZAV
59
8 Z´ avˇ er V t´eto diplomov´e pr´ aci jsem se zab´ yval efektivn´ım zobrazov´an´ım vlas˚ u a chlup˚ u. Tento probl´em je i v dneˇsn´ı dobˇe st´ ale aktu´ aln´ı. Vlas˚ u a chlup˚ u b´ yv´a v realistick´ ych hromadn´ ych sc´en´ ach ohromn´e mnoˇzstv´ı, coˇz dok´ aˇze zamˇestnat dneˇsn´ı a pravdˇepodobnˇe i budouc´ı generace poˇc´ıtaˇc˚ u. Popsal jsem tˇri nejbˇeˇznˇejˇs´ı vykreslovac´ı algoritmy (Z-buffer, ray tracing, reyes) v kontextu zobrazov´ an´ı vlas˚ u. Pˇri produkˇcn´ım vykreslov´an´ı se ˇcasto pouˇz´ıv´a standard RenderMan, kter´ y pouˇz´ıv´a algoritmus reyes. Cel´ a implementace je proto urˇcena pro komerˇcn´ı renderer, kter´ y je zaloˇzen pr´ avˇe na tomto standardu. Teoreticky jsem rozebral dva nejzn´ amˇejˇs´ı osvˇetlovac´ı modely, kter´e se v souˇcasnosti pouˇz´ıvaj´ı ˇ asteˇcnˇe byla zm´ınˇena i r˚ pro st´ınov´ an´ı vlas˚ u. C´ uzn´a rozˇs´ıˇren´ı a u ´pravy tˇechto z´akladn´ıch model˚ u. Osvˇetlovac´ı model Kajiya & Kay je z roku 1989, a pˇresto se dodnes hojnˇe pouˇz´ıv´a. Jeho v´ yhodou je jednoduchost, snadn´ a implementace a rychlost. Novˇejˇs´ı Marschner˚ uv model je sloˇzitˇejˇs´ı a pomalejˇs´ı. Dosahuje ale mnohem realistiˇctˇejˇs´ıch v´ ysledk˚ u neˇz star´ y model. Predikuje totiˇz nov´e efekty, jako je sekund´arn´ı odraz (barevn´ y tˇrpyt) a zadn´ı nasv´ıcen´ı. Model Kajiya & Kay i Marschner˚ uv model se podaˇrilo implementovat pro RenderMan jako st´ınovac´ı programy a jiˇz je pouˇz´ıv´a studio UPP (Universal Production Partners). Z metod pro zrychlen´ı zobrazov´ an´ı jsem vybral stochastickou simplifikaci, kter´a je vhodn´a pro implementaci do vykreslovac´ıho programu standardu RenderMan. Zde jsem vyuˇzil moˇznosti modifikovat zobrazovac´ı ˇretˇezec prostˇrednictv´ım procedur´aln´ıch primitiv. V´ ysledn´ y program spolupracuje s grafick´ ym editorem Autodesk Maya, z´asuvn´ ym modulem Shave and a Haircut a vykreslovac´ım programem 3Delight RenderMan. Vˇsechny uveden´e aplikace se pouˇz´ıvaj´ı v produkˇcn´ım prostˇred´ı. Vytvoˇren´ y program nijak dramaticky nemˇen´ı zaˇzit´e postupy pro tvorbu chlup˚ u v produkci, a m˚ uˇze tak b´ yt nasazen pro optimalizaci vykreslov´ an´ı ve filmu. Co se t´ yˇce v´ ykonnosti simplifikaˇcn´ıho algoritmu, bylo dosaˇzeno oˇcek´avan´eho line´arn´ıho zrychlen´ı (poloviˇcn´ı poˇcet vlas˚ u se vykresluje poloviˇcn´ı dobu). D˚ uleˇzit´a je moˇznost agresivn´ı simplifikace st´ınov´ ych map, kdy st´ıny nemaj´ı podstatn´ y vliv na vizu´aln´ı kvalitu. I vykreslov´ an´ı detailn´ıch z´ abˇer˚ u je proto moˇzn´e v´ yraznˇe urychlit. N´amˇetem pro moˇzn´e rozˇs´ıˇren´ı pr´ ace je implementace n´astroje pro modelov´an´ı vlas˚ u, kter´ y by tak nahradil z´ asuvn´ y modul Shave and a Haircut. Potom by bylo moˇzn´e vlasy generovat aˇz pˇr´ımo pˇri vykreslov´ an´ı v mnoˇzstv´ı dle velikosti simplifikace. Simplifikaˇcn´ı algoritmus by mohl b´ yt vylepˇsen napˇr´ıklad o podporu efekt˚ u rozostˇren´ı pohybem (motion blur) a hloubky ostrosti (depth of field). Tyto efekty samozˇrejmˇe mohou tak´e ovlivˇ novat velikost simplifikace. Bohuˇzel implementace by vyˇzadovala daleko vˇetˇs´ı modifikace zobrazovac´ıho ˇretˇezce, neˇz je moˇzn´e. Nelze totiˇz upravovat zdrojov´ y k´od komerˇcn´ıch aplikac´ı. Nav´ıc by byla nejsp´ıˇs nutn´ a i vˇetˇs´ı zmˇena zaveden´ ych postup˚ u pouˇz´ıvan´ ych v produkci.
60
´ ER ˇ KAPITOLA 8. ZAV
KAPITOLA 9. SEZNAM LITERATURY
61
9 Seznam literatury [3De07a]
The 3Delight Team. 3Delight 7.0 User’s Manual, 2007. http://www.3delight.com/en/uploads/docs/3delight/3delight.pdf.
[3De07b]
The 3Delight Team. 3Delight For Maya 3.0, 2007.
[Alt08]
Joseph Alter. Shave and a Haircut version 5.0, 2008. http://www.joealter.com/newSite/Manual50.pdf.
[Apo00]
Tony Apodaca. How PhotoRealistic RenderMan works. In SIGGRAPH 2000 Course 40: Advanced RenderMan 2: To RI INFINITY and Beyond, 2000.
[Bat03]
Dana Batali. The evolution of RIB: Plumbing the production pipeline. In SIGGRAPH 2003 Course 9: RenderMan, Theory and Practice, 2003.
[BK85]
Willem F. Bronsvoort and Fopke Klok. Ray tracing generalized cylinders. ACM Trans. Graph., 4(4):291–303, 1985.
[Bre00]
Rob Bredow. Fur in Stuart Little. In SIGGRAPH 2000 Course 40: Advanced RenderMan 2: To RI INFINITY and Beyond, 2000.
[CCC87]
Robert L. Cook, Loren Carpenter, and Edwin Catmull. The reyes image rendering architecture. In SIGGRAPH ’87: Proceedings of the 14th annual conference on Computer graphics and interactive techniques, pages 95–102, New York, NY, USA, 1987. ACM.
[CHPR07] Robert L. Cook, John Halstead, Maxwell Planck, and David Ryu. Stochastic simplification of aggregate detail. ACM Transaction Graphics, 26(3):79, 2007. [Eve01]
Cass Everitt. Interactive order-independent transparency. Technical report, NVidia Corporation, 2001. http://developer.nvidia.com/object/Interactive Order Transparency.html.
[GM03]
Laurent Grisoni and Damien Marchal. High performance generalized cylinders visualization. In SMI ’03: Proceedings of the Shape Modeling International 2003, page 257, Washington, DC, USA, 2003. IEEE Computer Society.
[Gol97]
Dan B. Goldman. Fake fur rendering. In SIGGRAPH ’97: Proceedings of the 24th annual conference on Computer graphics and interactive techniques, pages 127–134, New York, NY, USA, 1997. ACM Press/Addison-Wesley Publishing Co.
[Gou02]
David Gould. Complete Maya Programming: An Extensive Guide to MEL and C++ API (The Morgan Kaufmann Series in Computer Graphics). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 2002.
[Hop96]
Hugues Hoppe. Progressive meshes. In SIGGRAPH ’96: Proceedings of the 23rd annual conference on Computer graphics and interactive techniques, pages 99–108, New York, NY, USA, 1996. ACM.
[Kan04]
Paul Kanyuk. Implementing Marschner’s light scattering model for human hair fibers, 2004. University of Pennsylvania http://cg.cis.upenn.edu/∼pkanyuk/tech/hair paper.pdf.
[Kim03]
Tae-Yong Kim. Algorithms for hardware accelerated hair rendering, 2003. Rhythm & Hues Studio.
62
KAPITOLA 9. SEZNAM LITERATURY
[KK89]
J. T. Kajiya and T. L. Kay. Rendering fur with three dimensional textures. SIGGRAPH Computer Graphics, 23(3):271–280, 1989.
[KN01]
Tae-Yong Kim and Ulrich Neumann. Opacity shadow maps. In Proceedings of the 12th Eurographics Workshop on Rendering Techniques, pages 177–182, London, UK, 2001. Springer-Verlag.
[LV00]
Tom Lokovic and Eric Veach. Deep shadow maps. In SIGGRAPH ’00: Proceedings of the 27th annual conference on Computer graphics and interactive techniques, pages 385–392, New York, NY, USA, 2000. ACM Press/Addison-Wesley Publishing Co.
[MJC+ 03] Stephen R. Marschner, Henrik Wann Jensen, Mike Cammarano, Steve Worley, and Pat Hanrahan. Light scattering from human hair fibers. ACM Transactions on Graphics, 22(3):780–791, 2003. [Ney98]
Fabrice Neyret. Modeling, animating, and rendering complex scenes using volumetric textures. IEEE Transactions on Visualization and Computer Graphics, 4(1):55– 70, 1998.
[PF05]
Matt Pharr and Randima Fernando. GPU Gems 2: Programming Techniques for High-Performance Graphics and General-Purpose Computation (Gpu Gems). Addison-Wesley Professional, 2005.
[Pix97]
Pixar. Using Procedural Primitives in PhotoRealistic RenderMan, 1997. PhotoRealistic RenderMan Application Note #23.
[Pix05]
Pixar. The RenderMan Interface v3.2.1, 2005. https://renderman.pixar.com/products/rispec/rispec pdf/RISpec3 2.pdf.
[Ryu07]
David Ryu. 500 million and counting: hair rendering on Ratatouille. In SIGGRAPH ’07: ACM SIGGRAPH 2007 sketches, page 51, New York, NY, USA, 2007. ACM.
[Sch04]
Thorsten Scheuermann. Practical real-time hair rendering and shading. In SIGGRAPH ’04: ACM SIGGRAPH 2004 Sketches, page 147, New York, NY, USA, 2004. ACM.
[Str03]
David Stripinis. The MEL Companion: Maya Scripting for 3D Artists (Graphics Series). Charles River Media, 2003.
[ZBSF04] J. Zara, B. Benes, J. Sochor, and P. Felkel. Modern´ı poˇc´ıtaˇcov´ a grafika. Computer Press, Brno, 2nd edition, 2004. [Zin07]
Arno Zinke. Light scattering from filaments. IEEE Transactions on Visualization and Computer Graphics, 13(2):342–356, 2007. Member-Andreas Weber.
[ZSW04]
A. Zinke, G. Sobottka, and A. Weber. Photo-realistic rendering of blond hair. In B. Girod, M. Magnor, and H.-P. Seidel, editors, Vision, Modeling, and Visualization (VMV), pages 191–198. IOS Press, 2004.
ˇ ´ILOHA A. SEZNAM POUZIT ˇ YCH ´ PR ZKRATEK
A Seznam pouˇ zit´ ych zkratek 2D
Two-Dimensional
3D
Three-Dimensional
AABB
Axis-Aligned Bounding Box
API
Application Programming Interface
ASCII
American Standard Code for Information Interchange
BFSDF
Bidirectional Fiber Scattering Distribution Function
BRDF
Bidirectional Reflectance Distribution Function
CD
Compact Disc
DG
Dependency Graph
DLL
Dynamic Link Library
DSO
Dynamic Shared Object
FSAA
Full-Scene Anti-Aliasing
GB
Gigabyte
GHz
Gigahertz
GPU
Graphic Processing Unit
LOD
Level of Detail
MEL
Maya Embedded Language
PAL
Phase Alternating Line
RGB
Red, Green, Blue
RI
RenderMan Interface
RIB
RenderMan Interface Bytestream
RSL
RenderMan Shading Language
SDK
Software Development Kit
SIMD
Single Instruction, Multiple Data
UPP
Universal Production Partners
VRML
Virtual Reality Modeling Language
63
64
ˇ ´ILOHA A. SEZNAM POUZIT ˇ YCH ´ PR ZKRATEK
ˇ ´ILOHA B. UZIVATELSK ˇ ´ PR ˇ ´IRUCKA ˇ PR A
65
B Uˇ zivatelsk´ a pˇ r´ıruˇ cka Tato uˇzivatelsk´ a pˇr´ıruˇcka pˇredpokl´ ad´a znalost pr´ace s aplikacemi Autodesk Maya, Shave and a Haircut a 3Delight RenderMan. Zde je uveden postup, kter´ ym se odliˇsuje simplifikace od standardn´ıho vykreslov´ an´ı vlas˚ u. Detailn´ı popis modelov´an´ı pomoc´ı Shave lze nal´ezt v [Alt08], vykreslov´ an´ı pomoc´ı 3Delight for maya v [3De07b].
B.1
Instalace
Instalace podpory simplifikace se provede zkop´ırov´an´ım tˇechto soubor˚ u do adres´aˇr˚ u: furSimplification.mll AEfurSimplificationTemplate.mel furSimplification.mel
-> -> ->
$MAYA_LOCATION\bin\plug-ins $MAYA_LOCATION\scripts\AETemplates $MAYA_LOCATION\scripts\others
$MAYA_LOCATION je adres´ aˇr instalace s Mayou, ve Windows standardnˇe: C:\Program Files\Autodesk\Maya D´ale je nutn´e zkop´ırovat soubor furProc.dll na jak´ekoliv m´ısto, kde bude pˇr´ıstupn´ y vykreslovac´ımu programu 3Delight.
B.2
Nastaven´ı v Maye
Nejprve je tˇreba inicializovat z´ asuvn´ y modul furSimplification v Maye, napˇr´ıklad pomoc´ı menu: Window -> Settings/Preferences -> Plug-in Manager ale Klasick´ ym postupem vytvoˇr´ıme sc´enu s vlasy pomoc´ı Shave and a Haircut [Alt08]. D´ vytvoˇr´ıme nov´ y render pass pomoc´ı: 3Delight -> Add Render Pass Do nastaven´ı MEL Scripts -> Pre Frame MEL zap´ıˇseme: eval("shaveWriteRib \"" + "C:/shave/hair." + ‘currentTime -query‘ + ".rib" + "\""); eval("shaveWriteRibProc \"" + "C:/shave/hair." + ‘currentTime -query‘ + ".rib"+"\"");
Prvn´ı pˇr´ıkaz slouˇz´ı pro vygenerov´ an´ı RIBu vlas˚ u pomoc´ı Shave, tento pˇr´ıkaz je nutn´e uv´est i bez pouˇzit´ı simplifikace. RIB bude v tomto pˇr´ıpadˇe uloˇzen do adres´aˇre C:/shave/. Konstrukce ‘currentTime -query‘ slouˇz´ı pro vytvoˇren´ı unik´atn´ıho jm´ena souboru pro kaˇzd´ y sn´ımek, kdy RIB se samozˇrejmˇe generuje znovu, protoˇze vlasy mohou b´ yt animovan´e. Je nutn´e pouˇz´ıt voxelov´e generov´ an´ı vlas˚ u [Alt08]! Druh´ y pˇr´ıkaz je nov´ y a provede u ´pravu vygenerovan´eho RIBu pro pouˇzit´ı simplifikace. Samotn´e generov´an´ı RIBu m˚ uˇze trvat pomˇernˇe dlouhou dobu. Pokud m´ame RIB jiˇz vygenerov´an, je moˇzn´e prvn´ı pˇr´ıkaz vynechat a spouˇstˇet pouze druh´ y pro ovl´ad´an´ı simplifikace. Pro spr´avnou funkci simplifikace pˇri vykreslov´an´ı deep shadow maps, mus´ıme oznaˇcit st´ınov´ y pr˚ uchod v uzlu Light Attribute Node. Do nastaven´ı tohoto uzlu MEL Scripts -> Pre Render MEL zap´ıˇseme: RiAttribute -n "user" -p "renderpass" "string" "shadow"; A jeˇstˇe do MEL Scripts -> Post Render MEL: RiAttribute -n "user" -p "renderpass" "string" "final";
ˇ ´ILOHA B. UZIVATELSK ˇ ´ PR ˇ ´IRUCKA ˇ PR A
66
D´ale je samozˇrejmˇe nutn´e zajistit pouˇzit´ı vygenerovan´eho RIB pˇri vykreslov´an´ı. To lze prov´est pomoc´ı uzlu 3Delight for maya pro vloˇzen´ı RIBu – RIB Archive Node. St´ınovac´ı program apy jako v pˇr´ıpadˇe vykreslov´an´ı likujeme pomoc´ı Shader Manager [3De07a] – tento postup je stejn´ bez simplifikace.
B.3
Nastaven´ı simplifikace
Do nastaven´ı simplifikace se dostaneme pomoc´ı menu v Maye: Fur Simplification -> Settings
Obr´ azek B.1: Uˇzivatelsk´e rozhran´ı pro nastaven´ı simplifikace.
Color pass Shadow pass Turn On Simplification Number Of Pixels Half Ratio
Transition Region Minimum Of Hair Maximum Of Hair DLL Filename Log Filename Reset To Defaults
Nastaven´ı pro pr˚ uchod, pˇri kter´em je jiˇz kreslen obr´azek Nastaven´ı pro st´ınov´ y pr˚ uchod (vykreslov´an´ı deep shadow maps) Zapnout/vypnout simplifikaci Poˇcet pixel˚ u, kde simplifikace zaˇc´ın´a. Z´avis´ı na velikosti modelu a rozliˇsen´ı sn´ımku. Vyˇsˇs´ı hodnota znamen´a vˇetˇs´ı simplifikaci. Ovl´ ad´ a tvar zjednoduˇsovac´ı kˇrivky. Pro hodnotu 0.5 se simplifikace zvyˇsuje line´arnˇe, pro niˇzˇs´ı hodnoty jde nejprve pozvolna a agresivn´ı je aˇz u vzd´alenˇejˇs´ıch objekt˚ u. Typick´a hodnota je 0.4. Velikost pˇrechodov´e z´ony 0 aˇz 1. Chlupy tak nemiz´ı skokovˇe, ale postupnˇe se zmenˇsuj´ı aˇz zmiz´ı. Typick´a hodnota je 0.2 Minim´ aln´ı poˇcet vlas˚ u (0 aˇz 1). Zabraˇ nuje pˇr´ıliˇs drastick´e simplifikaci, kdy poˇcet vlas˚ u m˚ uˇze b´ yt pˇr´ıliˇs mal´ y. Maxim´ aln´ı poˇcet vlas˚ u (0 aˇz 1), validn´ı jen pro st´ınov´ y pr˚ uchod. Lze tak vlastnˇe nastavit minim´aln´ı velikost simplifikace. Jm´eno a cesta k furProc.dll. Jm´eno a cesta k log souboru (voliteln´e). Obnov´ı v´ ychoz´ı nastaven´ı vˇsech atribut˚ u.
Tabulka B.1: Popis parametr˚ u pro nastaven´ı simplifikace.
ˇ ´ILOHA B. UZIVATELSK ˇ ´ PR ˇ ´IRUCKA ˇ PR A
67
Uˇzivatelsk´e rozhran´ı je uk´ az´ ano na obr´azku B.1. V´ yznam parametr˚ u je uveden v tabulce B.1. Vykreslov´ an´ı spust´ıme napˇr´ıklad pomoc´ı pˇr´ıkazu v menu: 3Delight -> Render -> Pass Name Doporuˇcen´ y postup pro spr´ avn´e nastaven´ı simplifikace: 1. Najdˇete sn´ımek, kde vykreslovan´ y model je v dostateˇcn´e vzd´alenosti pro zjednoduˇsov´ an´ı. 2. Tento sn´ımek vykreslete s vypnutou simplifikac´ı (bude slouˇzit jako referenˇcn´ı). 3. Nastavte simplifikaci pro st´ınov´ y pr˚ uchod (Shadow Pass). (a) Simplifikaci pro z´ avˇereˇcn´ y pr˚ uchod (Color Pass) ponechte vypnutou. (b) Maximum Of Hair nastavte na 1 (c) Zvyˇsujte hodnotu Number Of Hair, pokud je v´ ysledek (vykreslen´ y obr´azek) pˇrijateln´ y. (d) Nastavte Maximum Of Hair na 0.4 nebo i menˇs´ı (ve st´ınov´em pr˚ uchodu je moˇzn´e poˇcet vlas˚ u v´ yraznˇe omezovat). 4. Nastavte simplifikaci pro z´ avˇereˇcn´ y pr˚ uchod (Color Pass): (a) Zvyˇsujte hodnotu Number Of Hair, pokud je v´ ysledek (vykreslen´ y obr´azek) pˇrijateln´ y. (b) Minimum Of Hair nenastavujte radˇeji na hodnotu menˇs´ı neˇz 0.1 (pˇri velk´e simplifikaci m˚ uˇze doch´ azet napˇr´ıklad k probl´em˚ um s kontrastem). Pro odladˇen´ı krok˚ u 3a a 4a se m˚ uˇze hodit log-soubor, kde je vidˇet napˇr´ıklad poˇcet vykreslen´ ych vlas˚ u (viz n´ıˇze). Pamatujte ale, ˇze d˚ uleˇzit´a je skuteˇcn´a vizu´aln´ı kvalita!
B.4
Log
Do logu zapisuje furProc.dll napˇr´ıklad u ´daje o velikosti simplifikace v jednotliv´ ych voxelech. TotalH UsedH Ratio Lambda Trans Shadow RibFilename
Celkov´ y poˇcet vlas˚ u nebo unkn pokud je simplifikace vypnuta. Poˇcet vykreslen´ ych vlas˚ u nebo unkn pokud je simplifikace vypnuta. Pomˇer poˇctu vlas˚ u (0 aˇz 1), odpov´ıd´a Lambda + Trans. Velikost simplifikace. Velikost poloviny pˇrechodov´e z´ony. 1 pro st´ınov´ y pr˚ uchod, jinak 0. Jm´eno RIBu voxelu. Tabulka B.2: V´ yznam poloˇzek logu.
Pˇr´ıklad logu: File ’hair.1.rib’ statistics: --------------------------------------------------------------TotalH UsedH Ratio Lambda Trans Shadow RibFilename 48511 29107 0.6000 0.5000 0.1000 1 hair.1_shaveHairShape1_0.rib 48511 26744 0.5513 0.4513 0.1000 0 hair.1_shaveHairShape1_0.rib
V´ yznam jednotliv´ ych poloˇzek je uveden v tabulce B.2. V uveden´em pˇr´ıkladˇe je kreslena sc´ena, kter´a obsahuje pouze jeden voxel a jedno svˇetlo (st´ınov´ y pr˚ uchod).
68
ˇ ´ILOHA B. UZIVATELSK ˇ ´ PR ˇ ´IRUCKA ˇ PR A
ˇ ´ILOHA C. OBSAH PRILO ˇ ˇ EHO ´ PR ZEN CD
C Obsah pˇ riloˇ zen´ eho CD \ | +--| | | | | | | | | | +--| | | | +--| | | | | | | | | | +---
text | +--- dipl.pdf | +--- src | | | +--- img | +--- ref shader | +--- kajiya.sl render | +--- img | | | +--- model | | | +--- simpl | +--- video README.txt
Text pr´ace ve form´atu PDF. Zdrojov´e soubory pro LATEX. Obr´azky pouˇzit´e v t´eto pr´aci. Volnˇe dostupn´a pouˇzit´a literatura.
Zdrojov´ y k´od RSL st´ınovac´ıho programu Kajiya & Kay.
Obr´azky vykreslen´e pomoc´ı 3Delight. Porovn´an´ı osvˇetlovac´ıch model˚ u. Referenˇcn´ı a simplifikovan´e sc´eny. Animovan´e sekvence vykreslen´e pomoc´ı 3Delight. Popis obsahu CD.
69
70
ˇ ´ILOHA C. OBSAH PRILO ˇ ˇ EHO ´ PR ZEN CD