Hlavní navigace

Pseudonáhodné procedurální textury

1. 7. 2008
Doba čtení: 15 minut

Sdílet

V osmnácté části seriálu o renderovacím programu POV-Ray si popíšeme pseudonáhodné procedurální textury, tj. textury, které i bez explicitního použití turbulence generují zdánlivě náhodný vzorek. Mezi tyto textury patří i vzorky vypočtené pomocí fraktální šumové funkce 1/f, které napodobují kámen.

Obsah

1. Pseudonáhodné procedurální textury
2. Procedurální textura „agate“
3. Procedurální textura „bozo“
4. Procedurální textura „crackle“
5. Procedurální textura „ripples“
6. Procedurální textura „granite“
7. Procedurální textura „wrinkles“
8. Tvorba mraků pomocí textury „wrinkles“
9. Obsah následující části seriálu

1. Pseudonáhodné procedurální textury

V předchozí části tohoto seriálu jsme si ukázali, jakým způsobem se změní vzorek generovaný původně zcela pravidelnými texturami po aplikaci turbulence. POV-Ray však obsahuje i další procedurální textury, pomocí kterých se generují pseudonáhodné vzorky i bez explicitního použití turbulence, přesněji řečeno bez použití interně implementované funkce nazvané DNoise. Mezi tyto textury patří textura nazvaná agate (v ní je použita odlišná implementace turbulence), bozo (plynulý přechod mezi náhodně vybarvenými body, velmi často používaná textura při modulaci normál), crackle (vizualizovaný Voronoiův diagram, opět vytvořený z náhodných bodů) a ripples (simulace ne zcela pravidelně rozvlněné vodní hladiny). Všechny tyto textury generují nepravidelné vzorky, které je však možné dále upravit pomocí standardní turbulence, i když to v mnoha případech není nutné (například textura agate je turbulentní i bez nutnosti aplikace funkce DNoise).

povray1801

Obrázek 1: Textura „agate“ s implicitní barvovou mapou

POV-Ray obsahuje podporu i pro dva typy textur, které jsou založeny na takzvané fraktální šumové funkci 1/f. Výpočet této šumové funkce je založen na inverzní Fourierově transformaci s vhodně zvolenými koeficienty, jejíž výsledky jsou použity přímo, tj. nikoli pro posun bodů, jak je tomu u standardní turbulence (ovšem i na tyto textury lze turbulenci použít, což si na ukážeme na jednom demonstračním příkladu v osmé kapitole). Procedurální textury, které fraktální šumovou funkci 1/f používají, se jmenují granite a wrinkles. První typ textury slouží, jak její název napovídá, především pro vykreslování kamenných povrchů, druhý typ lze použít také pro vytváření kamenných povrchů nebo (a to při praktickém použití mnohem častěji) při vykreslování mraků či mlhy. Tyto textury se také velmi často používají pro modulaci normál, neboli bump mapping, což je technika, kterou si popíšeme až v následující části tohoto seriálu.

2. Procedurální textura „agate“

Textura nazvaná přiléhavě agate (achát) je v praxi pro svůj elegantní vzhled používaná velmi často, většinou v kombinaci s další (podkladovou) texturou. Tato procedurální textura se do značné míry podobá minule popsané textuře marble (mramor), ovšem s tím rozdílem, že zde je na původně pravidelný vzorek aplikována interní speciálně vytvořená šumová funkce, která se ovládá parametrem nazvaným agate_turb. Na texturu lze samozřejmě (navíc) aplikovat i standardní turbulenci (funkci DNoise), většinou to však není nutné, což je ostatně patrné i z obrázku vytvořeného pomocí dnešního prvního demonstračního příkladu. Procedurální textura agate má zabudovanou svoji vlastní barvovou mapu, která je použita v případě, že uživatel nezadá mapu svoji (jedná se o hnědo-bílý přechod). V demonstračním příkladu, jehož zdrojový kód je uveden níže, je však použita odlišná barvová mapa:

// ------------------------------------------------------------
// Ukázka použití procedurální textury "agate".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    agate                      // základ pro tvorbu textury mramoru
    color_map {                // náhrada původní barvové mapy
        [0.02 color rgb <0.65, 0.45, 0.25> ]
        [0.06 color rgb <0.55, 0.40, 0.20> ]
        [0.10 color rgb <0.15, 0.10, 0.05> ]
        [0.95 color rgb <0.75, 0.60, 0.40> ]
        [1.00 color Red ]
    }
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.1
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.2
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.3
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.4
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.5
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.6
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.7
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.8
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            agate_turb 0.9
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1802

Obrázek 2: Textura „agate“ s různými hodnotami parametru agate_turb

3. Procedurální textura „bozo“

