English Welcome Kecy Programování 3D - Engine Guestbook Odkazy Downloady O autorovi Napiš mi Mailform |
3D - Engine 13 - různé dodělávky
Lens flares
Lens flares se dá přeložit asi jako "odlesky v objektivu". Určitě ste už v televizi viděli, jak se kamera dívá do sluníčka a objeví se několik odlesků okolo. To je ono, o čem mluvím. Je to způsobeno odrážením se světla od čoček a jiných optických příšerností v kameře. Ve hrách bývají ve dvou základních druzích. První, méně častý je právě simulace kamery. Na obrazovce je několik kroužků, které se pohybují podle vzájemné pozice kamery a světla. Druhý, častější způsob je prostě jen jeden světlý kroužek okolo světla. Ten funguje tak, že čím dál jste od světla, tím je větší (tedy obráceně, než ostatní objekty) a pokud je světlo něčím zakryto, pomalu zhasne - ne okamžitě. Lepší by bylo, kdyby se počítala viditelnost nějakého bounding boxu okolo světla, ale to je zase dost složité. Možná vám ještě není jasné, jak se vlastně kreslí - jednoduše : aditivním směšováním. Prostě sečtete texturu flare s obrazem. Měl bych poznamenat, že lens flares by se neměly protínat se světem, působí to hodně nepřirozeně. No a jak má taková textura vypadat ? Třeba takhle : (3DS-Max)
A výsledek ...
(Unreal) (Quake 3 Arena)
... pokud kreslíte textury, měli byste si dát pozor a udělat vlastní flare radši menší, aby nebyla
v textuře "uřízlá" - potom to vypadá ošklivě.
Zdrojáky na lens-flares jsou tak jednoduché, že je sem snad ani nebudu dávat ... no a stejně
jsou vlastně v engine s lightmapama (dva díly dozadu)
Pokud jde o ty světla, teď jdou do módy plošná světla. Takové neelegantní řešení je udělat
na něj víc kulatých flares ... a je to. Ale jde to i jinak - udělá se druhá vrstva obrazu (třeba
i s čtvrtinovým rozlišením), do které se nakreslí světla jako barevné plochy a potom se normálně
rozmáznou. Výsledek nevypadá špatně:
Farbrausch používá tuhle metodu poměrně často
Další možnost, kterou používá třeba i takový Doom3, je vytvořit speciální geometrii
která bude vypadat jako flare. Opět na tom není nic moc složitého, vypadá to takhle:
A pro úplnost ještě jak to vypadá wireframe:
Ta kulatá podivná geometrie je pro flare
Particle systémy
Particle systémy se používají na věci jako oheň, kouř, atd ... Mohl bych přeložit, že paricle znamená "částečka". Tak to také vypadá : particle systém má nějaký emitor, který má určitý tvar, umístění a velikost a z něj vyletují částečky. Jak se zobrazí ? Jako sprite. Sprite jsou 2D útvary, podobně jako lens-flares, jenže ty už se kreslí normálně se zapnutým Z-Bufferem (S-bufferem) Částečky můžou lítat různými směry, různými rychlostmi a můžou nějak měnit svůj směr (opilecká chůze, nebo turbulence, nebo gravitace / vítr, atd ...) Particle systém by měl být hodně rychlý, protože částeček bývá mnoho (řádově tisíce), takže se nemůže počítat žádný složitý výpočet (protože se dělá pro každou částečku zvlášť) Zase vás zklamu, protože zdroják na poměrně dobrej particle systém je ve hře Indiana Jones & Sila, v sekci downloady, takže si ho prohlídněte i se hrou ... Ještě zase taková rada ... částečky za sebou můžou nechávat stopu (tzn. kreslí se víc částeček, ležících na stejné trajektorii, jenže se proti směru pohybu zmenšují) viz. Doom 3 :
After - efekty
To jsou volně přeloženo efekty po (ne požití, ale vykreslení obrazu). Sem může patřit gamma korekce, kontrast a jas nebo podobné, ale také různé jiné. V mnoha hrách jsou různé "quad damage" stavy, kdy se změní celé vidění - potom se dělají různé transformace barev, blurování atd ... vezmu pár efektů, jak mě budou napadat Starý film
Rozladěná televize
Noční vidění
Painkiller boost
Pod vodou
Vlnící se vzduch
Docela často se používá deformace obrazu, stálo by za to říct, jak se to dělá. První možnost je mít
nějakou funkci a s tou posouvat souřadnice čteného pixelu (pixely se budou kopírovat do jiného
bufferu) Další možnost ja rozdělit obrazovku na polygony a hýbat s jejich vrcholy, takže obraz
se deformuje. Jednoduše se tak taky dělají všelijaké efekty čoček.
Na prvním obrázku je originální obraz, na druhém obrázku je znázorněná síť polygonů, použitá pro deformaci
a na třetím obrázku je výsledný zdeformovaný obrázek.
Mezi after-efekty by se taky dala zařadit HDR post-produkce. Jde to dokonce i bez HDR, i když ne tak dobře. Stačí, když budete obraz počítat trošku tmavší (třeba o 10%) a potom všechny hodnoty > 90% budou zářit (ne samy, musíte to samozřejmě napasat - uděláte si masku ve které bude bílá na 100% a černá na 90%. Potom zkopírujete obraz do druhého bufferu, násobíce jej touhle maskou a celý buffer rozmažete (ne obráceně! napřet maska, potom rozmazat!). Potom ho zkopírujete zase zpět - a světlé věci budou zářit do okolí !). Stejně dobře můžete udělat i exposure-control, a to tak že budete vždy sledovat světlost předchozího snímku a podle toho expozici upravíte. Výsledek sice není tak přesný jako opravdové HDR, ale i tak vypadá dobře.
Na prvním obrázku je zase originální scéna, na druhé je scéna vynásobená maskou, na třetím je navíc rozmazaná
a čtvrtý obrázek vznikl součtem prvního a třetího. Vypadá to dobře, ale dejte si pozor - co je bílé,
začne zářit. Takže je opravdu lepší kreslit obrázky tmavší, než by ve skutečnosti byly.
Tenhle trik používal například 3D Mark 2003 ve scéně "Nature", a to jen v módu demo, ne v testovacím módu.
Antialiassing
Antialiassing je docela dobrá věc, ale tak jak je implementovaná na grafických kartách, sežere dost výkonu. Antialiasing způsobuje rozmáznutí hran, takže rastr vypadá korektněji a ne tak zubatě. Antialiasingu je hodně druhů. Mezi ty základní patří FSAA (full screen AA) - obraz se spočítá s několikrát vyšším rozlišením (2x, 4x, 6x, 8x) a potom se zmenší. Potom připadne na jeden výsledný pixel víc zdrojových a průměr dá poměrně dobrý výsledek. Bohužel, tahle metoda je nejnáročnější. Určitou optimalizací je Quincunx AA, který potřebuje obraz s rozměry o jedna větší, takže není tolik náročný jako FSAA. No jo, ale jak z toho uděláme výsledný obraz ? Vezme se bod, potom tři další, ležící na dalším sloupci (řádku). První bod má váhu 1/2 + 1/8, další mají váhy 1/8, což dohromady dá jedna. Quincunx se ale chová systémem "za málo peněz málo muziky". Další druh je adaptivní AA, který počítá obraz s vyšším rozlišením jen tam, kde jsou rušivé hrany. Potom by mohly následovat obrazové filtry, které vezmou obraz jako časový průběh a odstraní z něj vysoké frekvence (= ostré hrany) Asi nejúčinějším algoritmem je přímo optimalizovaný rasterizér, který nedává výsledky "hrana začíná tady a končí tam", ale i informaci o tom, jak dlouho hrana nabíhá a jak dlouho se ztrácí (tzn. přechází z / do průhlednosti) No a takhle vypadá FSAA v praxi : vlevo s FSAA, vpravo bez (zvětšeno 4x)
Tak ... to bude pro dneska asi všechno, příště se vrhnem na OpenGL.
-tHE SWINe- |