Hlavní navigace

Procedurální textury v POV-Rayi 2

17. 6. 2008
Doba čtení: 17 minut

Sdílet

V dnešní části našeho seriálu o renderovacím programu POV-Ray si popíšeme základní typy procedurálních textur. Kromě toho si také ukážeme způsob použití barvových map (color map), které v POV-Rayi slouží pro vytváření barevných přechodů použitých dále v procedurálních texturách.

Obsah

1. Procedurální textury v POV-Rayi 2
2. Textura tvořící šachovnicový vzorek
3. Textura složená ze šestiúhelníků
4. Tvorba cihlových zdí
5. Mapy barev a jejich použití s některými typy textur
6. Lineární, radiální a sférické gradientní přechody
7. Náhodně vybarvené kostičky
8. Základ pro tvorbu textur dřeva, spirály
9. Obsah následující části seriálu

1. Procedurální textury v POV-Rayi 2

V předchozí části seriálu o POV-Rayi jsme si řekli, že jedním z nejčastěji používaných typů textur jsou i procedurální textury. Ty jsou založeny na matematickém výrazu (funkci), který každému bodu ležícímu v trojrozměrném prostoru přiřazuje konkrétní barvu. U některých procedurálních textur je výpočet barvy součástí vlastní texturovací funkce, většinou se však využívají takzvané mapy barev (color maps), které jsou uživatelsky definovatelné. Mapy barev (podrobněji si je popíšeme v páté kapitole) slouží pro výběr barvy na základě reálné hodnoty, která je pomocí texturovací funkce vypočtena. Texturovací funkce má obecně tvar r=f(x, y, z), tj. každému bodu ležícímu v prostoru se přiřazuje reálné číslo ležící v rozsahu <0, 1>. Díky tomu, že procedurální textury vyplňují celý trojrozměrný prostor, ze kterého vykreslované těleso v podstatě „vyřezává“ obsazený podprostor, nedochází k žádnému zborcení procedurální textury na povrchu tělesa, i když v mnoha případech je obrazec textury závislý na směru řezu.

V následujících kapitolách budou popsány základní procedurální textury, které (pokud se na ně neaplikují modifikující parametry) vytváří pravidelné vzorky. Bude se jednat o texturu vytvářející šachovnicový vzorek, texturu složenou ze šestiúhelníků, texturu připomínající cihlovou zeď, různé gradientní přechody, texturu složenou z náhodně vybarvených kostiček, texturu připomínající letokruhy ve dřevě a konečně dva typy textur, pomocí nichž se dají vytvářet vzory obsahující spirály s libovolným počtem ramen. Některé z těchto textur jsou určeny především pro mapování na rovné povrchy, protože při jejich nanesení na oblý povrch dochází k jejich různým deformacím. Z tohoto důvodu (aby byly patrné některé limity využití textur) jsem v demonstračním příkladech použil testovací těleso („panáka“) vytvořeného z krychle, válce a koule. Toto těleso bývá používáno velmi často právě při ukázkách různých možností texturování a/nebo osvětlování, protože obsahuje jak rovné povrchy, tak i povrchy zakřivené buď ve směru jedné osy (válec), tak i ve směru tří os (koule).

povray1601

Obrázek 1: V této scéně jsou textury použity jak pro vytvoření oblohy s oblaky, tak i pro obarvení kamenů (další textura slouží jako tzv. bumpmapa modulující normálové vektory kamenů)

2. Textura tvořící šachovnicový vzorek

Prakticky nejzákladnější procedurální texturou je textura nazvaná jednoduše checker, pomocí níž je možné vytvářet šachovnicový vzorek. Tato textura je vytvořena z vedle sebe ležících krychlí vyplňujících celý prostor, z nichž každá má stranu o délce 1 (POV-Ray používá bezrozměrné délkové jednotky). Sousední krychle mají rozdílnou barvu, minimální počet barev pro obarvení krychlí je roven dvěma. Z tohoto důvodu se u této textury specifikuje dvojice barev a/nebo dalších textur. Ve skutečnosti je totiž možné vytvořit šachovnicový vzorek ze dvou rozdílných textur, což je poměrně často používaná technika, kterou si ukážeme příště. Celou texturu lze podrobit libovolné lineární transformaci, typicky rotaci a změně měřítka, což je patrné z následující ukázky:

texture {
    pigment {
        checker                    // typ textury
        color rgb<1.0, 0.3, 0.3>   // barva první množiny krychlí
        color rgb<0.2, 0.5, 0.7>   // barva druhé množiny krychlí
    }
    scale 0.4                            // změna měřítka (zmenšení)
    rotate <45,0,0>                // rotace textury okolo x-ové osy
} 

Po vykreslení scény reprezentované prvním demonstračním příkladem je patrné, že se tato textura dá bez problémů použít na rovné povrchy (stěny krychlí testovacích těles i stěny kvádru, do nějž je scéna uzavřena), ale při použití na zaoblených površích mohou vznikat nežádoucí artefakty vyplývající z toho, že kulaté těleso je „vyřezáno“ z prostoru tvořeném dvoubarevnými krychlemi. Následuje výpis prvního demonstračního příkladu:

// ------------------------------------------------------------
// První demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Základní procedurální textura - šachovnice.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Itextures.pov +Otextures.png
// (pro náhled postačí zadat příkaz povray textures.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"



// nastavení kamery
camera {
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// bodový světelný zdroj
light_source {
    <-2, 6, -3>                          // pozice světelného zdroje
    color White                          // barva světla
}

// druhý světelný zdroj
light_source {
    <2, 6, -3>                           // pozice světelného zdroje
    color White*0.7                      // barva světla
}

#declare Stack =                         // objekt složený z krychle, koule a válce
union {
    sphere {
        <0, 4, 0>, 1                     // koule
    }
    object {
        Disk_Y                           // válec
        translate 2*y
    }
    object {                             // krychle
        UnitBox
    }
    scale     0.7                        // změna velikosti, posun a rotace objektu
    translate -y*1.5
    rotate    y*45
}

// čtyři textury - šachovnice
#declare T1 = texture {
    pigment {
        checker
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
    }
    scale 0.4
}

#declare T2 = texture {
    pigment {
        checker
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
    }
    scale 0.4
    rotate <45,0,0>
}

#declare T3 = texture {
    pigment {
        checker
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
    }
    scale 0.4
    rotate <45,45,45>
}

#declare T4 = texture {
    pigment {
        checker
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
    }
    scale 0.4
    rotate <0,90,0>
}



// čtveřice testovacích objektů
object { Stack texture{T1} finish {ambient 0.3 diffuse 0.6 phong 1} translate <-2.5, 0, 2.5> }
object { Stack texture{T2} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 0.0, 0, 2.5> }
object { Stack texture{T3} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0, 2.5> }
object { Stack texture{T4} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0,-2.0> }


// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <8, 20, 8>
    texture {
        pigment {                        // šachovnicová textura
            checker                      // vyvedená ve stupních šedi
            color rgb<0.1, 0.3, 0.4>
            color rgb<0.2, 0.5, 0.7>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1602

Obrázek 2: Povrchy všech těles jsou v této scéně pokryté texturou tvořící šachovnicový vzo­rek

3. Textura složená se šestiúhelníků

POV-Ray obsahuje i texturu, která dává při správně zvoleném pohledu obrazec složený z pravidelných šestiúhelníků vyvedených ve třech barvách (žádné sousední šestiúhelníky nemají stejnou barvu). Jedná se o texturu nazvanou hexagon. Šestiúhelníky v této textuře tvoří základny nekonečně dlouhých hranolů, jejichž osa je rovnoběžná s osou y (šestiúhelníky tedy leží v jakékoli rovině rovnoběžné s rovinou x-z). Při mapování na povrch, který je orientován jiným směrem je nutné texturu podrobit transformaci rotace:

texture {
    pigment {
        hexagon                    // typ textury
        color rgb<1.0, 0.3, 0.3>   // první barva
        color rgb<0.2, 0.5, 0.7>   // druhá barva
        color rgb<0.8, 0.8, 0.2>   // třetí barva
    }
    scale 0.2
    rotate <45,45,45>
} 

Všechna tělesa ve druhém demonstračním příkladu jsou pokryta hexagonální texturou, přičemž v případě obalového kvádru u kolmých stěn vidíme pouze rovnoběžné řezy nekonečnými šestiúhelníkovými hranoly a na zaoblených částech typické artefakty:

// ------------------------------------------------------------
// Druhý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Textura složená ze šestiúhelníků.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Itextures.pov +Otextures.png
// (pro náhled postačí zadat příkaz povray textures.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"



// nastavení kamery
camera {
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// bodový světelný zdroj
light_source {
    <-2, 6, -3>                          // pozice světelného zdroje
    color White                          // barva světla
}

// druhý světelný zdroj
light_source {
    <2, 6, -3>                           // pozice světelného zdroje
    color White*0.7                      // barva světla
}

#declare Stack =                         // objekt složený z krychle, koule a válce
union {
    sphere {
        <0, 4, 0>, 1                     // koule
    }
    object {
        Disk_Y                           // válec
        translate 2*y
    }
    object {                             // krychle
        UnitBox
    }
    scale     0.7                        // změna velikosti, posun a rotace objektu
    translate -y*1.5
    rotate    y*45
}

// čtyři textury - šestiúhelníky
#declare T1 = texture {
    pigment {
        hexagon
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
        color rgb<0.8, 0.8, 0.2>
    }
    scale 0.2
}

#declare T2 = texture {
    pigment {
        hexagon
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
        color rgb<0.8, 0.8, 0.2>
    }
    scale 0.2
    rotate <45,0,0>
}

#declare T3 = texture {
    pigment {
        hexagon
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
        color rgb<0.8, 0.8, 0.2>
    }
    scale 0.2
    rotate <45,45,45>
}

