Jelen szöveg a procedurális úton előállított, absztrakt és stilizált formákra épülő illusztrációk, animációk elkészítéséhez kapcsolódik 3d szoftveres környezetben, a Blender-program példáján keresztül. Célja a procedurális munkafolyamat áttekintő bemutatása, valamint a folyamat hibrid, egyszerre virtuális és valós jellegének kiemelése. Az itt leírtak előnye, hogy bármely más, hasonló környezetre átvihetők, illetve az eljárások egy részét eleve más szoftverekből ismert esetek inspirálták. A munkafolyamat ismertetését általános megjegyzések követik és egészítik ki.(1)

Kiindulópontunk a program procedurális módosítóival (modifiers) való nem destruktív modellezés. Ezt követi a módosítók animálása, a shaderek felépítése, a bevilágítás, a kamera és a render-paraméterek beállítása, majd a kész kép, képsorozat kompozitálása. A folyamat maga erősen iteratív és rekurzív, gyakran szerencsés baleseteken keresztül halad előre. Az egyes fázisokhoz – a módosítókkal való modellezéshez, a shaderekhez, a fényezéshez és a render-paraméterekhez – bármely későbbi fázisban visszatérhetünk és módosíthatunk rajtuk, így a folyamat végtelen számú iterációra ad módot. A módszer hibrid jellegét az adja, hogy a folyamat során készen kapott valóságelemeket – fényképeket, különböző textúrákat, magas dinamikatartományú képeket – ötvözünk procedurális úton előállított formákkal, modellekkel (melyek maguk is a valóság egy mélyebb, matematikai-fizikai összefüggéseit követik), majd az így kapott hibrid testeket a program kamerájával felvesszük, ahol újabb valós effektekkel (a fizikai kamera tehetetlenségét, a filmanyag kémiáját imitáló hatásokkal) járulunk hozzá az illúzióhoz.

A fent leírt, az absztrakt digitális illusztrációk, vagy a motion graphics körébe tartozó digitális felvételek esetében gyakori folyamat procedurális jellegét elsőként az adja, hogy a „lefényképezendő” tárgyat nem kézzel modellezzük a vertexpontok, élek és poligonok fáradságos elrendezésével, hanem adott szabályok, algoritmusok egymást követő rétegein keresztül hozzuk létre. Az 1. képen szereplő modellt például több, rétegekként egymásra épülő modifier(2) segítségével alakítottuk ki egyetlen kockából. A kocka oldalait előbb felosztottuk, hogy kellően gazdag geometriával rendelkezzen a későbbi műveletekhez, majd a Cast, VertexWeightEdit, Mask, Solidify és Subdivision modifiereket alkalmaztuk rajta a megfelelő paraméterekkel, a felsorolásuk sorrendjében (2. kép).

2. kép: Procedurális úton előállított tárgy különböző modifierjei és a hatásuk

Az eredeti kocka kisebb egységekre történő felosztását (subdivision) az indokolta, hogy létrejöttekor nem rendelkezett elegendő geometriával a később elvégzendő műveletekhez. Az első modifier, a Cast a modell felületét (közelebbről: a vertexek pozícióit) előre definiált formák felé mozdította el (gömb-, henger- vagy kockaforma felé). Példánkban a 2. számú képen jól látható, hogy a módosító által kialakuló hat gömbszerű alakzat az eredeti kocka hat oldalára vezethető vissza. A Vertex Weight Edit és Mask modifierek a Cast által módosított modell felületét egy előzetesen megállapított textúra (a példánkban haránt irányú csíkok) szerint maszkolták, azaz „lyuggatták ki”. A Vertex Weight Edit azt állapítja meg, hogy a modell mely vertexpontjai milyen súllyal essenek latba a kiválasztott mintázat szerint; a Mask pedig ezt a választást érvényesíti, azaz dinamikus módon tünteti el, vagy épp jeleníti meg a vertexeket előzetesen megállapított vertexcsoportok alapján. A procedurális modellezés módszerének előnye ezen a ponton különösen szembetűnő, ugyanis már a módosítók alapbeállításai mellett is gyakorlatilag végtelen variáció hozható létre csupán a textúra és a textúra paramétereinek változtatásával, illetve ide is bármikor visszatérhetünk a későbbiekben, hogy módosítsuk a tárgy alakját. A Solidify módosítót a maszkolás után létrejövő hártyaszerű felület valószerűvé tétele céljából használtuk; nélküle ugyanis az élek és élfények hiánya miatt súlytalannak, éterinek hatna az alakzat (3. kép).

3. kép: A Solidify modifier nélküli (balra) és az általa módosított modell (jobbra)

