Caustic Graphics: raytracing konečně v reálu?
17.7.2009, Petr Štefek, technologie

O alternativních možnostech zobrazování na poli počítačových her jsme psali již před několika měsíci, ale zatím není po slibovaných inovacích ani vidu ani slechu. Kde je Intel a jeho Larrabee? Nevadí, máme zde totiž nového hráče s reálným hardware.
Kapitoly článku:
CausticGL není, pokud se týká fungování, příliš odlišné od zaběhaných rozhraní DirectX a OpenGL, takže i zde máme pipeline s několika úrovněmi, kde každá z nich zpracovává kód shaderu. V ilustračním obrázku vidíme Ray shader, který je asi nejpodstatnější částí celého CausticGL, a proto se na něj podíváme trošku blíže.
Nejdůležitější na ray shaderu jsou samozřejmě samotné paprsky (nepředstavujte si hned sluneční paprsky), jejichž interakce s předměty scény je alfou a omegou raytracingu. Ray shader je spojen s každým objektem scény a vždy, když tento objekt protne paprsek (zdrojem je kamera scény) dojde k vyhodnocení toho, jako bude v tomto bodě vypadat světlo a případný materiálový efekt (reflexe, refrakce, absorpce, fluorescence).

Samotné paprsky jsou vytvářeny pomocí CausticGL a následně GLSL (OpenGL Shading Language) přidá funkci pro samotné vytvoření paprsku. Když je paprsek emitován, tak se platforma CausticRT (Caustic One + CausticGL) postará o vyhodnocení, který paprsek a kde protne objekty, které jsou přítomny na scéně. Počet těchto paprsků se v současné době pohybuje v závislosti na software maximálně do několika tisíc, což náš současný nejlepší hardware zvládá jen stěží (max. jednotky FPS).

Co je Frame Shader? Slouží jednoduše jako prvotní zdroj dat pro emitování jednotlivých paprsků a jsou také využívány pro implementování kamery nebo další filtry celé scény. Frame Shader pracuje pro každý pixel zvlášť a je taktéž zodpovědný za všechny další paprsky, které určují výslednou barvu pro pixel. Ray Shadery mají přístup ke specifickým datům jednotlivých objektů a Frame Shader má opět specifické parametry pro svou práci založené na celkové zpracovávané scéně.
Ray tracing pracuje specifickým způsobem, takže geometrie 3D scény musí být upravena. Moderní rasterizační enginy (například. Unreal Engine nebo Cry Engine 2) používají pokročilé algoritmy k odstraňování geometrie, která není pro kameru scény viditelná (Culling). To vše pomůže rasterizačním enginům zpracovávat jen ta data, která jsou skutečně potřeba, což značně snižuje potřebu surového výkonu.
Tyto metody bohužel nejsou využitelné také v případě raytracingu, neboť v případě paprsků, které se „odráží“ od různých objektů na scéně, se nemůže stát, aby paprsek narazil ve scéně na odstraněnou část objektu, která není současně viditelná pro kameru scény. Pokud by se tak stalo, narušilo by to zobrazení celé scény. Představte si například zrcadlovou diskotékovou kouli, jež by do prostoru scény neodrážela světlo ze strany, která není přímo viditelná pro kameru.

