Vlastná kamera

Okrem zabudovaných typov kamier (perspektívna, ortografická a panoramatická kamera) podporuje Cycles aj implementáciu vlastných kamier pomocou jazyka Open Shading Language (OSL).

Vlastné kamery sú implementované ako OSL tieňovače. Tieňovač kamery prijíma ako vstup polohu snímača a na výstupe zobrazuje polohu, smer a priepustnosť príslušného lúča.

OSL pre tieňovanie a vlastné kamery sú nezávislé, takže tie je možné používať, aj keď je tieňovanie OSL vypnuté.

Použitie vlastných kamier

Ak chcete použiť vlastnú kameru, nastavte typ objektívu na Vlastný.

To umožňuje výber textového bloku údajov alebo externého súboru, podobne ako uzol Skript v tieňovačoch.

Ak má vybraný tieňovač kamery parametre, zobrazia sa pod panelom Objektív.

Zapisovanie tieňovačov kamery

Vstupy

Hlavným vstupom do tieňovača kamery je poloha snímača. Tú poskytuje funkcia camera_shader_raster_position()`, ktorá vracia bod, ktorého zložky X a Y uchovávajú polohu v rámci obrázku v rozsahu 0-1.

Na podporu náhodného snímania v tieňovači sa poskytuje dvojica náhodných čísel pomocou funkcie camera_shader_random_sample(), ktorá vracia vektor obsahujúci náhodné čísla v zložkách X a Y. Pre konkrétny prípad snimania clony je lepšie použiť atribút cam:aperture_position (pozri nižšie), aby bol kompatibilný s bežnými možnosťami clony Blenderu.

Výstupy

Od tieňovača sa očakáva výstup troch premenných:
  • position (poloha), premenná typu point (bod), ktorá obsahuje počiatok generovaného lúča.

  • direction (smer), premenná typu vector (vektor), ktorá obsahuje normalizovaný smer generovaného lúča.

  • throughput (priepustnosť), premenná typu color (farba), ktorá obsahuje priepustnosť lúča - váhový faktor

ktoré možno použiť na stlmenie alebo zafarbenie výslednej farby, ktorú vidí kamera.

Position (poloha) aj direction (smer) sú v súradniciach kamery, kde počiatok je poloha samotnej kamery, kladná os Z je smer pohľadu a kladná os Y je smerom nahor.

Ak je throughput (priepustnosť) čierna, výsledný lúč sa preskočí. Toto sa môže použiť napr. na označenie neplatných lúčov pri panoramatickom mapovaní.

Atribúty

Keďže tieňovače kamery nie sú tieňovače v tradičnom zmysle, mnohé funkcie OSL, ako sú uzávery alebo atribúty súvisiace s geometriou, nie sú k dispozícii.

Namiesto toho sú prostredníctvom funkcie getattribute() dostupné nasledujúce atribúty špecifické pre kameru:

cam:sensor_size

Veľkosť snímača kamery v milimetroch, ako je nastavená vo vlastnosti kamery.

cam:image_resolution

Rozlíšenie prekresleného obrázka.

cam:focal_distance

Ohnisková vzdialenosť kamery v milimetroch nastavená vo vlastnostiach Hĺbka ostrosti.

cam:aperture_aspect_ratio

Pomer strán clony kamery nastavený vo vlastnostiach Hĺbka ostrosti.

cam:aperture_size

Veľkosť clony kamery nastavená vo vlastnostiach Hĺbka ostrosti.

cam:aperture_position

Náhodná pozícia na clone, pričom sa zohľadní jej veľkosť, tvar a pomer strán nastavený vo vlastnostiach Hĺbka ostrosti. Všimnite si, že sa tu používajú rovnaké náhodné čísla, aké poskytuje funkcia camera_shader_random_sample(), takže sa vyhnite použitiu oboch, pretože by to viedlo k problémom s koreláciou.

Deriváty

Pre niektoré funkcie, ako napríklad uzol Drôtený rám, potrebuje mechanizmus Cycles derivácie počiatku a smeru lúča vzhľadom na súradnice X a Y obrazu.

V predvolenom nastavení sa na ich výpočet použije automatická diferenciácia OSL. Pre pokročilé prípady, keď môžete derivácie vypočítať presnejšie alebo efektívnejšie, môžete zabezpečiť, aby tieňovač vypisoval štyri ďalšie premenné s názvami dPdx, dPdy, dDdx a dDdy. Ak je niektorá z nich prítomná, použijú sa namiesto nej jej hodnoty. Všimnite si, že nemôžete kombinovať obe možnosti - musia byť explicitne zadané buď všetky, alebo žiadna.

Parametre

Tieňovače môžu definovať ďalšie vstupné parametre. Tie sa užívateľovi zobrazia na paneli vlastností kamery v časti Možnosti objektívu.

Na ďalšiu kontrolu spôsobu ich prezentácie možno použiť tieto metaúdaje OSL:

[[ string help = "Toto je parameter" ]]

Popis parametra, ktorý sa zobrazuje v nápovede k nástroju.

[[ float sensitivity = 0.25 ]]

O koľko sa má parameter zvýšiť/znížiť pri ťahaní/kliknutí.

[[ int digits = 2 ]]

Koľko číslic sa zobrazí pre číselné parametre.

[[ float min = -5, float max = 5 ]]

Aký rozsah môže mať vlastnosť.

[[ int slider = 1, float slidermin = -4, float slidermax = 4 ]]

Zobrazí vlastnosť ako posúvač so zadaným rozsahom.

[[ string widget = "boolean" ]]

Zobrazí vlastnosť `int` ako zaškrtávacie políčko, ktorého výsledkom sú hodnoty 0 alebo 1.

Napríklad

Toto je veľmi jednoduchý tieňovač implementujúci perspektívnu kameru:

shader perspective_camera(
    float focal_length = 90.0 [[ float sensitivity = 0.2, float min = 0 ]],
    output point position = 0.0,
    output vector direction = 0.0,
    output color throughput = 1.0) {
  vector sensor_size;
  getattribute("cam:sensor_size", sensor_size);

  point Pcam = camera_shader_raster_position() - point(0.5);
  Pcam *= sensor_size / focal_length;
  direction = normalize(vector(Pcam.x, Pcam.y, 1.0));
}

Ďalšie príklady nájdete v Textový editor ‣ Šablóny ‣ Open Shading Language.

Limity

Dôležité

Vlastné kamery nie sú podporované pri prekreslení pomocou GPU, pokiaľ sa nepoužíva backend OptiX.

Niektoré funkcie v Cycles, najmä vektorový prechod a súradnice textúry okna, vyžadujú inverzné mapovanie z lúčov na súradnice obrazu. Toto zatiaľ nie je podporované vlastnými kamerami.