Rozeberte render
Co jsou AOV, jak se CG beauty rozdělí na passy a zase se sečte zpět, a návyky, díky kterým zůstane vícepassový compositing rychlý, přesný a snadno upravitelný, když přijdou připomínky.
Compositing · Render passy · 17 min
Když 3D renderer dokončí snímek, obraz, který vidíte, je jen jednou z věcí, které umí uložit. Cestou spočítal, kolik světla dopadlo na každý povrch přímo, kolik se odrazilo z jiných povrchů, kam padly lesklé odlesky, jakou barvu měl každý materiál, jak daleko ležel každý bod a kam byl natočený. **AOV**, zkratka arbitrary output variable, tedy libovolná výstupní proměnná, je kterýkoli z těchto mezivýsledků zapsaný jako samostatný obraz. Compositoři jim podle softwaru říkají také render passy, render elementy nebo render vrstvy. Se správnými AOV může compositor změnit jas jednoho světla, barvu jednoho objektu nebo míru pohybové neostrosti, aniž by záběr posílal zpět na nový render. Tento článek prochází hlavní passy, ukazuje, jak z nich znovu poskládat výsledný obraz, a končí osvědčenými postupy, díky kterým zůstane vícepassový compositing poctivý. Každý obrázek vychází z jedné malé místnosti, kterou váš prohlížeč ray-trasuje, a její AOV jsou skutečné: opravdu se sečtou zpět do obrazu.
Pracovní poznámky rendereru
V praxi cestují AOV jednoho snímku obvykle společně v jediném **vícekanálovém souboru OpenEXR**. EXR umí uložit libovolný počet pojmenovaných kanálů, takže beauty sedí ve známých R, G, B a A a každý pass vedle ní jako samostatná vrstva, například diffuse_direct.R nebo P.X. V Nuke načte celý soubor jediný nod Read a nod Shuffle vytáhne vrstvu, kterou chcete. Ukažte na obraz výše a podívejte se na čísla. Tentýž pixel nese barvu ve světelných vrstvách, vzdálenost v hloubce, směr v normálách a 3D souřadnici v pozici. Všechno jsou to jen čísla v kanálech. Mění se jen to, co čísla znamenají, a tedy co s nimi smíte dělat.
Passy patří do dvou rodin a jejich oddělení je první osvědčený postup. **Světelné passy** (také beauty nebo shading passy) jsou výseče světla v obraze: difuzní světlo, které přichází rovnou ze světla, nepřímé světlo, které se nejdřív odrazilo od jiného povrchu, spekulární odlesky a odrazy, emise ze svítících věcí a ve skutečné produkci také podpovrchový rozptyl, průchod světla, coat a sheen. Sečtěte je plusem a dostanete beauty. **Datové passy** (také utility nebo technické passy) nejsou světlo vůbec. Albedo je barva povrchu, hloubka je vzdálenost, normály jsou směry, pozice je souřadnice, motion vektory jsou posun v pixelech a ID pass říká, který objekt je který. Do obrazu je nikdy nepřičítáte. Používáte je k rozhodování o něm.
Každý renderer má pro stejné myšlenky vlastní názvy a tabulka výše je malý slovníček čtyř oblíbených. Nejdůležitější je zvýrazněný řádek. V Arnoldu, V-Ray a Redshiftu už hlavní difuzní passy obsahují barvu povrchu, takže je jednoduše sečtete. V Cycles z Blenderu jsou přímé a nepřímé difuzní passy čisté světlo a před sečtením je vynásobíte passem Diffuse Color. Manuál Blenderu ten recept uvádí výslovně: každý typ světla je barva krát součet přímého a nepřímého. Spleťte se a rekonstrukce vyjde šedá nebo dvojnásobně sytá. Než tedy cokoli postavíte, přečtěte si v dokumentaci svého rendereru přesný vzorec a napište ho na lepicí poznámku ve skriptu.
Sečtěte to zpět, pak to dokažte
Se světelnými passy nejdřív uděláte jedno: složíte je zpět a ověříte, že nic nechybí. V Nuke to znamená Shuffle pro každý pass a řetěz nodů Merge nastavených na **plus**, všechno v lineárním světle, před jakoukoli gradací. Pak výsledek odečtěte od původní beauty pomocí Merge nastaveného na difference, nebo mezi nimi jen přepínejte. Dokonalá rekonstrukce je všude černá. Když v rozdílu vidíte záři, nějaký pass chybí: často průchod světla, podpovrchový rozptyl, vrstva coat nebo světlo prostředí. Když vidíte tvary podél hran, renderer filtroval některé passy jinak než beauty. Teprve když je rozdíl černý, víte, že passy jsou celý obraz, a teprve pak je bezpečné je gradovat. Vypněte výše jeden pass a sledujte, jak se přesně to světlo objeví v rozdílu.
Albedo je nejužitečnější datový pass pro gradování světla. Difuzní světlo je barva povrchu vynásobená světlem, které na něj dopadlo, takže vydělením barevného difuzního passu albedem zbude samotné **surové světlo**. Teď můžete obojí měnit zvlášť. Gradujte surové světlo a každý materiál na nové světlo správně zareaguje, modrý obraz stejně jako oranžový míč. Změňte albedo a objekt dostane novou barvu a přitom si ponechá stíny a stínování, což je rychlá odpověď na otázku „můžeme vidět bednu v červené?“ bez nového renderu. Dvě varování. Kde je albedo nulové nebo téměř nulové, dělení exploduje, proto ho omezte nebo ošetřete a pixely, kde je albedo černé, nechte být. A zpětné násobení musí použít přesně stejné albedo, kterým jste dělili, jinak hrany a textury chytí halo.
Jakmile je rekonstrukce přesná, je každý pass páka. Ztlumte nepřímý pass a místnost zešeří a zkontrastní. Zesilte spekulární pass a míč i bedna vypadají lesklejší. Zjasněte emisi a panel na zadní stěně víc žhne. Pruhy vedle obrazu jsou statistika, kterou stojí za to mít v hlavě: v této místnosti nese většinu snímku přímé difuzní světlo, takže malé změny tam pohnou celým obrazem, zatímco spekulární pass je malá výseč energie, které si oko přesto všimne první. Passy gradujte gainem ve stopách, ne liftem ani gamou, protože násobení zachová sčítání passů tak, jak se skutečně sčítá světlo. A každou gradaci držte malou. Pass posunutý o mnoho stop od toho, kde ho nechalo svícení, obvykle znamená, že záběr potřebuje poznámku pro lighting, ne opravu v compu.
Světelné passy lze rozdělit ještě druhým způsobem: podle světla místo podle typu. **Light group** (Arnold mu říká AOV light group, V-Ray element Light Select, Redshift a Blender Light Group) je beauty vytvořená jen jedním světlem nebo jednou sadou světel. Sečtěte všechny skupiny a jste zpět u beauty. Naše místnost má teplé hlavní světlo zprava, studené doplňkové zleva a oblohu shora a vy je teď můžete vyvažovat jako stmívače na osvětlovacím pultu. Tento pass ušetří nejvíc nových renderů, protože nejčastější poznámka k CG záběru zní „o kousek míň doplňku“ nebo „ať je hlavní světlo teplejší“. Renderery, které podporují light path expressions, třeba Arnold, RenderMan a Karma v Houdini, vám dovolí jít dál a obě dělení kombinovat, například spekulár jen z hlavního světla, ale každý pass navíc znamená víc místa na disku, proto si o skupiny řekněte tam, kam pravděpodobně dopadnou poznámky.
Masky, mlha, rozmazání a světlo z čísel
**Hloubkový pass**, Z, ukládá, jak daleko je každý pixel od kamery. Jeho dvě klasická použití jsou atmosféra a hloubka ostrosti. Mlha, opar a vzdušná perspektiva jsou míchání k barvě mlhy, které roste se vzdáleností, jako na obrázku, a nod ZDefocus v Nuke používá stejný pass k rozostření každého pixelu podle jeho vzdálenosti od roviny ostrosti. Podívejte se na histogram: většina pixelů této místnosti leží zhruba tři až devět metrů daleko, takže právě tam ovladače mlhy pracují. Se Z souvisejí dva osvědčené postupy. Zaprvé znejte konvenci. Některé renderery zapisují skutečnou vzdálenost a jiné normalizovanou nebo invertovanou hloubku, proto si hodnoty ověřte ve vieweru, než jim začnete věřit. Zadruhé hloubka nemá na hraně žádnou smysluplnou mezihodnotu, k čemuž se vrátíme v části 4.
**Pass normál**, N, ukládá, kam je každý povrch natočený, jako vektor ze tří čísel. Vezměte skalární součin tohoto vektoru se směrem světla a dostanete, nakolik je každý pixel k tomu světlu natočený, což je přesně tvar jednoduchého difuzního svícení. Vynásobte albedem a barvou, přičtěte navrch a máte nové světlo, které v renderu nikdy neexistovalo. Nod Relight v Nuke to dělá s 3D světlem a **pass pozice**, P, který ukládá místo každého pixelu ve 3D scéně, dovolí tomu světlu slábnout se vzdáleností a vám kreslit 3D masky, které drží na površích. Náš dřívější článek *Pixely jsou vektory* tu matematiku prochází krok za krokem. Háček je v popisku: žádný stín ani odraz, protože pass zná jen pixel, na kterém leží, takže to berte jako kontru nebo dotek světla, ne jako nové hlavní světlo.
Matte jednotlivých objektů dřív pocházela z **ID passů**: renderer natřel každý objekt plochou červenou, zelenou nebo modrou a compositor jednu barvu vyklíčoval. Funguje to, dokud se nepodíváte zblízka. ID pass pojme jen jeden objekt na pixel, takže na každé hraně je matte všechno, nebo nic, a gradace přes něj nechá zubatou čáru neupravených pixelů. Navíc mu rychle dojdou barvy. **Cryptomatte**, které v roce 2015 zveřejnili Jonah Friedman a Andy Jones z Psyopu a které dnes podporují Nuke, Fusion, Blender i další nástroje, řeší oba problémy. Pro každý pixel ukládá seznam ID objektů spolu s tím, kolik pixelu každý pokrývá, takže matte je na hranách měkké, funguje i přes pohybovou neostrost a průhlednost a dovolí vám vybrat libovolný objekt ve scéně jedním kliknutím. Přibližte si výše hranu a přepínejte mezi oběma. Žádejte Cryptomatte podle objektu, materiálu a assetu jako standard a odpadne většina požadavků na roto pro CG.
**Motion vektory** ukládají pro každý pixel, jak daleko a kterým směrem se mezi snímky posunul na obrazovce, obvykle jako dva kanály pro x a y. Nod jako VectorBlur v Nuke rozmaže každý pixel podél jeho vektoru a v compu tak předstírá pohybovou neostrost. Render je to levnější a závěrku můžete změnit později, ale porovnejte tři verze výše. Vektorové rozmazání má jen pixely, které kamera viděla, takže neodhalí, co bylo za pohybujícím se objektem: rozmažte míč přes hotovou beauty a ostrý míč pod rozmazáním pořád zůstane. Z toho plyne osvědčený postup. Rychle se pohybující objekty renderujte jako samostatnou vrstvu nad odděleným pozadím a u svého rendereru si ověřte, zda jsou jeho vektory měřené dopředu, dozadu nebo vystředěné na snímek a zda v pixelech, nebo v normalizovaných jednotkách, protože to nod pro rozmazání musí vědět. Pro velmi rychlý nebo rotující pohyb a pro cokoli viděné přes průhlednost je skutečná 3D pohybová neostrost pořád bezpečnější volba.
Přesnost, velikost, hrany a pořádek
EXR umí každý kanál uložit jako 16bitový **half float** nebo 32bitový **full float** a volba pro každý pass je jedna z nejsnazších výher v pipeline. Half float drží zhruba tři platné číslice při jakémkoli jasu, což světlu bohatě stačí, takže světelné passy a albedo mohou být v half a zabrat polovinu místa. Datové passy jsou jiné, protože jejich hodnoty jsou měření. Do metru od počátku je pozice v half floatu přesná zhruba na milimetr, ale 512 metrů daleko jsou její kroky půl metru široké a P maska postavená na ní se rozpadne na bloky, jak ukazuje obrázek. Hloubka má daleko od kamery stejný problém a ID Cryptomatte jsou bitové vzory, které se musí uložit přesně. Tedy: **světlo v half, P, Z a ID ve full floatu**, a CG scény držte blízko počátku, kde to jde.
Každý pass stojí místo na disku, síť a čas čtení v každém snímku, pro každého, kdo záběr otevře, proto žádejte to, co záběr potřebuje, ne všechno, co renderer nabízí. Kalkulačka ukazuje, jak rychle to roste: typická sada světelných passů, light groups a datových passů v UHD přesáhne před kompresí gigabajt na snímek. Komprese hodně pomůže a volba kodeku je stejně důležitá jako volba passů. Bezztrátové kodeky jako ZIP a PIZ jsou bezpečná výchozí volba pro datové passy, kde záleží na každém bitu. Ztrátové DWAA a DWAB dávají mnohem menší soubory a pro světelné passy a pláty často stačí. Domluvte se na standardním seznamu AOV pro projekt, přidávejte passy pro jednotlivé záběry, když si o ně řekne poznámka, a passy, které do finálu záběru nikdo neotevřel, odstraňte.
Na hranách se datové passy kazí. Renderer vyhlazuje hrany tak, že trasuje mnoho vzorků na pixel a filtruje je do jedné hodnoty. Pro barvu je průměrování správné: pixel, který je napůl míč a napůl stěna, má mít půl každé barvy. Pro hloubku, pozici nebo normály je to nesmysl. Zprůměrujte míč čtyři a půl metru daleko s podlahou tři metry za ním a dostanete hloubku, kde nic není, a mlha, rozostření nebo 3D maska pak udělá halo přesně tam. Proto renderery nabízejí pro datové AOV filtr **closest** (Arnold má třeba closest_filter právě pro tyto passy) a proto byste datový pass nikdy neměli unpremultiplikovat, gradovat ani rozmazávat, jako by to byla barva. Světelné passy jsou naopak premultiplikované obrazy jako beauty: gradujte je v lineárním světle, při sčítání je nechte premultiplikované a unpremultiplikujte jen pro operace, které to potřebují.
Nakonec pořádek. Uklizený AOV skript se čte shora dolů pokaždé ve stejném pořadí, takže ho kdokoli z týmu otevře a najde světlo, které má změnit. EXR načtěte jednou, každý světelný pass vytáhněte Shufflem do jedné řady, každý gradujte ve vlastním sloupci, sečtěte je zpět merge nody na plus a kontrolu rozdílu proti původní beauty si nechte ve skriptu, vypnutou, ale připravenou, abyste po každém novém renderu rekonstrukci dokázali. Datové passy odbočte stranou: Cryptomatte do vstupů masek, Z do mlhy a ZDefocusu a motion vektory do VectorBluru pozdě v řetězci, až po spojení vrstev. Pojmenujte nody podle toho, co dělají, každou skupinu dejte do popsaného backdropu a ponechte názvy vrstev z rendereru, aby nová verze EXR zapadla rovnou na místo. Udělejte to a poznámka, která by znamenala nový render, se stane dvouminutovou úpravou.
Zdroje a další čtení
- Manuál Blenderu, „Render Passes“ (světelné passy v Cycles a jak se skládají): docs.blender.org
- Autodesk, uživatelská příručka Arnoldu, „AOVs“ a „Light Path Expressions“: help.autodesk.com
- Chaos, dokumentace V-Ray, „Render Elements“: docs.chaos.com
- Maxon, dokumentace Redshiftu, „AOVs“: help.maxon.net
- Foundry, Nuke Reference Guide: Shuffle, Merge, ZDefocus, VectorBlur, Relight, Cryptomatte: learn.foundry.com
- Jonah Friedman a Andy Jones, „Fully Automatic ID Mattes with Support for Motion Blur and Transparency“, poster SIGGRAPH 2015, a specifikace Cryptomatte: github.com/Psyop/Cryptomatte
- Dokumentace OpenEXR, formát half float a kompresní metody: openexr.com
*Všechny obrázky jsou ilustrace spočítané ve vašem prohlížeči z jedné jednoduché ray-trasované místnosti, ne produkční rendery ani snímky obrazovky žádného softwaru. Passy, rekonstrukce, statistiky, kroky přesnosti a velikosti souborů jsou skutečné výpočty na této scéně. Názvy passů v rendererech odpovídají dokumentaci jednotlivých výrobců k říjnu 2026.*