Procedurální textura bozo tvoří barevné vzory, které se podobají známému vzorku plasmy; její výpočet však není založen na metodě náhodného přesouvání prostředního bodu, jak je tomu u klasické plasmy, ale na šumové funkci. Jedná se tedy o pseudonáhodnou texturu, která při každém spuštění vykreslování vytváří stejný vzorek, ve kterém jsou přechody mezi jednotlivými barvami velmi pozvolné. Z tohoto důvodu se na texturu bozo často aplikuje standardní turbulence, pomocí které se přechody zvýrazní, což je ukázáno na demonstračním příkladu, ve kterém se turbulence postupně mění od hodnoty 0,1 do hodnoty 0,9. Také tato procedurální textura má implicitní barvovou paletu, kterou tvoří ostré přechody (skoky) mezi zelenou, modrou, červenou a bílou barvou. Zdrojový text demonstračního příkladu, který tuto texturu používá, má následující tvar:

// ------------------------------------------------------------
// Ukázka použití procedurální textury "bozo".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    bozo                       // základ pro tvorbu textury mramoru
    scale 0.5
    color_map {                // náhrada původní barvové mapy
        [0.00 color Blue ]
        [0.50 color rgb <0.40, 0.40, 0.70> ]
        [1.00 color White ]
    }
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.1
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.2
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.3
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.4
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.5
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.6
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.7
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.8
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.9
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1803

Obrázek 3: Textura „bozo“ s různými hodnotami parametru turbulence

povray1804

Obrázek 4: Textura „bozo“ s původní barvovou mapou

4. Procedurální textura „crackle“

Způsob výpočtu textury crackle se do značné míry odlišuje od ostatních procedurálních textur. Nejprve jsou v prostoru vytvořeny náhodné body pomoci generátoru pseudonáhodných čísel a posléze je prostor mezi těmito body rozdělen podle pravidel Voronoiova diagramu a všechny ostatní body v prostoru jsou obarveny podle své vzdálenosti od úseček takto vytvořeného Voronoiova diagramu (Voronoiův diagram má – nejenom – v počítačové grafice velký význam, jeho teorie je popsaná například v Wikipedia: Voronoi diagram). Textura crackle tvoří vzorek podobný rozpraskané zemi nebo kamenů, které jsou seskládány těsně vedle sebe, ovšem i na tuto texturu je možné aplikovat turbulenci, což je ukázáno ve třetím demonstračním příkladu. Implicitní barvová mapa, která sestává pouze z jediného přechodu černá-bílá, je poněkud tmavá, proto jsem v demonstračním příkladu použil dvojitý přechod černá-bílá-černá:

// ------------------------------------------------------------
// Ukázka použití procedurální textury "crackle".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    crackle                    // základ pro tvorbu textury mramoru
    color_map {
        [0.00 Black]
        [0.50 White]
        [1.00 Black]
    }
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.0
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            turbulence 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1805

Obrázek 5: Textura „crackle“ s různými hodnotami parametru turbulence

5. Procedurální textura „ripples“

Pomocí procedurální textury ripples je možné vytvářet simulace ne zcela pravidelně rozvlněné vodní hladiny, ve vygenerovaném vzorku je tedy jasně patrná náhodnost, kterou je možné dále zvětšit parametrem turbulence, podobně jako tomu je i u dalších procedurálních textur. Pomocí parametru frequency lze měnit počet „vln“ a parametrem phase pak posun vln od jejich středu (postupná změna tohoto parametru vede k tvorbě zajímavé animace, což si ještě v tomto seriálu ukážeme). I tato textura se používá pro modulaci normály (bump mapping), například pro dosažení iluze nepravidelně zvlněného plechu. V demonstračním příkladu uvedeném níže je postupně měněna jak hodnota parametru turbulence (náhodnost vzorku), tak i parametru frequency (počet vytvořených vln):

// ------------------------------------------------------------
// Ukázka použití procedurální textury "ripples".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    ripples                    // základ pro tvorbu textury mramoru
    color_map {                // náhrada původní barvové mapy
        [0.0  color Red]       // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
        [0.2  color Blue]
        [0.8  color White]
        [1.0  color Red]       // hodnota 1 je naopak horní mezí
    }
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1
        }
    }
    translate <COL1, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1.2
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1.4
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1
            turbulence 0.4
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1.2
            turbulence 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1.4
            turbulence 0.4
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1
            turbulence 0.8
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1.2
            turbulence 0.8
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            frequency 1.4
            turbulence 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1806

Obrázek 6: Textura „ripples“ s různými hodnotami parametru turbulence a frequency

6. Procedurální textura „granite“

O textuře granite jsme si již řekli, že je vytvářená pomocí fraktální šumové funkce 1/f. Při měřítku 1:1 je vzorek vytvářený touto texturou velmi náhodný (lze ho použít například pro vytvoření omítnutých zdí), lepších výsledků se však dosáhne při zvětšení textury pomocí příkazu scale, což je ukázáno i v demonstračním příkladu:

// ------------------------------------------------------------
// Ukázka použití procedurální textury "granite".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    granite                    // základ pro tvorbu textury mramoru
    scale 10
    color_map {                // náhrada původní barvové mapy
        [0.0  color Blue]      // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
        [0.7  color White]
        [1.0  color Red]       // hodnota 1 je naopak horní mezí
    }
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.05
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1807

Obrázek 7: Textura „granite“ při různém zvětšení

7. Procedurální textura „wrinkles“

I procedurální textura wrinkles (vrásky, zvrásnění) je vypočtena, podobně jako textura předchozí, za pomoci fraktální šumové funkce 1/f. V následujícím příkladu je tato textura zobrazena v různých měřítkách (zvětšeních) s velmi jednoduchou barvovou paletou (v podstatě se jedná o gradientní přechod od modré do bílé), která připomíná oblohu. Tuto texturu je možné použít buď pro tvorbu kamenných povrchů (malé zvětšení) či právě pro tvorbu mraků (větší přiblížení).

// ------------------------------------------------------------
// Ukázka použití procedurální textury "wrinkles".
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    wrinkles                   // základ pro tvorbu textury mramoru
    scale 2
    color_map {                // náhrada původní barvové mapy
        [0.0  color Blue]      // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
        [1.0  color White]     // hodnota 1 je naopak horní mezí
    }
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.05
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1808

Obrázek 8: Textura „wrinkles“ při různém zvětšení

8. Tvorba mraků pomocí textury „wrinkles“

V dnešním posledním demonstračním příkladu je ukázáno, jakým způsobem je možné použít procedurální texturu wrinkles pro tvorbu mraků. Na texturu je v poměrně velké míře aplikována turbulence (65%) s vhodně nastavenými parametry octaves, omega a lambda. Důležitá je také změna měřítka, která není ve všech směrech stejná – textura je „prodloužena“ v horizontálním směru. Výsledkem jsou poměrně reálně vypadající mraky, které je navíc možné poměrně jednoduchým způsobem animovat, což si ukážeme v některé z dalších částí tohoto seriálu.

// ------------------------------------------------------------
// Procedurální textura "wrinkles" použitá pro vytvoření mraků.
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
//
// !POZOR: scénu je nutné vykreslit se stejným horizontálním
//         i vertikálním rozlišením!
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

camera {                       // nastavení kamery
    orthographic               // bez perspektivy
    location < 0, 0, -1>       // pozice kamery
    right 15*x                 // šířka a výška snímané části scény
    up 15*y
    direction z                // směr pohledu kamery (k počátku)
}

light_source {                 // světelný zdroj
    <200, 200, -500>           // pozice
    color White                // barva
}

#declare COL1=-4.5;            // posuny objektů ve vztahu
#declare COL2= 0.0;            // k pomyslné mřížce
#declare COL3= 4.5;            // o rozměrech 3x3
#declare ROW1= 4.5;
#declare ROW2= 0.0;
#declare ROW3=-4.5;
#declare Z=0.0;

#declare PIGMENT=pigment {     // testovací procedurální textura
    wrinkles
    turbulence 0.65
    octaves 6
    omega 0.7
    lambda 2
    color_map {
        [0.0, 0.1   color red 0.85 green 0.85 blue 0.85
                    color red 0.75 green 0.75 blue 0.75]
        [0.1, 0.5   color red 0.75 green 0.75 blue 0.75
                    color rgb <0.258, 0.258, 0.435>  ]
        [0.5, 1.001 color rgb <0.258, 0.258, 0.435>
                    color rgb <0.258, 0.258, 0.435> ]
    }
    scale <12, 2, 12>
}

#declare OBJECT=box {          // testovací objekt - jednoduchý kvádr
    <-2,-2, 0>,
    < 2, 2, 1>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.05
        }
    }
    translate <COL1, ROW1, Z>
}


object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.1
        }
    }
    translate <COL2, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.2
        }
    }
    translate <COL3, ROW1, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.3
        }
    }
    translate <COL1, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.4
        }
    }
    translate <COL2, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.5
        }
    }
    translate <COL3, ROW2, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.6
        }
    }
    translate <COL1, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.7
        }
    }
    translate <COL2, ROW3, Z>
}

object {
    OBJECT
    texture {
        pigment {
            PIGMENT
            scale 0.8
        }
    }
    translate <COL3, ROW3, Z>
}

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1809

Obrázek 9: Tvorba mraků pomocí textury „wrinkles“

root_podpora

9. Obsah následující části seriálu

V další části seriálu o programu POV-Ray dokončíme problematiku textur. Popíšeme si zbývající procedurální textury (například textury vytvořené pomocí fraktálů) a také způsob využití externích dat pro tvorbu textur – řeč tedy bude jak o klasických 2D texturách vytvořených z rastrových obrázků (například z fotek), tak i o skutečných 3D texturách reprezentovaných pomocí takzvaných voxelů (objemových elementů, které jsou vlastně trojrozměrnou variantou pixelů, pokud tedy pixely chápeme jako plošné elementy s nenulovým obsahem).

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.