Az utolsó, Subdivision modifier az előzetesen felosztott geometriát gazdagította tovább a majdani renderfázisban. Hatása főként esztétikai: a kisszámú vertex okozta nyerseséget oldotta, közvetve pedig a realizmust fokozta. A procedurális módosítókkal való modellezés, mint láttuk, nem destruktív módon állítja elő a tárgyat, azaz a folyamat bármely pontján (akár a renderelés, kompozitálás fázisaiban is) visszamehetünk és változtathatunk a paramétereken, közvetve pedig a modellen. A paraméterek nagy része természetesen animálható is, ami újabb módosítókkal kiegészülve szinte végtelen számú tárgy és mozgás előállítására ad módot.

A hibriditás a leglátványosabban a folyamat következő lépésében jelenik meg a modell shadelése, anyagszerűvé tétele során. A Blender hivatalos oldalán a következők szerepelnek a Shaders tárgyszó alatt: „Materials, lights and backgrounds are all defined using a network of shading nodes. These nodes output values, vectors, colors and shaders […] describing lighting interaction at the surface or of the volume, rather than the color of the surface.”(3) A Blender a modern 3d-s programok többségéhez hasonlóan node-alapú vizuális programnyelvet használ a shaderek felépítésekor, ahol a tárgyak színe helyett a fénnyel való interakció az, amit megragad (a fénytörést, a visszaverődést, a fényelnyelést, a diffúziót stb.). A node-ok, vagy csomópontok bemenettel és kimenettel rendelkező „utasítások”, és különböző műveleteket hajthatunk végre velük a fény-tárgy interakció befolyásolása során. A koncepció frappáns összefoglalása a következőképpen határozza meg a node-tree-t: „a data-processing pipeline of sorts, where data ‘flows from’ nodes which describe various sources, ‘flows through’ nodes which represent various processing and filtering stages, and finally ‘flows into’ nodes which represent outputs or destinations. You can connect the nodes to one another in many different ways, and you can adjust ‘properties’ or parameters, that control the behavior of each node”.(4) Jól végigkövethető a folyamat, ha közvetlenül vizsgáljuk az adatfolyam egyes állomásait, azaz a node-ok kimenetein megjelenő adatokat (4. kép).

4. kép: Az egyes node-ok kimenetein megjelenő adatok

Példánkban a tárgy és a környezet valós elemei különböző textúrák formájában jelennek meg: a tárgy esetében kőfalakról készített, ortografikus fotókat használunk a Principled BSDF node Roughness és Normal bemenetein (az előbbi a felület érdességét, diffúz/tükröződő részeit, az utóbbi a tárgy mikroszintű egyenetlenségeit hivatott érzékeltetni az eredeti geometria megtartása mellett), a környezetnél pedig nagy dinamikatartományú képet kötünk be a node tree megfelelő pontján. A jelenet bevilágítása, bár általában külön fázisként tárgyaljuk, már ezen a ponton, a shaderek kialakításakor elkezdődik a nagy dinamikatartományú kép (HDRI) révén. Az utóbbi kép már önmagában is alkalmas a jelenet bevilágítására, a Mapping és Texture Coordinate node-okkal kombinálva pedig tetszőleges mértékben eltolható, elforgatható, összehúzható és nyújtható a jelenet körül, ami nagyban befolyásolja a kamera által látott majdani fényviszonyokat. A bevilágítást természetesen más, virtuális fényforrásokkal is kiegészíthetjük a hasonló jelenetekben, a HDRI csupán a kiinduló fényviszonyokat adja meg.

Ami a hibriditás szempontjából különösen fontos, az a render- és kamera-paraméterek beállítása, ugyanis ezeken keresztül érhetőek el a ténylegesen létező, valamint a filmszerű (a filmkamera és a filmanyag fizikai-kémiai tulajdonságait, tehetetlenségét imitáló) effektusok, melyekhez filmnézőként hozzászoktunk. Példánkban az egyetlen lényegi rendereffektus a Screen Space Reflections, valamint annak Refractins opciója: az előbbi a képernyőtér 2d-s adatait használja fel a 3d térben elhelyezkedő tárgy tükröződéseinek kiszámításakor, míg az utóbbi a tárgy mögött látottakat vetíti rá torzítva a tárgyra, és így éri el a kívánt hatást (azaz „kegyes csalást” alkalmaz az effektus érdekében). Az utóbbi megoldás az aktuálisan használt EEVEE rendermotor sajátja, és itt fontos kiemelnünk, hogy a majdani kép milyensége nagyban függ majd a hasonló megoldásoktól. Pár mondat erejéig érdemes kitérnünk a Blender két render engine-jére, a valós idejű EEVEE-re és a sugárkövetésen alapuló produkciós rendererre, a Cycles-re annak érdekében, hogy lássuk, miféle esztétikai következményekkel és kompromisszumokkal jár a kettő közti választás.