#declare T4 = texture {
    pigment {
        hexagon
        color rgb<1.0, 0.3, 0.3>
        color rgb<0.2, 0.5, 0.7>
        color rgb<0.8, 0.8, 0.2>
    }
    scale 0.2
    rotate <0,0,90>
}



// čtveřice testovacích objektů
object { Stack texture{T1} finish {ambient 0.3 diffuse 0.6 phong 1} translate <-2.5, 0, 2.5> }
object { Stack texture{T2} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 0.0, 0, 2.5> }
object { Stack texture{T3} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0, 2.5> }
object { Stack texture{T4} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0,-2.0> }


// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <8, 20, 8>
    texture {
        pigment {                        // šachovnicová textura
            hexagon
            color rgb<0.1, 0.3, 0.4>
            color rgb<0.2, 0.5, 0.7>
            color rgb<0.4, 0.3, 0.1>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1603

Obrázek 3: Zde jsou všechny povrchy (i kolmé stěny) pokryty texturou složenou ze šestiúhelníků

4. Tvorba cihlových zdí

Na první pohled jednoduchou, ale poměrně užitečnou texturou je textura připomínající cihlovou zeď, jež dostala jméno (jak jinak) brick. U této textury je nutné specifikovat dvě barvy – barvu cihel a barvu malty. Kromě toho je možné zadat velikost cihel a tloušťku malty mezi cihlami (běžná tloušťka je rovna 0,5 délkové jednotce):

texture {
    pigment {
        brick                      // typ textury
        color Gray                     // barva malty
        color <0.8, 0.4, 0.4>    // barva cihel
        brick_size <x, y, z>
        mortar tloušťka_malty
    }
    scale 0.2
    rotate <45,45,45>
} 

Ve třetím demonstračním příkladu jsou texturou připomínající cihlovou zeď pokryta pouze testovací tělesa, nikoli obalový kvádr:

// ------------------------------------------------------------
// Třetí demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Textura připomínající cihlovou zeď
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Itextures.pov +Otextures.png
// (pro náhled postačí zadat příkaz povray textures.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"



// nastavení kamery
camera {
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// bodový světelný zdroj
light_source {
    <-2, 6, -3>                          // pozice světelného zdroje
    color White                          // barva světla
}

// druhý světelný zdroj
light_source {
    <2, 6, -3>                           // pozice světelného zdroje
    color White*0.7                      // barva světla
}

#declare Stack =                         // objekt složený z krychle, koule a válce
union {
    sphere {
        <0, 4, 0>, 1                     // koule
    }
    object {
        Disk_Y                           // válec
        translate 2*y
    }
    object {                             // krychle
        UnitBox
    }
    scale     0.7                        // změna velikosti, posun a rotace objektu
    translate -y*1.5
    rotate    y*45
}

// čtyři textury - cihly
#declare T1 = texture {
    pigment {
        brick
        color Gray
        color <0.8, 0.4, 0.4>
    }
    scale 0.2
}

#declare T2 = texture {
    pigment {
        brick
        color Gray
        color <0.8, 0.4, 0.4>
    }
    scale 0.2
    rotate <45,0,0>
}

#declare T3 = texture {
    pigment {
        brick
        color Gray
        color <0.8, 0.4, 0.4>
    }
    scale 0.2
    rotate <45,45,45>
}

