Hlavní navigace

Vrstvené textury v POV-Rayi

2. 12. 2008
Doba čtení: 11 minut

Sdílet

Od třicáté osmé části seriálu o raytraceru POV-Ray se začneme zabývat tvorbou složitějších typů textur. Řekneme si, jakým způsobem je možné pokrývat povrch těles několika texturami uloženými ve vrstvách. Touto technikou je možné vykreslit například kovový povrch se skvrnami rzi či kámen pokrytý mechem.

Obsah

1. Vrstvené textury v POV-Rayi
2. Princip vrstvených textur
3. První demonstrační příklad – návrat k první části seriálu
4. Druhý demonstrační příklad – model fiktivní planety
5. Připravená sada vrstvených textur: soubor woods.inc a stones.inc
6. Obsah dalšího pokračování seriálu

1. Vrstvené textury v POV-Rayi

V patnácté až dvacáté části tohoto seriálu jsme se podrobně zabývali problematikou procedurálních a posléze i rastrových textur, které je možné při renderingu scény aplikovat na povrch vykreslovaných těles. POV-Ray sice díky rozsáhlému repertoáru základních procedurálních textur a možnosti aplikace turbulence na počítané textury dokáže vytvořit překvapivě velké množství různých povrchů (dřevo, kámen, umělá hmota, kov), ovšem pro některé účely, například dále popsané modely planet, by bylo vhodnější umět na jedno těleso nanést větší množství textur v předem známém pořadí. Předpokladem je, že výše postavené textury jsou v některých částech průhledné či poloprůhledné, jinak by nebyly viditelné textury umístěné pod nimi. Tato ve svém důsledku velmi silná technika, kterou POV-Ray – podobně jako další vyspělé raytracery – samozřejmě podporuje, se nazývá vrstvení textur neboli layering. Podobným způsobem fungují i vrstvy známé například z rastrových grafických editorů typu Gimp či Photoshop, u nichž lze dokonce nastavit, jakým způsobem se jednotlivé vrstvy ovlivňují – barvy lze například sčítat, odčítat, násobit, mísit s alfa kanálem atd.

povray3801

Obrázek 1: V této poměrně známé scéně vykreslené POV-Rayem se používá velké množství vrstvených procedurálních textur (omítka, kameny, cihly, dlaždice, požární hydrant). Zajímavé je, že scéna není přímo osvětlena žádným světelným zdrojem, při renderingu se totiž pro výpočet osvětlení použila vyzařovací metoda (radiosita). Výsledkem jsou měkké stíny a plynulé barevné přechody, které scéně dodávají na realističnosti.

Na tomto místě možná stojí za připomenutí, že některé starší raytracery vrstvené textury vůbec nepodporovaly. Toto poměrně zásadní omezení (vycházející mj. i ze syntaxe zápisu scény) se muselo obcházet například tak, že se vytvořila dvě či tři tělesa stejného tvaru, jejichž povrchy byly od sebe nepatrně vzdálené. V případě výše zmíněného modelu planety by se tedy pomocí koule vytvořil její povrch, nad ním vrstva mraků (částečně poloprůhledná koule) a ještě výše vrstva atmosféry (další poloprůhledná koule). Záleželo pak jen na přesnosti výpočtů, zda se dosáhlo požadovaného výsledku či zda se povrchy těles vlivem numerických chyb na některých místech protínaly, nehledě na chyby způsobené při výpočtu stínů – u vnějších koulí se muselo vrhání stínů zakázat. Techniku do sebe vnořených těles však není možné vždy použít – například u implicitních ploch, Bézierových plátů apod. se „paralelní“ povrchy modelují jen velmi těžko. Z tohoto důvodu je podpora vrstvených textur přímo v raytraceru tak důležitá, především při snaze o vytváření realistických povrchů.

povray3802

Obrázek 2: Mnozí uživatelé POV-Raye tuto scénu (doplněnou navíc o několik dalších objektů) důvěrně znají, protože je použita jako splashscreen při startování POV-Raye v operačním systému Microsoft Windows. Kameny ve scéně mají na sobě naneseno několik textur; podkladová textura na nich tvoří tmavší skvrny a pásy, další (procedurální) textura pak dokresluje jemnější struktury.

