Surfels (Surface Elements): Plošné elementy jako vizualizační primitiva Obsah (Abstract) Plošné elementy (surfely) jsou novým přístupem k efektivnímu interaktivnímu zobrazování složitých geometrických objektů. Narozdíl od klasických plošných rozdělení, například trojúhelníkových nebo čtyřúhelníkových sítí, surfely jsou bodová primitiva bez explicitní souvislosti. Atributy surfelu jsou hloubka, barva textury, normála a jiné. Při předzpracování je vypočtena surfelová reprezentace geometrického objektu, založená na oktantových stromech. Během vzorkování mohou být pozice a normály surfelu volitelně odchýleny, a různé úrovně barev textury předfiltrovány a uloženy do surfelu. Během zobrazování pokročilý hierarchický warpovací algoritmus ukládá surfely do z-bufferu. Nová metoda nazvaná visibility splatting určuje viditelné surfely a díry v zbufferu. Viditelné surfely jsou stínovány použitím texturového filtrování, Phongova osvětlení, a mapování okolí (environment mappingu) používajícího normály v surfelech. Některé metody rekonstrukce obrazu, včetně supersamplingu, nabízejí flexibilní změnu rychlosti a kvality výstupu. Díky jednoduchosti operací, surfelová vizualizační roura (rendering pipeline) je odpovědná za hardwarovou implementaci. Surfely nabízí komplexní tvar, nízkou rendrovací cenu a vysokou kvalitu obrazu, což je činí specificky vhodnými jak pro úspornou, real-time grafiku, tak pro hry. 1. Úvod (Introduction) 3D počítačová grafika se konečně stala všudypřítomnou i na spotřebitelské úrovni. To bylo způsobeno rozšířením dostupnosti 3D grafických hardwarových akcelerátorů na levnějších počítačích. Nepochybně klíčem k tomuto úspěchu se staly interaktivní počítačové hry, které se ukázaly jako "zabijácké aplikace" pro 3D grafiku. Ačkoliv interaktivní počítačová grafika stále nedosáhla úrovně realismu, umožňuje věrné ponoření do virtuálního světa. Například objekty v real-time hrách jsou extrémně minimalistické mnohoúhelníkové modely, u kterých se často objevují artefakty a hranaté siluety. Různé sofistikované modelovací techniky, jako implicitní povrchy (implicit surfaces), NURBS, nebo dělené povrchy (subdivision surfaces), umožňují vytvoření 3D grafických modelů se složitějšími tvary. Modelovací primitiva vyšších řádů, přestože jsou rozložena na trojúhelníky před zobrazením grafickým systémem. Trojúhelník jako zobrazovací primitivum se zdá být rovnováhou mezi popisnou sílou a výpočetním břemenem [7]. Pro zobrazení realistických a organicky vypadajících modelů potřebujeme hodně složité tvary se stále více trojúhelníky, nebo, jak udává Alvy Ray Smith: "Realita je 80 miliónů polygonů“. [26]. Zpracování mnoha malých trojúhelníků vede k ucpání datové sběrnice (úzkého hrdla) nadměrným počtem bodů (floating points) a rasterizačními požadavky [7]. Pro zvýšení vizuální složitosti objektů bylo představeno panem Catmullem [3] texturové mapování a úspěšně bylo použito jinými [13]. Textury zprostředkují více detailů uvnitř polygonu, čímž dovolují použijí menšího počtu větších trojúhelníků. Dnešní grafické enginy jsou přizpůsobeny pro vysoký výkon při nanášení textur (texture mapping). Nicméně texturové mapy musí sledovat základní geometrii polygonových modelů a pracují nejlépe na plochých nebo mírně zakřivených površích. Realistické povrchy často vyžadují velké množství textur, které musí být aplikovány vícenásobně během rasterizace. A jevy jako kouř, oheň, nebo voda se obtížně zobrazují použitím texturovaných trojúhelníků. V tomto článku navrhneme novou metodu interaktivního zobrazování objektů s bohatými tvary a texturami. Naše zobrazovací architektura je založena na jednoduchých plošných elementech (surfelech) jako zobrazovacích primitivech. Surfely jsou bodové vzorky z grafického modelu. Při předzpracování vzorkujeme povrchy složitých geometrických modelů podél tří ortografických pohledů. Současně provádíme intenzivní výpočty textur, bump textur, nebo posunutí mapování. Přesunem rasterizace a texturování z jádra zobrazovací roury (rendering pipeline) do předzpracování dramaticky redukujeme zobrazovací cenu. Z modelovacího pohledu surfelová reprezentace poskytuje pouhou diskretizaci geometrie a proto redukuje reprezentaci objektu na základní věci potřebné pro zobrazení. Naproti tomu trojúhelníková primitiva implicitně ukládají informace o jejich spojení, jako valenční vrchol nebo přilehlost - údaje, které nejsou nutně potřebné pro zobrazení. V jiném smyslu se surfely spojují s tím, co Levoy a Whitted nazvali "lingua franca" nebo zobrazení v jejich průkopnické zprávě z roku 1985 [18].
Ukládání normál, předfiltrovaných textur a jiných dat do surfelů nám umožňuje vytvořit velmi kvalitní zobrazovací algoritmy. Stínování a transformace aplikované na každý surfel jsou následovány výpočtem Phongova osvětlení, bump texturování a posunutí mapování, stejně tak jako dalšími pokročilými zobrazovacími rysy. Naše datová struktura poskytuje reprezentaci objektů ve více rozlišeních (multiresolution object representation) a pokročilý hierarchický warpovací algoritmus (hierarchical forward warping algorithm) nám pro různou rychlost a kvalitu umožňuje odhadnout hustotu surfelů ve výsledném obrázku. Surfelová zobrazovací roura (surfel rendering pipeline) doplňuje existující grafickou rouru (rendering pipeline), přitom ji však nenahrazuje. Je umístěna mezi konvenční geometricky založené (geometry-based) zobrazovače a obrazově založené zobrazovače (image-based rendering) a vyhýbá se tak přístupu do paměti, což zvyšuje výkon a kvalitu zobrazení. Tato práce se zaměřuje na interaktivní 3D aplikace, ne na vyšší kategorie aplikací, jako jsou celovečerní filmy nebo CAD/CAM. Surfely nejsou vhodné pro reprezentaci plochých povrchů, jako například zdí nebo pozadí scény, kde vetší, otexturované polygony přináší lepší kvalitu obrazu za nižší zobrazovací cenu. Naproti tomu surfely přináší dobré výsledky u modelů s bohatými, organickými tvary, povrchů s vysokými detaily a aplikací, kde nevadí čas potřebný na předzpracování. Tyto vlastnosti je dělají ideálními pro interaktivní hry. 2. Související práce (Related work) Použití bodů jako zobrazovacích primitiv má v počítačové grafice dlouhou historii. Již v roce 1974 pan Catmull [3] pozoroval, že zjednodušování geometrických primitiv může vést až na body. Pro objekty, u kterých nemohlo být použito zobrazení pomocí geometrie, jako například mraky, exploze a oheň [23], byly postupně použity částice. Později se stalo populární obrazově založené zobrazování (image-based rendering), protože čas potřebný pro zobrazení byl závislý na počtu pixelů ve výsledném obrázku a ne na složitosti scény. Vizuálně složité objekty byly reprezentovány dynamicky generovanými obrázky (sprity) [25], které byly rychle vykresleny a velmi zlepšovaly vizuální vlastnosti objektů. Jednoduchý přístup byl použit v Talismanově zobrazovacím systému [27] k udržení vysoké a přibližně konstantní rychlosti snímkování. Zobrazení objektů jako rovinných polygonů také vede k viditelným chybám a neumožňuje paralelní a okluzní efekty. Tyto problémy řeší několik metod přidávajících ke každému pixelu z obrázku jeho hloubku. Jsou to například tyto metody: layered impostors (vrstvový podvodníci) [24], sprites with depth (sprity-obrázky s hloubkou), layered depth images (vrstvové hloubkové obrázky) [25]. Ovšem stále žádná z těchto technik neposkytuje úplný objektový model, který může být osvětlen a zobrazen z různých bodů pohledu. Některé obrazově založené přístupy reprezentují objekty bez explicitního uložení jejich geometrie nebo hloubky. Metody jako pohledová interpolace a Quicktime VR [5] nebo plenoptické modelování [21] vytvářejí nové pohledy ze sbírky 2D obrázků. Lightfield [17] nebo lumigraph [9] techniky popisují záření scény nebo objektů jako funkci pozice a směru ve čtyř nebo více dimenzionálním prostoru, ale cena požadovků na uložení je vysoká. Všechny tyto metody používají pohledově závislé vzorky k reprezentaci objektu nebo scény. Ale pohledově závislé vzorky nejsou efektivní pro dynamické scény s pohybujícími se objekty, změnami materiálových vlastností a změnami pozice a intenzity osvětlení. Hlavní myšlenka reprezentace objektů pomocí surfelů je, popsat je pohledově nezávisle a raději v objektově vystředěném než obrázkově vystředěném tvaru. Jako takové, je zobrazování pomocí surfelů (surfel rendering) někde mezi zobrazováním pomocí geometrie (geometry rendering) a obrazově založeným zobrazováním (imagebased rendering). V objemové grafice (volume graphics) [16] jsou syntetické objekty implicitně reprezentovány voxely, typicky uloženými v pravidelné mřížce. Třetí dimenze však přináší zvýšené požadavky na uložení a delší zobrazovací čas. V [8], pan Perlin studuje "surflety", přidávající vlnění, které může být použito k popsání volně tvarovatelných implicitních ploch (free-form implicit surfaces). Surflety zabírají méně místa než voxely, ale jejich zobrazení vyžaduje zdlouhavé sledování paprsku. Náš výzkum byl inspirován následující prací: Animatek's Caviar player [1] poskytuje interaktivní rychlost snímkování pro voxelové modely na počítači Pentium třídy PC, ale používá povrchní zjednodušení zobrazení a osvětlovacích metod. Levoy a Whitted [18] používají body k modelování objektů ve speciálních případech spojitých a diferencovatelných povrchů. Řeší také problém detailního texturového filtrování. Max užívá bodové vzorky získané z ortografických pohledů k modelování a zobrazování stromů [20]. Dally a kolektiv [6] uvedl delta strom jako objektově vystředěný přístup k obrazově založenému zobrazování (image-based rendering). Pohyb pozorovacího bodu v této metodě je ale omezený jen na některé lokality. Později Grossman and Dally [12] popsali bodovou vzorkovou reprezentaci pro rychlé zobrazování složitých objektů. Chang a kolektiv [4] uvedli LDI strom, hierarchickou prostor dělící datovou strukturu pro obrazově založené zobrazování (image-based rendering). My jsme rozšířili a integrovali tyto myšlenky a uvádíme kompletní bodový vzorkovací zobrazovací systém (point sample rendering system) obsahující výkonnou hierarchickou reprezentaci, vysokou kvalitu texturového filtrování,
přesné viditelnostní výpočty a rekonstrukci obrazu (image reconstruction) s flexibilní rychlostí a kvalitou výstupu. Naše surfelová zobrazovací roura (surfel rendering pipeline) poskytuje vysokou kvalitu obrazu extrémně složitých modelů a je odpovědná za hardwarovou implementaci. 3. Koncepční přehled (Conceptual overview) Podobně jako metoda, kterou představili Levoy a Whitted [18], náš surfelový přístup zahrnuje dva hlavní kroky: vzorkování a zobrazení surfelů. Vzorkování geometrie a textur je prováděno ve fázi předzpracování, která může zahrnovat jiné pohledově závislé metody jako bump texturování a posunutí mapování (displacement mapping). Obrázek 2 ukazuje přehled kroků algoritmu. Vzorkovací proces (sekce 5) převádí geometrické objekty a jejich textury na surfely. Používáme metodu sledování paprsku k vytvoření tří ortogonálních vrstvených hloubkových obrázků (Layered Depth Images - LDI) [25]. LDI ukládají surfely podél každého paprsku, jeden pro každý bod, který protíná paprsek s povrchem. Lischinski a Rappaport [19] nazvali toto uspořádání tří ortogonálních LDI vrstvená hloubková kostka (Layered depth cube LDC). Důležitým a novým aspektem naší vzorkovací metody je rozdíl mezi vzorkováním tvaru nebo geometrie a stínu nebo barvy textury. Surfel ukládá jak tvar, jako například pozici a orientaci povrchu, tak stín, jako například vícenásobné úrovně předfiltrovaných barev textur. Protože je zde podobnost s tradičním texturovým mipmapováním, nazýváme tuto hierarchickou informaci o barvě jako surfelová mipmapa (surfel mipmap). Z LDC vytvoříme výkonnou hierarchickou datovou strukturu pro zobrazení. Chang a kolektiv [4] představují LDI strom, oktantový strom s LDI připojenými ke každému uzlu oktantového stromu. Používáme stejnou hierarchickou prostor dělící strukturu, ale ukládáme LDC do každého uzlu oktantového stromu (sekce 6). Každý LDC kořen oktantového stromu nazýváme blok. Výslednou datovou strukturu nazýváme LDC strom. V kroku nazvaném 3 do 1 redukce (3-to-1 reduction) můžeme redukovat LDC na jednoduché LDI po blocích jako základ pro rychlejší zobrazování. Zobrazovací roura (sekce 7) hierarchicky promítá bloky do prostoru obrazovky použitím perspektivní projekce. Zobrazení je urychleno procesem odstraňování bloků [12] a rychlým přírustkovým dopředným warpingem. Odhadujeme, že plánovaná hustota surfelů ve výsledném obrázku bude řízena rychlostí a kvalitou obrazové rekonstrukce. Konvenční z-buffer spolu s novou metodou nazvanou visibility splatting řeší problém viditelnosti. Texturové barvy viditelných surfelů jsou filtrovány použitím lineární interpolace mezi příslušnými úrovněmi v surfelové mipmapě. U každého viditelného surfelu je použito stínování, například Phongovo osvětlení a odrazové mapování (reflection mapping). Poslední fází je rekonstrukce obrazu (image reconstruction) z viditelných surfelů, včetně vyplnění vzniklých dír a vyhlazování (antialiasingu). Obecně rozlišení výsledného obrazu a rozlišení v zbufferu nemusí být stejné. 4. Definice surfelu Termín surfel jsme našli jako zkratku pro povrchový element (SURFace ELement) nebo povrchový voxel (SURFace voxEL) v objemovém zobrazení a samostatné typologické literatuře. Herman [15] definuje surfel jako orientovaný (n-1)-dimenzionální objekt v R^n. Pro n=3 to odpovídá orientovanému jednotkovému čtverci (přední části voxelu) a to se shoduje s pohledem na voxely jako na malé kostky. Ale pro naši diskuzi použijeme následující definici surfelu: Surfel je nula dimenzionální n-tice s tvarovými a stínovými atributy, které jsou lokálně aproximovány povrchem objektu. Alternativní termín bodový vzorek považujeme za příliš obecný, protože voxely a pixely jsou také bodové vzorky. 5. Vzorkování (Sampling) Během vzorkování je cílem nalézt optimální surfelovou reprezentaci geometrie s minimální nadbytečností (redundancí). Většina vzorkovacích metod provádí rozdělení (diskretizaci) objektu jako funkci geometrických parametrů povrchu, jako například zakřivení nebo siluety. Toto rozdělení objektu typicky vede k příliš mnoha nebo příliš málo zobrazovaným primitivům. V surfelové reprezentaci je vzorkování objektu zarovnáno na obrazový prostor a odpovídá očekávanému rozlišení výsledného obrazu. 5.1 LDC vzorkování
Geometrické modely vzorkujeme ze tří stran krychle do tří ortogonálních LDI, zvaných vrstvená hloubková krychle (Layered Depth Cube - LDC) [19] nebo blok. Obrázek 3 ukazuje LDC se dvěma LDI použitými při 2D kreslení. Vrháním paprsku zaznamenáme všechny průniky, včetně průniků s plochami tvořícími pozadí. V každém bodu průniku je vytvořen surfel a nastavena jeho hloubka (floating point depth) a ostatní tvarové a stínové vlastnosti. Odchylka povrchové normály, geometrie bump textury a posunutí mapování (displacement mapping) může být provedena na geometrii před vzorkováním nebo během vrhání paprsku použitím procedurálních stínovačů (shaderů). Alternativně můžeme objekt vzorkovat z předem určených směrů na obklopujícím konvexním obalu používajícím ortografické hloubkové obrázky [6,12]. Přestože kombinování více referenčních obrázků a eliminace redundantních informací je obtížný problém [21], vzorkování geometrie s referenčními obrázky pracuje dobře u hladkých a konvexních objektů. Navíc LDC vzorkování nám umožňuje snadno vybudovat hierarchickou datovou strukturu, která by se obtížně vytvářela z více hloubkových obrázků. 5.2 Vhodné vzorkovací rozlišení Definujme h0 jako vzdálenost mezi pixely pro nejvyšší rozlišení LDC použité pro vzorkování. Pak můžeme určit výslednou vzorkovací hustotu povrchu. Předpokládejme, že sestrojujeme Delaunayovu triangulaci na povrchu objektu s použitím vygenerovaných surfelů jako vrcholů trojúhelníku. Jak bylo zpozorováno v [19], fiktivní trojúhelníková síť vygenerovaná vzorkovacím procesem má maximální délku strany smax=3^1/2*h0. Minimální délka strany smin je 0, když se dva nebo tři vzorkovací paprsky na povrchu protínají ve stejném bodě. Podobně jako ve [12], nazýváme objekty správně navzorkované, jestliže můžeme zaručit, že po ortografické projekci a jednotkovém zvětšení je vyprojektován alespoň jeden surfel pro každý výstup z pixelového filtru. Podmínka je použita, jestliže smax, maximální vzdálenost mezi sousedními surfely v prostoru objektu, je menší než poloměr r'rec požadovaný pixelovým rekonstrukčním filtrem. Typicky vybereme rozlišení LDI, ktreré je mírně vyšší, kvůli efektům zvětšení a perspektivní projekce. Znovu se vrátíme k těmto pozorováním, když budeme odhadovat počet vyprojektovaných surfelů na pixel v sekci 7.2. 5.3 Předfiltrování textury (Texture prefiltering) Rysem zobrazování pomocí surfelů je, že textury jsou předfiltrovány a mapovány na prostor objektu během předzpracování. Používáme pohledově nezávislé texturové filtrování jako v [12]. Kvůli odstranění pohledově závislého texturového roztřepení (texture aliasing) také aplikujeme texturové filtrování v každém pixelu během zobrazování (viz. Sekce 7.4 a 7.6). K určení rozsahu filtrované oblasti (stopy) v prostoru textury, posunujeme střed kruhu každého surfelu podle tečné roviny, jak ukazuje obrázek 4a. Tyto kruhy nazýváme tečné disky (tangent disks). Tečné disky, které jsou v prostoru textury mapovány do elipsy (viz. obrázek 4b), používají předdefinovaných parametrů textury na povrchu. EWA filtr [14] je aplikován k filtrování textury a výsledná barva je uložena do surfelu. K umožňění správné rekonstrukce textury se musí eliptické filtrované oblasti (stopy) navzájem překrývat. Proto vybíráme r^0pre=smax, maximální vzdálenost mezi přilehlými surfely v prostoru objektu, jako poloměr pro tečné disky. Toto obvykle zaručuje, že se tečné disky v prostoru objektu navzájem protínají, a že se jejich projekce do prostoru textury překrývají. Grossman a Dally [12] také používají pohledově nezávislé texturové filtrování a ukládají do každého surfelu jeden vzorek textury. Od té doby, co používáme algoritmus modifikovaného z-bufferu k řešení viditelnosti (sekce 7.3), ne všechny surfely mohou být dostupné pro obrazovou rekonstrukci. Jsou to ty, u kterých se vyskytuje hodně artefaktů (texture aliasing artifacts). Proto ukládáme do každého surfelu několik (typicky tři nebo čtyři) vzorků předfiltrované textury. Tečné disky s dvakrát větším poloměrem r^k pre=smax*2^k jsou mapovány do prostoru textury a jsou použity k výpočtu předfiltrovaných barev. Protože je zde podobnost s mipmapováním (mipmapping) [13], nazýváme tuto strukturu surfelová mipmapa (surfel mipmap). Obrázek 4b ukazuje eliptické stopy v prostoru textury u postupně se zvětšujících tečných disků. 6. Datová struktura Používáme LDC strom, výkonnou hierarchickou datovou strukturu, k ukládání LDC získaných během vzorkování. Umožňuje nám rychle odhadnout počet vyprojektovaných surfelů v každém pixelu a měnit zobrazovací rychlost pro vyšší obrazovou kvalitu.
6.1 LDC Strom Chang a kolektiv [4] používají několik referenčních snímků scény v různých hloubkách ke konstrukci LDI stromu. Pixely obrázku v různých hloubkách jsou převzorkovány do kořenů vícenásobného LDI stromu použitím rozplácnutí (splatting) [29]. My se vyhýbáme těmto interpolačním krokům uložením LDC, které jsou podvzorkovanými verzemi LDC v nejvyšším rozlišení, do každého uzlu oktantového stromu. Oktantový strom je konstruován rekurzivně odspodu nahoru a jeho výška je nastavena uživatelem. LDC v nejvyšším rozlišení - získaná během vzorkování geometrie - je uložena na nejnižší úroveň n=0. Jestliže LDC v nejvyšším rozlišení má mezery mezi pixely h0, potom LDC úrovně n má mezery mezi pixely hn=h0*2^n. LDC se dělí na bloky s uživatelem specifikovanou dimenzí b, to znamená, že LDI mají v bloku b^2 vrstvených hloubkových pixelů. B je stejné pro všechny úrovně stromu. Obrázek 5a ukazuje dvě úrovně LDC stromu s b=4 používajícím 2D kreslení. Na obrázku jsou sousedící bloky odlišně stínovány a prázdné bloky jsou bílé. Bloky na vyšších úrovních oktantového stromu jsou konstruovány podvzorkováním jejich potomků faktorem dva. Obrázek 5b ukazuje úroveň n=1 LDC stromu. Všimněte si, že surfely na vyšších úrovních oktantového stromu se odkazují na surfely v LDC úrovně 0, to znamená, že surfely které se objevují v několika blocích hierarchie jsou uloženy jen jednou a sdíleny mezi bloky. Prázdné bloky (zobrazené jako bílé čtverce na obrázku) nejsou uloženy. Proto bloková dimenze b nesouvisí s dimenzí LDC v nejvyšším rozlišení a může být nastavena libovolně. Volbou b=1 vytvoříme LDC strom reprezentovaný plně objemovým oktantovým stromem. Pro porovnání LDC stromů a objemových stromů (volumes) se mrkněte na [19]. 6.2 3-to-1 Redukce K redukci místa a zobrazovacího času je často použita možnost redukce LDC na LDI po blocích. Protože toto typicky odpovídá trojnásobnému zvýšení warpovací rychlosti, nazýváme tento krok 3-do-1 redukce (3-to-1 reduction). V první fázi jsou surfely převzorkovány do celočíselných mřížkových lokací s průniky paprsku jak ukazuje obrázek 6. Současně použijeme interpolaci pomocí nejbližšího souseda (nearest neighbor interpolation), ačkoliv by mohl být jednoduše implementován i sofistikovanější filtr, například rozplácnutí (splatting) jako v [4]. Převzorkované surfely z bloku jsou potom uloženy do jednoduchého LDI. Proces redukce a převzorkování ztrácí kvalitu surfelové reprezentace - tvarů i stínů. Převzorkované surfely ze stejného povrchu mohou mít velmi odlišné barvy textur a normály. To může způsobit barvové a stínové artefakty, které se zhoršují při pohybu objektu. Prakticky jsme se ale nesetkali se závážnými artefakty během 3-to-1 redukce. Protože naše zobrazovací roura (rendering pipeline) pracuje s LDC a LDI stejným způsobem, mohli bychom uložit bloky v řídkých strukturách, jako je LDC, zatímco všechny ostatní bloky by mohly být redukovány na jednoduché LDI. Jako v sekci 5.2, můžeme určit hranice hustoty surfelů na povrchu po 3-to-1 redukci. Při vzorkování LDI jsou mezery mezi pixely h0 a maximální vzdálenost mezi sousedními surfely na povrchu objektu je smax=3^1/2*h0, jako u originálního LDC stromu. Minimální vzdálenost mezi surfely se zvyšuje na smin=h0 během eliminace redundantních surfelů a vytváření imaginární Delaunayovy triangulace na povrchu je rovnoměrnější. 7. Zobrazovací roura (Rendering pipeline) Zobrazovací roura (rendering pipeline) bere surfelový LDC strom a zobrazuje ho použitím hierarchického viditelnostního ořezávání (hierarchical visibility culling) a dopředného warpování (forward warping) bloků. Hierarchické zobrazení nám také umožňuje odhadnout počet vyprojektovaných surfelů na každý výstupní pixel. Pro maximální výkon zobrazování doporučujeme přibližně jeden surfel na každý pixel a použít stejné rozlišení zbufferu a výstupního obrázku. Pro maximální kvalitu obrázku doporučujeme více surfelů na každý pixel, použití jemnějšího rozlišení z-bufferu a vysokou kvalitu rekonstrukce obrazu. 7.1 Odstraňování bloků (Block Culling) LDC strom procházíme od vrcholu (bloky nejnižšího rozlišení) dolů (bloky nejvyššího rozlišení). Pro každý blok nejprve vykonáváme ořezání pohledovým kuželem (view-frustum culling) použitím bounding boxu bloku. Dále pomocí kuželů viditelnosti (visibility cones), které jsou popsané v [11], provedeme ekvivalentní ořezání zadních
ploch bloků. Použitím surfelových normál předpočítáme viditelný kužel pro každý blok, což poskytuje rychlý, konzervativní test viditelnosti: žádný surfel v bloku není viditelný z bodu pohledu (viewpointu) bez kužele. Narozdíl od tohoto přístupu [11], my provádíme všechny testy viditelnosti hierarchicky v LDC stromu, který je dělá efektivnějšími. 7.2 Procházení bloků (Block Warping) Během zobrazování je LDC strom procházen (traverzován) od vrcholu dolů [4]. Výběr úrovně oktantového stromu, která je zobrazena, konzervativně odhadujeme pro každý blokový počet surfelů v každém pixelu. Můžeme vybrat jeden surfel na každý pixel pro urychlení zobrazování nebo více surfelů na každý pixel pro kvalitnější vzorkování (supersampling). Pro každý blok stromu na úrovni n je počet surfelů na každý pixel určeno i^nmax, maximální vzdáleností mezi sousedními surfely v obrazovém prostoru. Odhadujeme i^nmax dělením maximální délky projektovaných čtyř hlavních úhlopříček bounding boxu bloku blokovou dimenzí b. Toto je správně pro ortografické zobrazení. Ale chyba vzniklá použitím perspektivní projekce je malá, protože blok typicky zobrazuje malý počet pixelů. Pro každý blok, i^nmax je v porovnání s poloměrem r’rec vyžadováno pixelovým rekonstrukčním filtrem. r’rec je typicky (2^1/2)/2*s0, kde s0 je délka strany výstupního pixelu. Jestliže i^nmax v aktuálním bloku je větší než r’rec, pak jsou procházeni (traverzováni) potomci. Když zobrazujeme blok, jehož i^nmax je menší než r’rec, zobrazujeme přibližně jeden surfel na každý pixel. Všimněte si, že počet surfelů na každý pixel může být zvýšen, když i^nmax je zlomkem r’rec. Výsledné i^nmax je uloženo jako imax s každým vyprojektovaným surfelem pro další použití v testech viditelnosti a rekonstrukci obrazu. Poloměr aktuálního rekonstrukčního filtru je rrec=max(r’rec, imax) (viz. Sekce 7.6). K procházení bloků (to warp a block) v prostoru obrazu používáme optimalizovaný přírustkový warping bloků od Grossmana a Dallyho, kteří ho uvedli v 11. Velké účinnosti je dosaženo díky pravidelnosti LDC. Používá jen 6x sčítání, 3x násobení a 1x inverzi na každý vzorek. LDI v každém LDC bloku jsou procházeny (warped) nezávisle, což nám umožňuje zobrazit LDC strom tam, kde byly něktené nebo všechny bloky redukovány do jednoduchých LDI po 3-to-1 redukci. 7.3 Testování viditelnosti (Visibility Testing) Perspektivní zobrazení, vysoké rozlišení z-bufferu a zvětšení mohou vést k podvzorkování nebo dírám v zbufferu. Pixel v z-bufferu je díra, jestliže po zobrazení neobsahuje viditelný surfel nebo pixel pozadí. Díry musí být označeny pro rekonstrukci obrazu. Každý pixel v z-bufferu ukládá ukazatel na nejbližší surfel a aktuální minimální hloubku. Hloubky surfelů jsou uloženy do z-bufferu použitím interpolace pomocí nejbližšího souseda. Správně vyřešená viditelnost vzhledem k dírám převádí ortografické zobrazení surfelových tečných disků do zbufferu. Tečné disky mají poloměr r^nt=smax 2^n, kde smax je maximální vzdálenost mezi sousedními surfely v objektovém prostoru a n je úroveň bloku. Tento přístup nazýváme rozplácnutí viditelnosti (visibility splatting) a je ukázaný na obrázku 7. Visibility splatting efektivně odděluje počítání viditelnosti a rekonstrukce obrazu, který produkuje vysokou kvalitu obrázků a je možná jeho hardwarová implementace [22]. Po ortografické projekci tečné disky vytvoří elipsu okolo surfelu, jak je vidět na obrázku 7b. Elipsu aproximujeme částečně osově zarovnanými hraničními boxy (axis-aligned bounding box) zobrazenými červeně. Jednoduše může být převedena na hraniční boxy tvaru rovnoběžníku a každý pixel v z-bufferu je vyplněn příslušnou hloubkou (indikovanou stínovanými čtverci na obrázku), která závisí na normále N v surfelu. Tato konverze vyžaduje jen jednoduché nastavení výpočtů bez interpolace barev a perspektivního dělení. Směr vedlejší osy amin ze zobrazené elipsy je rovnoběžný se zobrazenou normálou surfelu N. Hlavní osa je kolmá k amin. Délka amax je zobrazena jako poloměr tečného disku r na n t, který je aproximován hodnotou imax. Tato aproximace v konečném důsledku mění orientaci a zvětšuje LDC strom během zobrazení. Dále vypočítáme osu souřadnic, která je nejvíce rovnoběžná s amin (osa y na obrázku 7). Krátká strana bounding boxu je rovnoběžná s osou souřadnic, kvůli zjednodušení převodu. Výška h je vypočtena jako průnik elipsy s osou souřadnic. Šířka bounding boxu w je určena vyčnívajícím vrcholem průniku hlavní osy a elipsy na druhé ose (ose z na obrázku 7). Parciální derivace z podle x a parciální derivace z podle y jsou parciální derivace hloubky surfelu vzhledem k směru obrazovky x a y. Jsou konstantní, protože ortografická projekce může být vypočítána z normály N. Během konverze je vypočítána hloubka každého pixelu uvnitř bounding boxu použitím parciální derivace z podle x a parciální derivace z podle y. Navíc přidáme malý práh ke každé vyprojektované hodnotě z. Práh zabraňuje
surfelům, které leží na přední ploše, aby byly náhodně vyřazeny. Pixely, které mají větší z než z-tové hodnoty rozplácnutých tečných disků jsou označeny jako díry. Jestliže je povrch extrémně nakloněný, tečné disky ho nezakryjí úplně, potenciálně zanechá slzy a díry. Navíc extrémní perspektivní projekce vytváří ortografickou projekci špatně aproximovanou aktuálními zobrazenými tečnými disky. Ve skutečnosti jsme ale toto neviděli jako hlavní problém. Jestliže je vyprojektovaným tečným diskem kruh, to znamená, že N je již rovnoběžná se směrem pohledu, boundig box tvaru rovnoběžníku je špatnou aproximací. V tomto případě místo něj použijeme čtvercový bounding box. V trochu souvisejícím přístupu Grossman a Dally [12] používají hierarchický z-buffer pro testování viditelnosti. Po vyprojektování každého surfelu je odhadnuta velikost díry okolo surfelu. Poloměr díry určuje úroveň hierarchického z-bufferu, ve kterém bude nastavena z-hloubka surfelu. Toto může být považováno za rozplácnutí viditelnosti (visibility splatting) způsobené hierarchickým z-bufferem. Výhodou je, že viditelnost splatu je provedena jednoduchým testem hloubky v hierarchickém z-bufferu. Ale viditelný splat je vždy čtverec, v podstatě reprezentovaný tečným diskem, který je rovnoběžný s rovinou obrazu. Navíc je nutné vycentrovat ho kolem zobrazeného surfelu. Odstranění těchto nevýhod [12] představují váhy ukazující pokrytí surfelů. Ale toto dělá proces rekonstrukce náročnějším a nezaručuje kompletní pokrytí skrytých ploch. 7.4 Filtrování textur (Texture filtering) Jak je vysvětleno v sekci 5.3, každý surfel v LDC stromu ukládá několik předfiltrovaných barev textury v surfelové mipmapě. Během zobrazení je barva surfelu lineárně interpolována z barev surfelové mipmapy v závislosti na zmenšení objektu a orientaci povrchu. Obrázek 8a ukazuje všechny viditelné surfely vzorkovaného povrchu projektované do z-bufferu. Elipsy kolem středů surfelů značí projektované stopy (footprints) v nejvyšším rozlišení předfiltrované textury (sekce 5.3). Všimněte si, že během předfiltrování se pokoušíme zaručit úplné pokrytí povrchu stopami. Na obrázku 8b je počet vzorků na každý pixel v z-bufferu omezen použitím hloubkových testů zbufferu. Abychom mohli vyplnit mezery, které se objevují při pokrytí povrchu texturovými stopami, stopy zbývajících surfelů musí být zvětšeny. Jestliže jsou surfely odhozeny v daném pixelu z-bufferu, můžeme předpokládat, že sousedící pixely z okolní oblasti 3x3 v z-bufferu nejsou díry. Tedy mezery mohou být vyplněny, jestliže texturová stopa každého surfelu pokrývá nejméně oblast pixelu v z-bufferu. Následkem toho, elipsa z projektované stopy musí mít menší poloměr 2^(1/2)*sz v nejhorším případě, kde sz je mezera mezi pixely v zbufferu. Ale my ignorujeme nejhorší případ a používáme 2^(1/2)/2*sz naznačující, že surfely jsou projektovány do z-bufferu na středy pixelů. Obrázek 8b ukazuje změny měřítka texturových stop jako elipsy kolem projektovaných surfelů. K výběru vhodné úrovně surfelové mipmapy používáme tradiční pohledově závislé texturové filtrování, jak ukazuje obrázek 9. Kruh s poloměrem 2^(1/2)/2*sz je zobrazen přes pixel na tečné rovině povrchu ve směru pohledu a vytváří elipsu v tečné rovině. V těchto výpočtech je zobrazení kruhu aproximováno ortografickou projekcí. Podobně jako u izotropního texturovému mapování, hlavní osa prostoru projektované tečné elipsy je po použita k určení úrovně surfelové mipmapy. Barva surfelu je spočítána lineární interpolací mezi nejbližšími dvěma úrovněmi mipmapy pomocí předfiltrovaného poloměru r^kpre, respective r^(k+1)pre. 7.5 Stínování (Shading) Osvětlovací model je obvykle aplikován před testováním viditelnosti. Provedením stínování před testováním viditelnosti se vyhýbáme zbytečné práci. Grossman a Dally [12] vykonávají výpočty stínování v prostoru objektu, a tím se vyhýbají transformování normál do prostoru kamery. Ale my transformujeme normály do prostoru kamery již během visibility splattingu (sekce 7.3). S transformovanými normálami, které máme k dispozici, používáme odraz od krychle (cube reflectance) a mapy prostředí (environment maps) [28] k výpočtu Phongova osvětlovacího modelu v každém surfelu. Stínování s normálami v každém surfelu má za následek vysokou kvalitu osvětlení. 7.6 Rekonstrukce obrazu a vyhlazování (Image Reconstruction and Antialiasing) Rekonstrukce povrchu ze zobrazených surfelů je zásadním problémem díky roztroušené datové interpolaci. Narozdíl od jiných výzkumů, jako například splatting [29], oddělujeme výpočty viditelnosti od rekonstrukce obrazu [22]. V z-bufferu jsou pixely s dírami označeny během visibility splattingu. Tyto pixely s dírami nejsou použity během rekonstrukce obrazu, protože neobsahují žádné viditelné vzorky. Obrázek 10 ukazuje z-buffer po zobrazení objektu a procesu rekonstrukce obrazu.
Nejjednodušší a nejrychlejší přístup, který ukazuje obrázek 10a, je vybrat velikost výstupního pixelu tak, aby byla stejná jako velikost pixelu sz v z-bufferu. Surfely jsou mapovány na středy pixelů použitím interpolace pomocí nejbližšího souseda a na obrázku jsou zobrazeny barevnými čtverci. Díry jsou označeny černým X. Volání, které během postupného procházení (forward warping) každého surfelu ukládá imax, odhadujeme jako maximální vzdálenost sousedních zobrazených surfelů v bloku. Imax je dobrý odhad pro minimální poloměr pixelového filtru, který obsahuje nejméně jeden surfel. K interpolaci děr používáme paprskový symetrický Gaussův filtr s poloměrem rrec mírně větším než imax umístěným ve středu pixelu díry. Alternativně je vyplnění děr implementováno pull-push algoritmem použitým Grossmanem a Dallym [12] a popsaným Gortlerem a jeho kolektivem [9]. Velmi kvalitní alternativou je použití supersamplingu, viz. obrázek 10b. Výstupní velikost pixelu obrázku so je násobkem velikosti pixelu sz v z-bufferu. Tečkované čáry na obrázku signalizují subpixely v obrazovém bufferu. Zobrazování pomocí supersamplingu probíhá úplně stejně jako předcházející způsob. Během rekonstrukce obrazu umístíme Gaussův filtr na středy všech výstupních pixelů k filtrování barev subpixelů. Poloměr filtru je rrec=max(r‘rec,imax). Tedy rrec je nejméně tak velký jako r‘rec=2^(1/2)/2*s0, ale může být zvýšen, jestliže imax signalizuje nižší hustotu surfelů ve výsledném obraze. Je poučné vidět, jak je určována barva výstupního pixelu pro normální zobrazování a pro supersampling za nepřítomnosti děr. U normálního zobrazování je nalezena barva pixelu pomocí interpolace nejbližším sousedem pro sousední viditelné surfely v z-bufferu. Tato barva surfelu je vypočítána lineární interpolací mezi dvěma úrovněmi surfelové mipmapy. Barva výsledného pixelu je tedy vypočítána pomocí dvou předfiltrovaných vzorků textur. V případě supersamplingu výsledný pixel obsahuje filtrované barvy z jednoho surfelu pro více subpixelů v z-bufferu. Tedy až osm předfiltrovaných vzorků textury může ovlivnit barvu výsledného pixelu u 2x2 supersamplingu. Toto produkuje kvalitu obrazu podobnou trilineárnímu mipmapování. Levoy a Whitted [18], Chang a kolektiv [4] používají algoritmus velmi podobný Carpentrovému A-bufferu [2] se zásobníkem pro každý pixel a skládáním barev surfelu. Ale výpočet správného pokrytí každého pixelu v A-bufferu vyžaduje projektování všech viditelných surfelů. Max [20] používá pro výstup LDI a A-buffer pro vysokou kvalitu vyhlazování (antialiasingu), ale udává zobrazovací čas 5 minut na každý snímek. Naše metoda s hierarchickým odhadem hustoty, visibility spattingem a filtrováním textur pomocí surfelových mipmap nabízí pružnější změnu rychlosti a kvality výstupu. 8 Implementace a výsledky (Implementation and Results) Vzorkování jsme implementovali použitím Blue Moon Rendering Tools (BMRT) ray traceru [10]. Používáme vzorkovací rozlišení 5122 pro LDC a 4802 je očekávané výsledné rozlišení. V každém bodě průniku Renderman shader vykonává pohledově nezávislé výpočty, jako například filtrování textury, posunutí mapování (displacement mapping) a bump mapping, a ukládá výsledné surfely do souboru. Předzpracování pro typický objekt s 6 LOD surfelovými mipmapami zabírá okolo jedné hodiny. Základním omezením LDC vzorkování je, že tyto tenké struktury, které jsou menší než vzorkovací mřížka, nemůžou být správně reprezentovány a zobrazeny. Například výplet kola, tenké dráty nebo vlasy se zachycují obtížně. Zobrazené artefakty jsou zřetelnější po 3-to-1 redukci, protože jsou při ní odebrány další surfely. Ale neměli jsme žádné problémy se vzorkováním geometrie noh a křídel vosy zobrazené na obrázku 1 a obrázku 12. Atributy surfelů získané během vzorkování zahrnují normály povrchu, barvy odlesku (specular color), faktory odlesku (shininess) a tří úrovně texturové mipmapy. Vlastnosti materiálu jsou uloženy jako index v tabulce. Náš systém v současné době nepodporuje průhlednost. Místo ukládání normál ukládáme indexy do kvantovací tabulky normál pro odlesk a stínování mapováním okolí (environment map shading) [28]. Tabulka 1 ukazuje minimální požadavky uložení na každý pixel. V současné době ukládáme RGB barvy jako 32-bitové čísla (integer) a celkem 20 bytů na každý pixel. Tabulka 2 obsahuje surfelové objekty, které jsme použili pro analýzu výkonu, pomocí velikosti jejich geometrického modelu, počtu surfelů a velikostí souboru před a po 3-to-1 redukci. Všechny modely používají tři LODy a tři úrovně surfelové mipmapy. Velikost LDC stromu je o faktor 1.3 větší než LDC získaný během vzorkování. Tyto režie tvoří datová struktura oktantového stromu, zejména kvůli ukazatelům z bloků s nižším rozlišením na surfely vzorkovaného LDC. V současné době u LDC stromu není použita optimalizace nebo komprese. Obrázek 1 ukazuje odlišné zobrazování objektů pomocí surfelů, včetně mapování prostředí (environment mappingu) a posunutí mapování (displacement mappingu). Obrázek 12 ukazuje příklad detekce děr a rekonstrukce obrazu. Visibility spatting pozoruhodně dobře vykonává detekci děr. Ovšem díry se začínají ve
výstupním obraze objevovat při extrémních detailech, když na každých 30 čtverečních pixelech je méně než přibližně jeden surfel. Pro porovnání kvality obrazu různých rekonstrukčních filtrů jsme vyrendrovali surfelovou šachovnici na obrázku 11. Je na ní zvětšující se počet surfelů na každém pixelu směrem k vrcholu obrázku, zatímco díry se objevují směrem dolů u rekonstrukce pomocí nejbližšího souseda. Šachovnice ale také demonstruje omezení surfelové reprezentace. Protože textury jsou aplikovány během vzorkování, pravidelné vzory textury jsou uloženy explicitně s objektem místo odkazu na něj. Navíc ploché povrchy jsou mnohem výkonněji zobrazeny použitím rasterizace obrazového prostoru, kde můžou být atributy interpolovány pomocí trojůhelníků. Tabulka 3 ukazuje zobrazovací výkon procentuelně pokažený hlavními zobrazovacími úlohami. Rychlost snímků byla měřena na počítači Pentium III 700 Mhz s 256 MB SDRAM používajícím neoptimalizovanou C-čkovskou verzi našeho programu. Všechny uvedené výkony jsou uvedeny průměrně každou minutu animace, která libovolně otáčí objekt umístěný v počátku. Animace byla spuštěna ve třech odlišných rozlišeních obrázku k změření efektů zvětšení a děr. Podobně jako u obrazově založeného zobrazování (image-based rendering), výkon klesá téměř lineárně se zvětšujícím se výstupním rozlišením. Pro 256^2 nebo menší objekty, zobrazení dominuje nad warpingem, hlavně u objektů s mnoha surfely. Pro 1024^2 nebo větší objekty, visibility splatting a rekonstrukce dominují kvůli zvyšování počtu surfelových děr. Rozdíl ve výkonu mezi plným LDC stromem (Wasp-vosa 3LDI) a redukovaným LDC stromem (Wasp-vosa 3to1) je hlavně v procházení úrovně (warping stage), protože musí být zobrazeno méně surfelů. U supersamplingu se výkon snižuje lineárně, jak je zobrazeno na 2x2 supersamplingu v rozlišení 480^2 (Wasp-vosa SS). Stejný objekt ve výstupním rozlišení 1024^2 bez supersamplingu pracuje téměř stejně s výjimkou pomalejší rekonstrukce obrazu kvůli zvyšujícímu se počtu pixelů s dírama. Pro srovnání našeho výkonu se standardním polygonovým zobrazením, jsme zobrazili vosu (wasp) se 128k polygony a 2.3 MB s devíti texturami za použití zobrazovacího programu v OpenGL a Windows NT. Použili jsme GL LINEAR MIPMAP NEAREST pro filtrování textury k dosáhnutí stejné kvality jako u našeho zobrazovačem. Průměrný výkon byl 3 fps použitím implementovaného Microsoft OpenGL (opengl32.lib) a 1.7 fps použitím Mesa OpenGL. Náš neoptimalizovaný surfelový zobrazovač dosahoval 2.7 fps pro stejný model, což se jeví příznivě v porovnání s Mesa OpenGL. Věříme, že další optimalizace velmi zlepší náš výkon. Výběr velikosti bloku b pro kořeny LDC stromu má vliv na výkon procesu odstraňování bloků (block culling) a procházení (warping). Přišli jsme na to, že velikost bloku b=16 je optimální pro široký okruh objektů. Snímková rychlost zůstává prakticky stejná pro různé volby b kvůli faktu, že procházení (warping) zabírá jen zlomek celkové doby zobrazení. Protože používáme z-buffer, můžeme zobrazit překrývající se surfelové objekty a integrovat je s tradiční polygonovou grafikou, jako například OpenGL. Současný systém podporuje jen pevnou nástavbu animací. Deformovatelné objekty se obtížně reprezentují pomocí surfelů a současné LDC stromové datové struktury. Navíc, jestliže surfely neaproximují povrch objektu dobře, například po 3-to-1 redukci nebo v oblastech velkého zakřivení, můžou se během zobrazování objevit na plochách díry.
9 Budoucí rozšíření (Future Extensions) Hlavní silou zobrazování pomocí surfelů je, že v podstatě každý druh syntetického nebo naskenovaného objektu můžeme převést na surfely. Rádi bychom rozšířili naše vzorkování i na objemová data, seskupení bodů (point clouds) a LDI nesyntetických objektů. Věříme, že značné komprese LDC stromu může být dosáhnuto použitím run length encodingu (RLE) nebo kompresních technik založených na vlnkách. Výkon našeho softwarového zobrazovače může být podstatně zlepšen použitím Pentium III SSE instrukcí. Použití okluzního kompatibilního traverzování LDC stromu [21] by mohlo implementovat na pořadí nezávislou transparentnost a skutečné objemové zobrazení. Našim hlavním cílem je návrh hardwarové architektury pro zobrazování surfelů. Blokové procházení (block warping) je velmi jednoduché a zahrnuje jen dvě podmínky pro z-bufferové testy [11]. Chybí výpočty ořezávání. Všechny framebufferové operace, jako visibility splatting a rekonstrukce obrazu, můžou být implementovány použitím standardní rasterizace a framebufferových technik. Zobrazovací roura nepoužívá výpočty inverze, jako například vyhledávání textur v texturových mapách a průběh texturového filtrování je velmi jednoduchý. Je zde vysoký stupeň združování dat, protože systém načítá tvar a stín současně a my očekáváme vysoký výkon vyrovnávací paměti (cache). Je také možné rozšířit existující OpenGL zobrazovací rouru (rendering pipeline) pro výkonnou podporu zobrazování surfelů.
10 Závěry (Conclusions) Zobrazování pomocí surfelů je ideální pro modely s velkou složitostí tvarů a stínů. Jakmile přesuneme rasterizaci a texturování z jádra zobrazovací roury (rendering pipeline) do kroku předzpracování, zobrazovací cena každého pixelu se dramaticky sníží. Zobrazovací výkon je v podstatě určen procházením (warpingem), stínováním a rekonstrukcí obrazu - operacemi, které můžou snadno využívat vektorizaci, paralelismus a proudové zpracování. Naše surfelová zobrazovací roura (surfel rendering pipeline) umožňuje měnit rychlost a kvalitu výstupu. Oddělením rekonstrukce obrazu a filtrování textur dosáhneme mnohem vyšší kvality obrazu než u srovnatelných bodově založených přístupů. Představujeme metodu visibility splatting, která je velmi efektivní v detekci děr a zvyšuje výkon rekonstrukce obrazu. Vyhlazování (antialiasing) se supersamplingem je samozřejmě implementováno do našeho systému. Naše výsledky demonstrují, že surfelové zobrazování je schopné vysoké kvality obrazu při interaktivní rychlosti snímkování. Rostoucí výkon procesoru a možná hardwarová podpora přinesou real-time výkon. 11 Poděkování (Acknowledgments) Rádi bychom poděkovali Ronu Perryovi a Rayi Jonesovi za mnoho užitečných rozhovorů, Collinu Oosterbaanovi a Fritsi Postovi za jejich příspěvky do dřívější verze systému a Adamu Moravanszkymu a Simonu Schirmovi za vytvoření surfelové demo aplikace. Díky také Mattu Brownovi, Marku Callahanovi a Klausi M"ullerovi za dodaný kód a Larrymu Gritzovi za jeho pomoc s BMRT 10. Nakonec díky Alynu Rockwoodovi, Sarah Friskenové a kritikům za jejich konstruktivní komentáře, a Jennifer Roderickové za provedení korektur článku.