#declare T4 = texture {
    pigment {
        brick
        color Gray
        color <0.8, 0.4, 0.4>
    }
    scale 0.1
    rotate <0,90,0>
}



// čtveřice testovacích objektů
object { Stack texture{T1} finish {ambient 0.3 diffuse 0.6 phong 1} translate <-2.5, 0, 2.5> }
object { Stack texture{T2} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 0.0, 0, 2.5> }
object { Stack texture{T3} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0, 2.5> }
object { Stack texture{T4} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0,-2.0> }


// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <8, 20, 8>
    texture {
        pigment {                        // šachovnicová textura
            hexagon
            color rgb<0.1, 0.3, 0.4>
            color rgb<0.2, 0.5, 0.7>
            color rgb<0.4, 0.3, 0.1>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1604

Obrázek 4: Testovací „panáci“ pokrytí texturou připomínající (při vhodném natočení) cihlovou zeď

5. Mapy barev a jejich použití s některými typy textur

Všechny tři výše popsané procedurální textury mají jednu společnou vlastnost: v obrazcích, které tvoří, se vyskytuje pouze omezený počet barev: u šachovnicového vzorku a vzorku zdi se střídají dvě barvy, v případě šestiúhelníků barvy tři. U všech textur, které si budeme popisovat dále, je však situace poněkud složitější, protože se jedná o textury zadané nějakou funkcí, která pro každý bod v prostoru vrátí reálné číslo v rozsahu 0–1. Toto číslo je nutné nějakým způsobem převést na barvu. V případě diskrétních hodnot (uložených třeba v rastrových obrázcích typu BMP, GIF či PNG) se pro tento účel využívají barvové palety (color palettes), v POV-Rayi je pro převod reálných čísel na barvu použito takzvaných map barev (color maps). Zadání mapy barev je poměrně jednoduché – specifikuje se vždy reálná hodnota a barva platná pro tuto hodnotu.

Mezi dvojicí reálných hodnot, které by měly být zadány v neklesajícím pořadí, je pak barva dopočítána pomocí lineární funkce. Je dokonce dovoleno vytvořit „skok“, a to tak, že se zadá ta stejná reálná hodnota s rozdílnou barvou. Pokud se budeme k této hodnotě přibližovat zespodu, použije se první barva (první řádek ve specifikaci), při přibližování shora pak barva druhá. Jednoduchá mapa barev může vypadat následovně:

// mapa bareav
  color_map {
    [0.0  color rgb <0.8, 0.2, 0.2>] // hodnota 0 je dolní mezí, pro kterou lze specifikovat barvu
    [0.2  color rgb <0.4, 0.2, 0.2>]
    [0.4  color White]                   // skok
    [0.4  color Black]
    [0.6  color rgb <0.2, 0.6, 0.6>]
    [1.0  color rgb <0.8, 0.2, 0.2>] // hodnota 1 je naopak horní mezí
  } 

6. Lineární, radiální a sférické gradientní přechody

V POV-Rayi je možné použít procedurální textury založené na lineárním, radiálním a sférickém gradientním přechodu. Lineární gradientní přechod zadaný klíčovým slovem gradient je nejjednodušší – v zadaném směru se hodnoty vypočtené podle této textury postupně zvyšují a po dosažení hodnoty 1 se opět začíná od nuly. Změnou směru se tedy mění i směr, ve kterém textura mění svoji barvu. Připomeňme si, že při specifikaci směru je možné použít konstantní jednotkové vektory x, y a z.

Textura s radiálním gradientním přechodem tvoří v řezu obrazce podobné paprskům. Barva tedy nezáleží na vzdálenosti, jako v případě lineárního přechodu, ale na úhlu spojnice počítaného bodu a nejbližšího bodu ležícího na y-ové ose. U této textury, která je určena klíčovým slovem radial je možné zadat frekvenci změn, tj. počet opakování celého rozsahu barvové mapy při jedné otočce („počet paprsků“). Samozřejmě je možné celým vzorkem otáčet podle toho, jaké těleso má být texturou pokryto.

Sférický gradientní přechod je specifikovaný klíčovým slovem spherical. Reálná hodnota a tím i barva bodu závisí na vzdálenosti bodu od počátku souřadné soustavy. Na rozdíl od předchozích dvou typů přechodů se ale hodnoty (a tím ani barvy) neopakují, proto má tento typ textury pouze omezené možnosti použití (ukážeme si ho v některém z dalších dílů seriálu).

Všechny tři typy gradientních přechodů jsou využity v dnešním čtvrtém demonstračním příkladu, jehož zdrojový kód je následující:

// ------------------------------------------------------------
// Čtvrtý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Lineární, radiální a sférické textury
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Itextures.pov +Otextures.png
// (pro náhled postačí zadat příkaz povray textures.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"



// nastavení kamery
camera {
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// bodový světelný zdroj
light_source {
    <-2, 6, -3>                          // pozice světelného zdroje
    color White                          // barva světla
}

// druhý světelný zdroj
light_source {
    <2, 6, -3>                           // pozice světelného zdroje
    color White*0.7                      // barva světla
}

#declare Stack =                         // objekt složený z krychle, koule a válce
union {
    sphere {
        <0, 4, 0>, 1                     // koule
    }
    object {
        Disk_Y                           // válec
        translate 2*y
    }
    object {                             // krychle
        UnitBox
    }
    scale     0.7                        // změna velikosti, posun a rotace objektu
    translate -y*1.5
    rotate    y*45
}

// čtyři textury
#declare T1 = texture {
    pigment {
      gradient y
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
}

#declare T2 = texture {
    pigment {
      radial
      frequency 8
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
}

#declare T3 = texture {
    pigment {
      spherical
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
    scale 1
}

#declare T4 = texture {
    pigment {
      gradient x
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
    scale 0.5
}



// čtveřice testovacích objektů
object { Stack texture{T1} finish {ambient 0.3 diffuse 0.6 phong 1} translate <-2.5, 0, 2.5> }
object { Stack texture{T2} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 0.0, 0, 2.5> }
object { Stack texture{T3} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0, 2.5> }
object { Stack texture{T4} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0,-2.0> }


// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <8, 20, 8>
    texture {
        pigment {                        // šachovnicová textura
            hexagon
            color rgb<0.1, 0.3, 0.4>
            color rgb<0.2, 0.5, 0.7>
            color rgb<0.4, 0.3, 0.1>
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1605

Obrázek 5: Testovací „panáci“ pokrytí texturami (zleva doprava): lineárním gradientním přechodem, radiálním gradientním přechodem, sférickým gradientním přechodem a lineárním přechodem otočeným o 90°

7. Náhodně vybarvené kostičky

Šachovnicovému vzorku popsanému ve druhé kapitole je poněkud podobná textura zadávaná klíčovým slovem cells. Také se pomocí ní vytváří barevné kostičky, ovšem jejich barva je náhodná – každé kostičce je přiřazeno reálné číslo v rozsahu 0–1, které je pomocí mapy barev převedeno na konkrétní barvu (to znamená, že se u této textury zadává pouze mapa barev a nikoli konkrétní barvy, jako tomu bylo v případě textury typu checker). Tento vzorek je použit i v dnešním posledním demonstračním příkladu, jehož zdrojový kód je vypsán v následující kapitole.

8. Základ pro tvorbu textur dřeva, spirály

Poslední dva typy textur, se kterými se dnes seznámíme, jsou textury wood, spiral1 a spiral2.

Textura wood je v určitém smyslu opakem radiálního gradientního přechodu – je totiž tvořena vzorkem, jehož konstantní hodnoty (převáděné pomocí mapy barev na jednu konstantní barvu) jsou tvořeny nekonečnými válci rovnoběžnými s osou z. Se zvyšující se vzdáleností bodů od osy z se hodnoty generované touto texturou zvyšují k jedničce a posléze se zase snižují k nule. Dále se posloupnost periodicky opakuje (funkce má tedy trojúhelníkový průběh). Textura wood může tvořit základ realističtějších textur těch druhů dřev, které obsahují letokruhy.

Textura spiral1 tvoří v prostoru vzorek podobný šroubovici, jejíž osa je totožná s osou z. V kolmém řezu je tato textura skutečně podobná spirále. Jediným parametrem (samozřejmě kromě barvové mapy) je počet spirálních ramen, který má textura mít (například hodnota 1 odpovídá skutečné šroubovici, hodnota 2 zase může sloužit pro tvorbu obrázků dvouramenných galaxií atd.). Mnohem zajímavější obrazce generuje textura specifikovaná klíčovým slovem spiral2, která je tvořena dvojicí spirál točených proti sobě (s opačnou orientací). I u této textury je nutné specifikovat počet ramen.

Následuje výpis zdrojového kódu pátého demonstračního příkladu, po jehož vykreslení je patrné, že se spirální textury dají bez problémů použít i na zaoblené povrchy:

// ------------------------------------------------------------
// Pátý demonstrační příklad ukazující práci s procedurálními
// texturami.
//
// Náhodně vybarvené kostičky, základ pro tvorbu textury dřeva atd.
//
// rendering lze spustit příkazem:
//     povray +W800 +H600 +B100 +FN +D +Itextures.pov +Otextures.png
// (pro náhled postačí zadat příkaz povray textures.pov)
// ------------------------------------------------------------

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"



// nastavení kamery
camera {
    location  <-4, 3, -9>                // pozice kamery
    look_at   <0, 0, 0>                  // bod, na který se kamera dívá
    angle 48                             // zorný úhel
}

// bodový světelný zdroj
light_source {
    <-2, 6, -3>                          // pozice světelného zdroje
    color White                          // barva světla
}

// druhý světelný zdroj
light_source {
    <2, 6, -3>                           // pozice světelného zdroje
    color White*0.7                      // barva světla
}

#declare Stack =                         // objekt složený z krychle, koule a válce
union {
    sphere {
        <0, 4, 0>, 1                     // koule
    }
    object {
        Disk_Y                           // válec
        translate 2*y
    }
    object {                             // krychle
        UnitBox
    }
    scale     0.7                        // změna velikosti, posun a rotace objektu
    translate -y*1.5
    rotate    y*45
}

// čtyři textury
#declare T1 = texture {
    pigment {
      cells
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
    scale 0.2
}

#declare T2 = texture {
    pigment {
      wood
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
}

#declare T3 = texture {
    pigment {
      spiral1 2
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
}

#declare T4 = texture {
    pigment {
      spiral2 2
      color_map {
        [0.0  color rgb <0.8, 0.2, 0.2>]
        [0.2  color rgb <0.4, 0.2, 0.2>]
        [0.4  color rgb <0.2, 0.4, 0.4>]
        [0.6  color rgb <0.2, 0.6, 0.6>]
        [1.0  color rgb <0.8, 0.2, 0.2>]
      }
    }
}



// čtveřice testovacích objektů
object { Stack texture{T1} finish {ambient 0.3 diffuse 0.6 phong 1} translate <-2.5, 0, 2.5> }
object { Stack texture{T2} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 0.0, 0, 2.5> }
object { Stack texture{T3} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0, 2.5> }
object { Stack texture{T4} finish {ambient 0.3 diffuse 0.6 phong 1} translate < 2.5, 0,-2.0> }


// kvádr, do kterého je celá scéna uzavřena
box {
    <-12,-2,-12>, <8, 20, 8>
    texture {
        pigment {                        // šachovnicová textura
            spiral2 3
            color_map {
                [0.0  color rgb <0.1, 0.3, 0.4>]
                [0.3  color rgb <0.2, 0.5, 0.7>]
                [0.6  color rgb <0.4, 0.3, 0.1>]
            }
            scale 2
        }
        finish {                         // odlesky a odrazy na povrchu
            diffuse 0.7
            reflection 0.2
        }
    }
}



// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray1606

Obrázek 6: V této demonstrační scéně jsou použity textury složené z náhodně vybarvených kostiček (nejlevější objekt), textura sloužící jako základ pro tvorbu dřeva (druhý objekt zleva) a různé typy spirál. I všechny stěny obalujícího kvádru jsou pokryty texturou založenou na motivu spirály.

UX DAy - tip 2

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

Všechny výše popsané procedurální textury byly zcela pravidelné a v generovaných obrázcích se neuplatňovala žádná náhodnost. V reálném světě (a reálnému světu se v některých scénách chceme přiblížit) je však většina povrchů objektů zbarvená více či méně náhodně, proto se budeme v další části seriálu věnovat těm procedurálním texturám, při jejichž generování je možné použít šumové a náhodné funkce (noise functions, random functions). Pomocí takových textur je možné vykreslit různé typy přírodních i umělých materiálů – od textur dřeva, přes různé typy mramorů až po vodní hladinu.

povray1607

Obrázek 7: Procedurální textury dřeva: od smrku přes dub až po mahagon

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.