2. Princip vrstvených textur

Vrstvení textur je z hlediska uživatele velmi jednoduché, nezávisle na tom, zda se jedná o textury procedurální, rastrové či objemové. Při vytváření jakéhokoli geometrického objektu je totiž možné použít uzel texture několikrát. První zapsaná textura je texturou podkladovou, tj. je na objekt nanesena nejdříve. Druhá textura je na objekt nanesena až po textuře první, což však znamená, že by měla obsahovat průhledné či poloprůhledné části, jinak by nebyla podkladová textura viditelná. POV-Ray přitom žádnou kontrolu, zda druhá (či jakákoli další) textura zcela nezakrývá texturu podkladovou, neprovádí, takže v případě, že jsme při tvorbě scény nedosáhli požadovaného výsledku, je vhodné se při hledání chyby zaměřit na to, zda byla korektně nastavena průhlednost u textur ve vyšších vrstvách. Všechny vrstvené textury kromě textury nejvyšší mají většinou nastavenu „jen“ vhodnou barvu či barvový vzorek (pigment), u textury nejvyšší se navíc specifikují i optické vlastnosti materiálu, například míra odlesků.

povray3803

Obrázek 3: Princip vrstvení rastrových textur na povrch tělesa.

Na následujícím fragmentu kódu je ukázáno, jakým způsobem se vrstvené textury zapisují do POV-Rayovského zdrojového kódu. Předpokladem pro správnou činnost raytraceru samozřejmě je, aby byly obě textury (zde pojmenované „Texture1“ a „Texture2“) nejdříve deklarovány pomocí direktivy #declare:

// objekt, na němž jsou naneseny vrstvené textury
sphere
{
    <0,0,0>,            // souřadnice středu koule
    0.9                 // poloměr koule
    texture             // základní textura
    {
        Texture1
    }
    texture             // horní textura, která obsahuje
    {                   // průhledné či poloprůhledné plochy
        Texture2
    }
} 

Vrstvit na sebe je možné také rastrové textury, popřípadě lze libovolně zkombinovat rastrovou texturu s texturou procedurální, čehož se dá využít v mnoha scénách. Na dalších třech obrázcích jsou vyobrazeny rastrové textury použité pro tvorbu poměrně věrohodného modelu Země. Celý model je ve skutečnosti velmi jednoduchý – jedná se o kouli, na níž jsou naneseny celkem čtyři textury. Z toho tři textury jsou rastrové (jedná se o tři snímky ve formátu JPEG, který POV-Ray ve své třetí verzi dokáže načíst), poslední textura má konstantní modrou (částečně průhlednou) barvu a slouží k dokreslení celé scenérie.

povray3804

Obrázek 4: Základní vrstva: povrch Země zbavený vlivu atmosféry. Obrázek byl získaný z archivu NASA.

Základní vrstva je představována rastrovým obrázkem povrchu Země, který byl získaný z archivu NASA. Druhou vrstvu tvoří taktéž rastrový obrázek, na kterém jsou viditelná světla měst. Tento obrázek byl pravděpodobně získán složením většího množství družicových snímků noční strany Země a upraven postprocessingem. Třetí vrstvu nemáme zobrazenou, protože se jedná o velmi jednoduchou texturu s bledě modrou, částečně průhlednou, barvou (pro tuto vrstvu tedy není zapotřebí použít ani rastrový obrázek ani procedurální texturu). Poslední vrstva je tvořena rastrovým obrázkem mraků v atmosféře. Opět se jedná o snímek získaný z družicových dat.

povray3805

Obrázek 5: Druhá vrstva: světla měst viditelná z blízkého vesmíru (obrázek vznikl postprocessingem). Černá barva má při renderingu nastavenou maximální průhlednost.

povray3806

Obrázek 6: Čtvrtá vrstva: oblaka v atmosféře. Čím tmavší je barva, tím větší je nastavena průhlednost daného pixelu při texturování.

Některé výsledky získané z těchto (a několika dalších) zdrojových rastrových textur si můžete prohlédnout na adrese http://www.kuf­fner.org/james/ga­llery/raytracin­g/earth_from_spa­ce/.