Az EEVEE tárgyközpontú: a 3d-s világ tárgyait a kamera felé vetíti vissza, azaz a kép raszterpontjait színezi ki és világítja meg, majd mossa össze a shaderek és a különböző effektusok adta értékekkel. Raszteres engine-je különféle trükköket (shadow mapping, ambient occlusion) alkalmaz annak érdekében, hogy közelebb hozza látványvilágát a fizikailag pontosabb ray tracinghez, ám az esetek zömében még ezek is kevésnek bizonyulnak ahhoz, hogy létrejöjjön a valóság optikailag pontos illúziója. A Cycles raycastingje fordított irányú: fénysugarat bocsát ki a kamera felől, és ezeket „pattogtatja” a 3d-s tér elemei, anyagtulajdonságokkal rendelkező felületei között, ami végeredményét tekintve realisztikusabb képet eredményez. Az eljárás hátránya, hogy pixelenként jóval intenzívebb számításokat igényel, mint a fenti, raszteres eljárás, ami a jelenlegi technológia mellett kizárja a valós idejű megjelenítést (ami a videójátékok vagy az EEVEE esetében evidens).(5) A technikai korlátok okozta kompromisszumok nagyban befolyásolják az előállított képek minőségét. Az EEVEE gyorsaságának megvan az ára, ugyanis számos tekintetben egyértelműen alatta marad a Cycles fizikai realizmusának. Példánkban a két render által előállított képek minősége kevéssé eltérő, így megmaradtunk az EEVEE-nél, míg más esetekben egyértelműen megéri a váltás (5. kép).

5. kép: Ugyanazon jelenet a Cycles (balra) és az EEVEE által renderelve – a szerző felvétele. Számottevő különbséget a subsurface scattering (a felületek alatti fényszóródás) tekintetében látunk, ahol az EEVEE nehezebben birkózik meg a vékony felületekkel és az éles részletekkel.

A munkafolyamat következő állomása a kameraparaméterek beállítása és a renderelés, amit a programon belüli, esetleg külső programban való kompozitálás követ. Kameraparaméterek alatt itt elsősorban a lencse típusát (ortografikus/perspektívikus), a fókusztávolságot, valamint a mélységélességet értjük (utóbbin közelebbről a Focus Distance és az F-Stop paramétereket). A renderparaméterek a kép felbontására, a képarányra és a mentett kép formátumára vonatkoznak, illetve fontos még, hogy a program külön képekként menti el a Color, Alpha, Z-Buffer, valamint az R, G, B csatornákat, aminek a kompozitáláskor vesszük hasznát. A kompozitálást a Blenderen belül megoldva ismét node-alapú szerkesztőt használunk (6. kép), ahol a cél a fizikai kamera fizikai tulajdonságainak, valamint a digitális kép glitch-effektusainak imitálása, ami újabb réteggel gazdagítja az eddigi valós-virtuális kapcsolatrendszert.

6. kép: Kompozitálás a Blenderen belül

A fentieket összegezve elmondhatjuk, hogy a leírt folyamat valamennyi stádiumát áthatják a valós elemek, a tényleges környezet képi elemei és a természetből ismerős mintázatok, összefüggések. A nem-destruktív, procedurális módszer erénye, hogy tetszőleges, iteratív és rekurzív módon képes kombinálni az összetevőit, egyre mélyülő és egyre komplexebb összefüggéseket teremt meg köztük. A példánk esetében elképzelhető volna egy összetettebb, kreatív szempontból szabadabb változat is, ahol a folyamat minden egyes részét node-okon keresztül valósítjuk meg a program kiegészítő moduljaként létező Sverchok és Animation Nodes eszközökkel (7. kép).

7. kép: A Sverchok add-on működés közben

Bármely utat is választjuk, bármiféle összetettség mellett, az alapelv mindvégig ugyanaz. A valóság elemeit ötvözzük, kombináljuk és vegyítjük egymással a programunk biztosította virtuális eszközökkel. Mindezt annak érdekében tesszük, hogy egy eredetileg nem létező tárgyat jelenítsünk meg oly módon, mintha fizikailag létező volna egy fizikailag pontos környezetben.


Hivatkozások

1 A szöveg további célja, hogy a laikus olvasó számára is átláthatóvá tegye a folyamatot anélkül, hogy túlzottan belebonyolódna a mögöttes elvi részletekbe.

2 „Modifiers are automatic operations that affect an object’s geometry in a non-destructive way. With modifiers, you can perform many effects automatically that would otherwise be too tedious to do manually (…) and without affecting the base geometry of your object.” > Link

3 > Shaders > Link

4 > Nodes > Link

5 A jelenlegi technológia időnként hibrid eljárásokat alkalmaz, mint az Nvidia RTX renderplatformja, vagy a DirectX 12 API-je, melyek a valós idejű ray tracinget célozzák meg. Az eljárás alapja ezeknél az, hogy a ray tracing csakis a jelenetek bizonyos részeire érvényes, a többit pedig a szokásos módon, a raszterizáció eszközével jeleníti meg. A másik út a ray tracing elégtelen mintáiból adódó zaj elmosása (denoising), ami a hibrid megoldásokkal vegyítve fizikailag pontosabb és valós idejű eredményeket hoz létre. Ehhez lásd: > Link