CausticGL a potažmo celá platforma CausticRT potřebuje veškerá data geometrie o scéně pro renderovací proces. To vše ovšem přináší výrazný nárůst potřeby paměti, kdy scéna renderovaná skrze raytracing zabírá více paměti než to samá scéna referovaná v rasterizačním engine.
CausticGL je tedy hodně závislá na rychlosti přístupu do paměti a hlavně paměťového řadiče na hardware Caustic One a Caustic Two. Vývojáři ze spolku Caustic Graphics nejsou zatím moc sdílní, pokud se týká technických věcí, jelikož jejich patentové řízení není ještě ve všech ohledech vyřešeno, a tak se musíme spokojit pouze s nástiny. Chlapci tedy tvrdě zapracovali na “behind-the-scenes“ akceleraci rozpoznávání stavu, kdy u samotných paprsků dochází k interakci s objekty scény. To je naprosto stěžejní pro další rozvíjení raytracingu a zvyšování počtu paprsků, které jsou emitovány z pozice kamery celé scény.
Jednoduše řečeno, čím více je k dispozici emitovaných paprsků, tím větší bude realita scény. Opět se dostáváme zpět k problematice geometrie scény, která se nemění, a tak není možné ze snímku na snímek řešit složitě změny v akceleraci struktur.
Ray shaders
Nejdůležitější na ray shaderu jsou samozřejmě samotné paprsky (nepředstavujte si hned sluneční paprsky), jejichž interakce s předměty scény je alfou a omegou raytracingu. Ray shader je spojen s každým objektem scény a vždy, když tento objekt protne paprsek (zdrojem je kamera scény) dojde k vyhodnocení toho, jako bude v tomto bodě vypadat světlo a případný materiálový efekt (reflexe, refrakce, absorpce, fluorescence).

Samotné paprsky jsou vytvářeny pomocí CausticGL a následně GLSL (OpenGL Shading Language) přidá funkci pro samotné vytvoření paprsku. Když je paprsek emitován, tak se platforma CausticRT (Caustic One + CausticGL) postará o vyhodnocení, který paprsek a kde protne objekty, které jsou přítomny na scéně. Počet těchto paprsků se v současné době pohybuje v závislosti na software maximálně do několika tisíc, což náš současný nejlepší hardware zvládá jen stěží (max. jednotky FPS).
Frame Shader

Co je Frame Shader? Slouží jednoduše jako prvotní zdroj dat pro emitování jednotlivých paprsků a jsou také využívány pro implementování kamery nebo další filtry celé scény. Frame Shader pracuje pro každý pixel zvlášť a je taktéž zodpovědný za všechny další paprsky, které určují výslednou barvu pro pixel. Ray Shadery mají přístup ke specifickým datům jednotlivých objektů a Frame Shader má opět specifické parametry pro svou práci založené na celkové zpracovávané scéně.
Vertex and Geometry Shaders
Ray tracing pracuje specifickým způsobem, takže geometrie 3D scény musí být upravena. Moderní rasterizační enginy (například. Unreal Engine nebo Cry Engine 2) používají pokročilé algoritmy k odstraňování geometrie, která není pro kameru scény viditelná (Culling). To vše pomůže rasterizačním enginům zpracovávat jen ta data, která jsou skutečně potřeba, což značně snižuje potřebu surového výkonu.
Tyto metody bohužel nejsou využitelné také v případě raytracingu, neboť v případě paprsků, které se „odráží“ od různých objektů na scéně, se nemůže stát, aby paprsek narazil ve scéně na odstraněnou část objektu, která není současně viditelná pro kameru scény. Pokud by se tak stalo, narušilo by to zobrazení celé scény. Představte si například zrcadlovou diskotékovou kouli, jež by do prostoru scény neodrážela světlo ze strany, která není přímo viditelná pro kameru.

CausticGL je tedy hodně závislá na rychlosti přístupu do paměti a hlavně paměťového řadiče na hardware Caustic One a Caustic Two. Vývojáři ze spolku Caustic Graphics nejsou zatím moc sdílní, pokud se týká technických věcí, jelikož jejich patentové řízení není ještě ve všech ohledech vyřešeno, a tak se musíme spokojit pouze s nástiny. Chlapci tedy tvrdě zapracovali na “behind-the-scenes“ akceleraci rozpoznávání stavu, kdy u samotných paprsků dochází k interakci s objekty scény. To je naprosto stěžejní pro další rozvíjení raytracingu a zvyšování počtu paprsků, které jsou emitovány z pozice kamery celé scény.
Jednoduše řečeno, čím více je k dispozici emitovaných paprsků, tím větší bude realita scény. Opět se dostáváme zpět k problematice geometrie scény, která se nemění, a tak není možné ze snímku na snímek řešit složitě změny v akceleraci struktur.