povray3807

Obrázek 7: Model Marsu, na jehož povrch jsou naneseny dvě textury – jedna rastrová (získaná opět ze snímků jeho skutečného povrchu a doplněná o „moře“) a další textura procedurální, jenž představuje atmosféru.

3. První demonstrační příklad – návrat k první části seriálu

Uvedením zdrojového kódu dnešního prvního demonstračního příkladu se vlastně vrátíme na úplný začátek tohoto seriálu. V úvodním dílu totiž byl pro ilustraci vypsán i zdrojový kód scény, ve které se nachází kamera (pozorovatel), dva zdroje světla a jediný objekt – torus (toroid, anuloid), který byl pokrytý dvěma texturami uloženými ve vrstvách. Poněkud upravený zdrojový text tohoto příkladu si uvedeme i dnes, navíc s doplňujícím komentářem.

povray3808

Obrázek 8: První demonstrační příklad po vykreslení v POV-Rayi. Při renderingu byla podlaha zakázána a na torus byly naneseny obě dvě procedurální textury. Výsledkem je tedy stejný obrázek, jaký byl uveden v úvodní části tohoto seriálu.

Oproti původnímu zdrojovému textu můžeme vidět několik změn. První změnou je, že byla přidána podlaha pokrytá jednoduchou šachovnicovou texturou. Vykreslení podlahy lze povolit či zakázat nastavením hodnoty USE_CHECKER_PLA­NE. Dále jsou přidány další dvě pravdivostní hodnoty (USE_TEXTURE1 a USE_TEXTURE2), jejichž změnou je možné zapnout či vypnout jednu či obě textury, které jsou na torus naneseny. Tímto způsobem je možné zkoumat vliv obou textur na vizuální vzhled torusu, jak je to ostatně patrné z ilustračních obrázků.

povray3809

Obrázek 9: Torus, na nějž je nanesena pouze podkladová textura. Povrch tělesa je zcela matný, protože podkladová textura nemá nastavenu žádnou míru odlesků. Textura také neobsahuje žádné průhledné části.

povray3810

Obrázek 10: Torus, na nějž je nanesena pouze druhá (vrchní) textura. Povrch tělesa se již leskne, podobně jako na osmém obrázku. Všimněte si, že vrchní textura je v některých místech průhledná či poloprůhledná, takže tělesem prochází světlo. Je to mj. patrné i ze stínu, který torus vrhá na podlahu ve své středové části.

povray3811

Obrázek 11: Torus s oběma texturami nanesenými ve dvou vrstvách. Těleso již není v žádném místě povrchu průhledné, protože podkladová textura zachytí i ty světelné paprsky, které projdou vrstvou nad ní.

Následuje výpis zdrojového kódu prvního demonstračního příkladu:

// ------------------------------------------------------------
// Jednoduchá scéna s uzavřeným objektem, dvojicí světel
// a jednou kamerou (pozorovatelem). Na objekt - torus - je
// nanesena textura ve více vrstvách, pod torusem se nachází
// plocha se šachovnicovou texturou.
// Vrstvené textury torusu i šachovnicovou plochu je možné vypínat
// pomocí voleb USE_TEXTURE1, USE_TEXTURE2 a USE_CHECKER_PLANE.
//
// Založeno na souboru původně vytvořeném Danem Farmerem (leden 2002)
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena1.pov +Oscena1.png
// (pro náhled postačí zadat povray scena1.pov)
// ------------------------------------------------------------

#declare USE_TEXTURE1=true;
#declare USE_TEXTURE2=true;
#declare USE_CHECKER_PLANE=false;

// globální nastavení parametrů scény
global_settings
{
    assumed_gamma 2.2
}

// nastavení kamery (pozorovatele)
camera
{
    location  <0, 20, -15>               // pozice kamery
    look_at   <0, -2,   0>               // bod, na který kamera směřuje
}

// první (silnější) světelný zdroj s bílou barvou
light_source
{
    <-50, 100, -80>                      // pozice světelného zdroje
    color rgb 1                          // barva světla (všech tří složek)
}

// druhý (slabší) světelný zdroj
light_source
{
    <250, 25, -100>                      // pozice světelného zdroje
    color red 0.85 green 0.53 blue 0.10  // barva světla
}

