Přehled technologie O3D

O3D je otevřené API napsané v JavaScriptu pro vytváření interaktivních, grafických 3D aplikací které běží v okně prohlížeče - her, reklam, prohlžečů 3D modelů, dem produktů a virtuálních světů. O3D rozšiřuje možnosti software webové aplikace běžící na straně klienta na následujících úrovních:

Obsah

Cílová skupina Jiné zdroje informací Architektura Importovaný obsah Co je to Scene Graph API? Vytvoření grafu transformace Balíčky pro správu paměti Vytvoření renderovacího grafu

Cílová skupina

O3D API je zaměřeno na vývojáře webu kteří jsou obeznámeni s JavaScriptem a mají nějaké znalosti 3D grafiky. Je také zaměřeno na herní vývojáře kteří chtějí sdílet svoji práci s uživateli populárních prohlížečů jako je Firefox, Safari, Google Chrome a Internet Explorer. Protože O3D aplikace běží jako zásuvný modul prohlížeče, nemusí uživatelé překonávat problémy se stahováním a spouštěním kodu samostatných aplikací na jejich systémech. O3D API maximalizuje výkon programováním přímo ve stínovacím jazyku GPU, což je výhoda oproti čistém softwarovému renderování.

Pokud jste nováčky v programování grafiky, budete se pravděpodobně chtít podívat do nějakých jiných zdrojů abyste získali povědomí o základních programovacích konceptech ve 3D grafice. Tento průvodce má za cíl vám pomoci začít a detailně vysvětlit unikátní vlastnosti O3D.

Následující zdroje obsahují další užitečné informace o programování 3D grafiky:

Architektura

Následující obrázek ukazuje zjednodušený pohled na různé komponenty O3D a způsob jakým komunikují s grafickým hardwarem ve vašem počítači.

Zelené bloky jsou hlavními komponenty O3D:

JavaScriptový kod O3D aplikace je celý obsažen v HTML dokumentu který je načten do prohlížeče. Vše co potřebujete k vývoji O3D aplikace je zásuvný modul O3D a textový editor pro psaní kodu v JavaScriptu.

Jak ukazuje diagram s architekturou, O3D komunikuje s grafickým hardwarem vašeho systému (jeho GPU - grafická procesní jednotka) skrze knihovny OpenGL nebo Direct3D.

Importovaný obsah

Knihovna O3D poskytuje vykreslovací primitiva pro vytváření tvarů přímo ve vaší aplikaci (seznam bodů, seznam čar, seznam trojúhelníků, pás trojúhelníků a květ trojúhelníků). Jako příklad uvádí O3D ukázkový kod který ukazuje jak byste mohli importovat obsah ze COLLADA souboru. Ukázkový COLLADA Converter importuje obsah z aplikací pro tvrobu obsahu jako je Autodesk 3ds Max, Maya a Google SketchUp, jak můžete vidět na obrázku:

Jak je vidět na obrázku, "surové" soubory COLLADA exportované z 3ds Max, Maya a SketchUp jsou převedeny ukázkovým COLLADA Converter (horní zelený obdélník) do podoby použitelné pro O3D Scene Graph API. Více informací o psaní převaděčů lze najít v kapitole Importování souborů scény Průvodce vývojáře.

Co je to Scene Graph API?

O3D Scene Graph API se používá k vytváření grafu transformace a renderovacího grafu. Graf transformace ukládá informace o pozici, velikosti, tvarech, materiálech a stínovacích programech, ze kterých sestávají základní data "světa" 3D aplikace. Renderovací graf ukládá informace o tom, jak jsou tyto 3D objekty převedeny na konkrétní pixely které se zobrazují na obrazovce uživatele. Renderovací graf je zodpovědný za následující:

Prvně vaše aplikace vytvoří graf transformace 3D světa a základní renderovací graf pro detaily vykreslování. O3D pak prochází renderovací graf který získává informace z grafu transformace aby mohl zobrazit (renderovat) 3D obsah. Tento přístup je v kontrastu s "bezprostředním grafickým modem", kde jsou jednotlivé příkazy vykreslování vykonávány ihned po vydání.

Graf transformace

Transformace obsahuje matici která určuje jak jsou s ní asociované tvary umístěny a měřeny v 3D prostoru. Graf transformace je řazená kolekce transformací kterí jsou uspořádány v rodičovské hierarchii. Graf transformace aplikace má jednu kořenovou transformaci na vrcholu stromu a libovolně mnoho transformací uspořádáných ve větvích stromu.

Transformace mají kumulativní efekt, čili transformace definované výše ve stromu platí pro transformace definované níže ve větvích stromu grafu transformace.

Tvary

Transformace může mít jeden nebo více tvarů kterí jsou s ní spojeny. Tvar definuje kus geometrie která je umístěna a měřena jako jednotka. Tvar samotný je složen z primitiv, z nichž každí může mít přiřazen jiný materiál. Tvary jsou definovány nezávsile a poté asociovány s transformací která umístí tvar ve vlastním lokálním systému souřadnic. Například kdybyste vytvářeli stůl se čtyřmi stejnými nohami, vytvořili byste model tvaru nohy a pak se na něj čtyřikrát odkázali ve čtyřech transforamcích které určují pozice jednotlivých noh. Poté byste vytvořili desku stolu a odkázali se na ni transformací která ji umístí nad její čtyři nohy. Nakonec byste vytvořili rodičovskou transforamci pro celý stůl abyste mohli celou jednotkou pohybovat na požadovanou pozici. Zákadní graf transformace pro transformace a tvary které tvoří tento stůl by vypadal takto:

Materiály

Každé primitivum má jako parametr materiál. Materiál lze sdílet mezi více primitivy. Když importujete modely z externí 3D modelovací aplikace, primitiva jsou vytvořena automaticky dle potřeby pro různé materiály.

Efekty

Materiál obsahuje parametr pro efekt a parametr pro volitelný stav. Efekt samotný obsahuje vertexový stínovací program a fragmentový (pixelový) stínovací program, které dohromady určují jak obravovat pixely které tvoří výsledný tvar. Parametry materiálu, jako třeba jeho difúzní barva, spekulární barva, ambientní barva a další, jsou používány efektem na který se odkazuje.

Vytvoření grafu transformace

S O3D lze vytvořit graf transformace jedním ze dvou způsobů:

Můžete také použít kombinaci těchto způsobů, importovat nějaké modely a jiné vytvořit přímo v aplikaci. Nejčastěji O3D renderuje scénu pro vás na základě dat z pohledové a projekční matice ve vaší aplikaci. O3D poskytuje navíc podporu pokročilého řízení renderování, včetně stínů, průhlednosti, odlesků, výpočtů hloubky scény a současné zobrazování několika pohledů na scénu.

Když vytvoříte objekt v O3D, je automatcky přidán do balíčku, který zajišťuje že objekty nejsou náhodně vymazány. Pokaždé když je objekt odkazován jiným objektem, zvýší se počet jeho odkazů o 1. Balíček samotný také obsahuje jednu referenci pro každý objekt. Funkce pack.removeObject uvol�uje odkaz na daný objekt, a pack.destroy uvol�uje všechny odkazy v daném balíčku. Pokud takové volání odstraní poslední obsah na nějaký objekt, je tento objekt smazán z paměti.

Vytvoření renderovacího grafu

O3D poskytuje objekt DrawContext který je použit v pohledové a projekční matici. Pohledová matice představuje transformaci která převádí vertexy ze světových souřadnic na pohledové souřadnice. Projekční matice je transformace která převádí pohledové souřadnice na ořezové souřadnice. jakýkoli 3D obsah který je mimo kužel pohledu je zrušen, neboli oříznut. Tato matice je obvykle ortografickou nebo perspektivní transformací. DrawContext je sdílen objekty DrawPass a objektem TreeTraversal. Objekt TreeTraversal jej pooužívá pro třídění a objekt DrawPass jej používá během renderování. Tyto matice lze specifikovat i explicitně, nebo pokud importujete modely z jiných zdrojů, může O3D získat informace o pohledu z informací obsažených v importovaném obsahu.

Funkce createDrawElements() prochází graf transformace a generuje vykreslovací prvek pro každé primitivum v grafu transforamce. Vykreslovací prvek je v podstatě instrukce typu "vykresli toto primitivum". bez vykreslovacího prvku se nic nevykreslí. Vykreslovací prvky umož�ují O3D efektivně několikrát vykreslit to samé primitivum (například jednou jako aktuální tvar a jednou jako stín pro tento tvar). V některých případech může mít vykreslovací prvek přiřazen svůj vlastní materiál (například pro stíny). V případech kde oba, jak primitivum tak vykreslovací prvek mají k sobě přiřazeny materiál, pak má materiál přiřazený k vykreslovacímu prvku větší váhu než materiál dříve přiřazený k primitivu.

Typciký renderovací graf vytvořený pomocnou JavaScriptovou funkcí renderGraph.createBasicView obsahuje následující objekty:

Objekty v renderovacím grafu jsou procházeny (to znamená čteny a vykonávány) odshora dolů a zleva do prava (dle priority). Zde je krátké vysvětlení úloh prováděných objekty v typickém renderovacím grafu:

  • Objekt Viewport tvoří na obrazovce obdélníkovou plochu kde se bude odehrávat další vykreslování (renderovací graf může mít takovýchto objektů několik). Nastavení objektu Viewpoert je zděděno jeho dětmi v grafu scény.
  • Objekt ClearBuffer vyprázdní aktuální buffer (zásobník grafické paměti), v tomto případě obrazovku.
  • Objekt TreeTraversal prochází graf transformace a přidává každý vykrelsovací element do jednoho nebo více vykreslovacích seznamů jak je vidět na obrázku. Standardní renderovací graf má dva vykreslovací seznamy: jeden pro výkonný renderovací průchod použitý pro neprůhledné materiály a jeden pro hloubkově řazený (z-ordered) renderovací průchod pro průhledné materiály. Objekt TreeTraversal kontroluje při průchodu grafem transformace a efektivně vylučuje objekty které nebudou renderovány. Například pokud je parametr tranformace visible nastaven na FALSE, je vyloučen a nevytvoří se žádný vykreslovací prvek asociovaný s jeho objekty tvaru. Pokud je parametr transformace culling nastaven na TRUE, použije TreeTraversal výpočet který určí zda děti transformace leží ve viditelné oblasti DrawContext asociovaného DrawList.
  • Objekty StateSet nastavují různé renderovací stavy které jsou děděny jejich dětmi. Například objekt StateSet, který je rodičem objektu DrawPass nastavuje prolínání alfa kanálu (důležitého pro průhlednost).
  • Každý DrawPass objekt renderuje svůj DrawList, který obsahuje všechny vykreslovací prvky vytříděné objektem TreeTraversal aktuálního průchodu.

Na konci každého průchodu grafu scény je zobrazena scéna.