// jediný objekt ve scéně: torus (anuloid)
torus
{
    7.0, 4.0                             // geometrické informace
                                         // (poloměry celého toroidu a "trubky")
    // spodní (podkladová) textura se základním vzorkem
    #if (USE_TEXTURE1)
    texture
    {
        pigment
        {                                // definice vzorku textury
            bozo                         // typ vzorku
            color_map
            {                            // dvě barvy, které se na vzorku střídají
                [0.0 color red 0.36 green 0.20 blue 0.09]
                [0.4 color red 0.36 green 0.20 blue 0.09]
                [0.4 color red 0.858824 green 0.576471 blue 0.439216]
                [1.0 color red 0.858824 green 0.576471 blue 0.439216]
            }
            scale <4, 0.15, 0.15>        // změna měřítka (velikosti) namapovaného vzorku
            rotate 45*y
        }
    }
    #end

    // horní textura, která přidává jemnější vzorek
    #if (USE_TEXTURE2)
    texture
    {
        finish
        {                                // vlastnosti materiálu
            phong 1                      // intenzita a
            phong_size 100               // velikost odlesků
            brilliance 3                 // míra změny odlesků s úhlem dopadu světelných paprsků
            ambient 0.2                  // ambientní složka (pro simulaci všesměrového světla)
            diffuse 0.8                  // difúzní složka (pro simulaci směrového světla)
        }
        pigment
        {                                // definice vzorku textury
            wood                         // typ vzorku
            turbulence 0.025
            color_map
            {                            // barvy, které se ve vzorku střídají
                [0.00 color red 0.42 green 0.26 blue 0.15 ]
                [0.15 color red 0.85 green 0.53 blue 0.10 ]
                [0.40 color rgbf 1 ]     // tudy prosvítá spodní textura
                [0.80 color red 0.85 green 0.53 blue 0.10 ]
                [1.00 color red 0.42 green 0.26 blue 0.15 ]
            }
            scale <3.5, 1, 1>            // změna měřítka a natočení vzorku
            translate -50*y
            rotate 1.5*z
        }
    }
    #end
}

// podkladová rovina
#if (USE_CHECKER_PLANE)
plane
{
    y, -5
    texture
    {
        pigment
        {
            checker
                color red 0.5 green 0.5 blue 0.5
                color red 0.9 green 0.9 blue 0.9
        }
        scale 5
    }
}
#end



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 

4. Druhý demonstrační příklad – model fiktivní planety

Ve druhém demonstračním příkladu je ukázáno použití tří procedurálních textur při vytváření modelu fiktivní planety. Podkladová textura je vytvořena funkcí ripples (tato funkce se mj. hodí i při tvorbě vln), prostřední textura funkcí gradient (postupný přechod mezi barvami, zde je na něj ovšem aplikována turbulence) a konečně horní textura je tvořena funkcí spiral2, opět s aplikací turbulence. Aby se dosáhlo dojmu zvlněného povrchu planety, je použit nám již známý bump mapping, neboli modulace normálových vektorů. Zdrojový kód druhého demonstračního příkladu má tvar:

// ------------------------------------------------------------
// Jednoduchá scéna s uzavřeným objektem, jedním světelným zdrojem
// a jednou kamerou (pozorovatelem). Na objekt - kouli - mohou
// být naneseny až tři procedurální textury.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Iscena2.pov +Oscena2.png
// (pro náhled postačí zadat povray scena2.pov)
// ------------------------------------------------------------

#declare USE_TEXTURE1=true;
#declare USE_TEXTURE2=true;
#declare USE_TEXTURE3=false;

#include "colors.inc"

// globální nastavení parametrů scény
global_settings
{
    assumed_gamma 2.2
}

// nastavení kamery (pozorovatele)
camera
{
    location  <0, 3, -1>                 // pozice kamery
    look_at   <0, 1,   0>                // bod, na který kamera směřuje
}

// světelný zdroj s bílou barvou
light_source
{
    <-50, 100, -80>                      // pozice světelného zdroje
    color rgb 1                          // barva světla (všech tří složek)
}

// deklarace první procedurální textury
#declare Texture1 =
texture
{
    pigment
    {
        ripples scale 0.5 turbulence 0.75
        color_map
        {
            [0.0 color Green]
            [0.4 color Yellow]
            [0.4 color White]
            [1.0 color YellowGreen]
        }
    }
    normal
    {
        wrinkles 0.75 scale 0.1
    }
    finish
    {
        diffuse 0.65
        reflection 0.25
        phong 1
    }
}

// deklarace druhé procedurální textury
#declare Texture2 =
texture
{
    pigment
    {
        gradient<0,1,0> scale 0.5 turbulence 1.25
        color_map
        {
            [0.0 color Clear]            // zcela průhledná oblast
            [0.7 color Clear]
            [0.7 color rgb<1,0.75,0> ]
            [1.0 color Gray50 ]
        }
    }
    normal
    {
        ripples 0.8 scale 0.02 turbulence 0.5
    }
    finish
    {
        diffuse 0.9 phong 1
    }
}

// deklarace třetí procedurální textury
#declare Texture3 =
texture
{
    pigment
    {
        spiral2 4 scale 0.3 turbulence 0.1
        color_map
        {
            [0.0 color Clear]
            [0.7 color Clear]
            [0.8 color Red ]
            [1.0 color Yellow ]
        }
    }
}

// jediné těleso ve scéně - otexturovaná koule
sphere
{
    <0,0,0>, 0.9
    #if (USE_TEXTURE1)
        texture{Texture1}
    #end
    #if (USE_TEXTURE2)
        texture{Texture2}
    #end
    #if (USE_TEXTURE3)
        texture{Texture3}
    #end
    translate<0,1,0>
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray3812

Obrázek 12: Planeta vykreslená pouze s využitím podkladové textury.

povray3813

Obrázek 13: Prostřední textura s průhlednými částmi.

povray3814

Obrázek 14: Třetí textura s průhlednými částmi.

povray3815

Obrázek 15: Planeta vykreslená s využitím podkladové a prostřední textury.

povray3816

Obrázek 16: Zde jsou již použity všechny tři procedurální textury.

5. Připravená sada vrstvených textur: soubor woods.inc a stones.inc

Vytváření vrstvených textur není zcela jednoduché ani intuitivní. Pokud však do scény potřebujeme vložit například dřevěné či kamenné těleso pokryté kvalitní vrstvenou procedurální texturou, není ihned nutné začít zdlouhavě experimentovat s různými nastaveními procedurálních textur, barvových map apod. Většinou postačí využít již připravené vrstvené procedurální textury, jejichž definice je dodávána spolu s vlastním POV-Rayem. Jedná se o definice textur uložených ve vkládaných souborech woods.inc a stones.inc (ve skutečnosti se do těchto souborů vkládají soubory další, to nás však v této chvíli nemusí zajímat, z velké míry se jedná o interní záležitost raytraceru a jeho postupný vývoj). Autoři POV-Raye nám dokonce usnadnili i výběr vhodné vrstvené textury, protože dodávají „vzorník“ těchto textur. Tento vzorník je uložen ve zdrojových souborech woods1.pov, stones1.pov a stones2.pov. Následující tři obrázky byly získány vykreslením těchto vzorových scén.

woods2.pov stones1.pov stones2.pov
povray3817

Obrázek 17: Soubor woods2.pov vykreslený POV-Rayem.

povray3818

Obrázek 18: Soubor stones1.pov vykreslený POV-Rayem.

povray3819

Obrázek 19: Soubor stones2.pov vykreslený POV-Rayem.

root_podpora

6. Obsah dalšího pokračování seriálu

I v navazující části seriálu o raytraceru POV-Ray se budeme zabývat pokročilými metodami texturování. Ukážeme si, jakým způsobem lze ovlivnit způsob výpočtu procedurálních textur. Jedná se o takzvaný warping, pomocí něhož lze vymodelovat například působivý suk ve dřevě i další zajímavé vzory.

povray3820

Obrázek 20: Tato vodovodní trubka (u které byl mj. použit i bump mapping) je pokryta několika procedurálními texturami. Základem je textura kovu, další vrstvu pak tvoří tmavší části a rez.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.