Hlavní navigace

Rastrové textury v POV-Rayi

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

Sdílet

V dnešní části seriálu o programu POV-Ray si vysvětlíme, jakým způsobem je možné na povrch těles nanášet rastrové textury, například fotografie nebo obrázky vytvořené v rastrových grafických editorech typu GIMP či Photoshop. Budou popsány i způsoby mapování těchto textur na objekty různých tvarů.

Obsah

1. Rastrové textury v POV-Rayi
2. Uzel „image_map“
3. První demonstrační příklad – použití textury tvořené rastrovým obrázkem
4. Interpolace a různé metody mapování (projekce) rastrových textur
5. Druhý demonstrační příklad – planární a sférická projekce rastrových textur
6. Třetí demonstrační příklad – další metody projekce
7. Obsah následující části seriálu

1. Rastrové textury v POV-Rayi

V předchozích částech tohoto seriálu byly popsány prakticky všechny dostupné typy procedurálních textur, které je možné v POV-Rayi použít bez nutnosti volání pomocných externích aplikací. Tyto textury sice při tvorbě prostorových scén nabízí téměř nepřeberné množství možností a kombinací, jak opticky přizpůsobit povrch těles požadovanému typu materiálu, ovšem mnohdy je zapotřebí některé těleso pokrýt zcela odlišným typem textury, například vzorkem vytvořeným v některém rastrovém grafickém editoru (GIMP, Photoshop, grafické editory určené pro pixel art atd.) nebo získaným pomocí digitální fotografie. I tuto možnost POV-Ray samozřejmě tvůrcům scén nabízí, podobně jako téměř všechny ostatní programy určené pro raytracing. Jako vstupní vzorek pro vytvoření textury je možné použít rastrový obrázek (bitmapu) uložený v některém podporovaném typu externího souboru (typicky se pro tento účel používají formáty PNG, JPEG a TGA).

povray2001

Obrázek 1: Model, na který je namapováno několik rastrových textur

POV-Ray jde ve svých možnostech dokonce ještě mnohem dál, neboť podporuje i tvorbu prostorových textur na základě objemových dat reprezentovaných formou pravidelné mřížky složené z objemových elementů (voxelů). Pro uložení objemových dat (mřížky voxelů) je určen speciální binární formát nazvaný df3, který má však poměrně jednoduchou interní strukturu, takže je možné objemové textury generovat i z vlastních aplikací. POV-Ray tak může sloužit jako jednoduše použitelný front-end pro různé simulační programy, vizualizaci dat získaných z CT (computer tomography) či MR (magnetická rezonance) apod. V následujících kapitolách této části seriálu o POV-Rayi bude popsána především problematika plošných rastrových textur, o texturách objemových si podrobněji povíme až při popisu optických vlastností vnitřku těles (prozatím se totiž stále bavíme o texturách ovlivňujících především optické vlastnosti povrchu těles, a to i v případě využití průhlednosti).

povray2002

Obrázek 2: Nápisy na baňkách (The POV-Ray Team) jsou vytvořeny pomocí rastrových textur

2. Uzel „image_map“

Pro vytvoření textury z rastrového vzorku uloženého v externím souboru (bitmapě) je určený uzel image_map, který se zapisuje do uzlu pigment, podobně jako tomu bylo u všech doposud popisovaných procedurálních textur. Uzel image_map má následující syntaxi (malými znaky jsou zapsána klíčová slova, velkými znaky potom číselné nebo řetězcové parametry):

// specifikace rastrového obrázku
// jako zdroje pro vytvoření textury
pigment
{
    image_map
    {
        [BITMAP_TYPE] "bitmap[.ext]"
        [IMAGE_MAP_MODS...]
    }
    [PIGMENT_MODFIERS...]
} 
povray2003

Obrázek 3: Jednoduchá dlaždicovitá rastrová textura použitá v demonstračních příkladech

Základem tohoto uzlu je informace o jméně (a popř. i cestě) externího souboru, který rastrovou texturu obsahuje; jméno souboru je, podobně jako každá řetězcová hodnota, umístěno mezi ASCII uvozovky. Před jménem souboru může být uveden i jeho typ podle tabulky vypsané pod tímto odstavcem. V případě, že typ souboru není zadán, použije se automatická detekce s přihlédnutím k operačnímu systému, na kterém je POV-Ray spuštěn. V praxi je však kvůli přenositelnosti zdrojových souborů s popisem trojrozměrných scén vhodnější typ vždy uvádět, stejně jako příponu souboru s rastrovým obrázkem. Mezi podporované typy souborů patří:

povray2004

Obrázek 4: Další rastrová textura, která se periodicky opakuje

BITMAP_TYPE Význam Reference
GIF Graphics Interchange File Format /clanky/pripad-gif/
TGA Targa /clanky/graficky-format-tga-jednoduchy-oblibeny-pouzivany/
PPM Portable PixelMap File Format /clanky/graficke-formaty-ve-znameni-unixu/
PGM Portable GrayMap File Format /clanky/graficke-formaty-ve-znameni-unixu/
PNG Portable Network Graphics /clanky/png-is-not-gif/
JPEG Formát JFIF /clanky/jpeg-kral-rastrovych-grafickych-formatu/
TIFF Tagged Image File Format
SYS systémově závislý formát BMP pro MS Windows
povray2005

Obrázek 5: Jednoduchý rastrový obrázek použitý v demonstračních příkladech

Kromě jména souboru může uzel image_map obsahovat i další atributy popsané v následujících kapitolách. Výsledkem načtení rastrového obrázku je skutečná textura POV-Raye, se kterou se dají provádět veškeré další manipulace, včetně změny měřítka, aplikace průhlednosti (platí pro obrázky s barvovou paletou), multitexturing atd.

3. První demonstrační příklad – použití textury tvořené rastrovým obrázkem

V dnešním prvním demonstračním příkladu je ukázán nejjednodušší způsob použití rastrových textur. V testovací scéně jsou umístěna dvě tělesa – koule a rovina – na které je namapována jedna z textur, jejichž obrázky byly zobrazeny v předchozí kapitole. Je použito implicitní mapování textur, tj. projekce původně plošné textury na povrch tělesa a pro zvýraznění rastrového původu textur je na texturu aplikována změna měřítka. Z výsledných obrázků jsou patrné dvě principiální nevýhody rastrových textur, které se dají pouze minimalizovat a nikoli zcela odstranit – nejednoznačnost při mapování obdélníkové textury na těleso, jehož povrch má odlišnou topologii (typickým případem je koule, kterou nelze, jak někteří grafici s oblibou říkají, „učesat“) a také ztráta vizuální kvality textury při velkém přiblížení, kdy začínají být patrné jednotlivé pixely, které tvoří podklad této textury.

povray2006

Obrázek 6: Obrázek vytvořený pomocí prvního demonstračního příkladu za použití dlaždicovité textury

Zdrojový kód prvního demonstračního příkladu:

// ------------------------------------------------------------
// První demonstrační příklad:
// ukázka použití rastrového obrázku pro texturu
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

light_source {                           // světelný zdroj
    <0, 75, -50>                         // pozice zdroje
    color White                          // barva zdroje
}

// koule
sphere {
    <0, 0, 0>, 1                         // pozice středu a poloměr
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
            }
            scale 4                      // změna měřítka textury
        }
    }
    scale     10                         // lineární transformace aplikovaná na objekt
    rotate    -90*y
    translate <-12, 0, 20>
}

// rovina
plane {
    z, 0                                 // orientace a posun roviny
    hollow on                            // objekt nemá "vnitřek"
    clipped_by {                         // rovina je omezena kvádrem
        box {
            <0, 0, -1>,
            <1, 1, 1>
        }
    }
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
            }
            scale 2                      // změna měřítka textury
        }
    }
    translate <-0.5, -0.5, 0>            // lineární transformace aplikovaná na objekt
    scale     20
    rotate    <20, 30, 0>
    translate <12, 0, 20>
}

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

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray2007

Obrázek 7: Obrázek vytvořený pomocí prvního demonstračního příkladu za použití testovacího vzorku

4. Interpolace a různé metody mapování (projekce) rastrových textur

Z předchozího demonstračního příkladu je patrné, že při velkém přiblížení rastrové textury nebo při jejím zvětšení (což je ve výsledku totéž), se začínají objevovat nežádoucí vizuální efekty způsobené rastrovým (diskrétním) obrázkem. Další chyby vznikají naopak při velkém oddálení rastrové textury, kdy může docházet k takzvanému aliasu mezi rastrem textury a rastrem výstupního zařízení (přesněji řečeno rastrem obrázku, který POV-Ray při své činnosti vytváří). Aby se těmto nežádoucím jevům v co největší míře zabránilo, používá se při vykreslování antialiasing, založený většinou na supersamplingu, tj. vyslání více paprsků do scény pro každý vykreslovaný pixel. Antialiasing je možné povolit volbou +a.

„Čtverečkovanému“ vzhledu rastrové textury při přílišném přiblížení lze zabránit použitím interpolace, která je podobná interpolaci používané například v prohlížečích obrázků. Uvedením modifikátoru interpolate 2 se zapne bilineární interpolace; dále je možné uvést modifikátor interpolate 4 pro interpolaci založenou na normalizované vzdálenosti ideálního bodu od středů sousedních pixelů. Ve většině případů je vhodnější použít interpolaci bilineární.

Dále bylo z předchozího příkladu patrné, že se se textura sice korektně nanesla na plochu, ale na kouli již nikoli. POV-Ray totiž sám nerozezná, jaký skutečný tvar má těleso, na nějž se textura nanáší, i když ve svém jádru obsahuje podporu pro čtyři různé typy mapování, jež odpovídají čtyřem topologicky odlišným typům těles. Z tohoto důvodu je možné modifikátorem map_type určit, jakým způsobem se má původně rovinná rastrová textura (čtverec či obdélník) namapovat na povrch tělesa, tj. jaká má být zvolena projekce. Podporovány jsou čtyři typy projekce:

Hodnota map_type Význam
0 rovinná projekce, implicitní hodnota
1 projekce na kouli či podobné těleso
2 projekce na válec či topologicky podobné těleso
5 (skutečně 5!) projekce na toroid (anuloid, torus)

5. Druhý demonstrační příklad – planární a sférická projekce rastrových textur

Druhý demonstrační příklad vychází z příkladu prvního, ovšem došlo v něm ke třem úpravám: je povolena bilineární interpolace rastrové textury zlepšující vizuální dojem, u levého tělesa (koule) je zvolena korektní projekce na kouli a navíc je u textur uveden modifikátor once kterým se říká, že textura na objektu nebude tvořit dlaždice (nebude se opakovat), ale naopak bude zvětšena tak, aby přesně pokrývala povrch tělesa. Toto je implicitní chování projekce na kouli (map_type 1), u dalších typů projekcí je však možné podle potřeb zvolit i jiný způsob spočívající v použití dlaždic.

povray2008

Obrázek 8: Obrázek vytvořený pomocí druhého demonstračního příkladu za použití dlaždicovité textury

// ------------------------------------------------------------
// Druhý demonstrační příklad:
// planární a sférická projekce rastrových textur, interpolace textur
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"

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

light_source {                           // světelný zdroj
    <0, 75, -50>                         // pozice zdroje
    color White                          // barva zdroje
}

// koule, na níž je vyzkoušeno sférické mapování
sphere {
    <0, 0, 0>, 1                         // pozice středu a poloměr
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
                map_type 1               // sférické mapování
                once                     // obrázek se nebude opakovat
                interpolate 2            // interpolace při přibližování a vzdalování
            }
        }
    }
    scale     10                         // lineární transformace aplikovaná na objekt
    rotate    -90*y
    translate <-12, 0, 20>
}

// rovina pro test planárního mapování
plane {
    z, 0                                 // orientace a posun roviny
    hollow on                            // objekt nemá "vnitřek"
    clipped_by {                         // rovina je omezena kvádrem
        box {
            <0, 0, -1>,
            <1, 1, 1>
        }
    }
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
                map_type 0               // planární mapování
                once                     // obrázek se nebude opakovat
                interpolate 2            // interpolace při přibližování a vzdalování
            }
        }
    }
    translate <-0.5, -0.5, 0>            // lineární transformace aplikovaná na objekt
    scale     20
    rotate    <20, 30, 0>
    translate <12, 0, 20>
}

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

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray2009

Obrázek 9: Obrázek vytvořený pomocí druhého demonstračního příkladu za použití testovacího vzorku

6. Třetí demonstrační příklad – další metody projekce

Ve třetím příkladu jsou ukázány možnosti zbývajících dvou metod projekce rastrových textur na povrch objektů, tj. projekce na válec (či topologicky nebo tvarově podobné těleso) a projekce na toroid. Jak je z tohoto demonstračního příkladu patrné, je nutné u složitějších geometrických tvarů, než je rovina, koule, válec či toroid vybrat nejvhodnější mapování především podle topologie tělesa, na který má být textura namapována. U složitějších tvarů dochází i přes správnou volbu mapování k deformaci textury, kterému je možné zabránit například rozdělením povrchu i textury na více částí nebo (v těch nejsložitějších případech) použitím objemové textury.

povray2010

Obrázek 10: Obrázek vytvořený pomocí třetího demonstračního příkladu za použití dlaždicovité textury

// ------------------------------------------------------------
// Třetí demonstrační příklad:
// další typy projekce rastrových textur, interpolace textur
//
// rendering lze spustit příkazem:
//     povray +W1024 +H1024 +B100 +FN +D +Itextures.pov +Otextures.png
// ------------------------------------------------------------

#version 3.0
global_settings {
    assumed_gamma 2.2
}

#include "colors.inc"
#include "shapes.inc"                    // soubor s různými tvary

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

light_source {                           // světelný zdroj
    <0, 75, -50>                         // pozice zdroje
    color White                          // barva zdroje
}

// válec
cylinder {
    <0,0,0>, y, 1                        // pozice středu, orientace a poloměr
    open
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
                map_type 2               // cylindrické mapování
                once                     // obrázek se nebude opakovat
                interpolate 2            // interpolace při přibližování a vzdalování
            }
        }
    }
    translate <0, -0.5, 0>               // lineární transformace aplikovaná na objekt
    scale     <7, 14, 7>
    rotate    <40, -60, 0>
    translate <-12, 10, 20>
}

// torus (toroid, anuloid)
torus {
    6.4, 3.5                             // hlavní a vedlejší poloměr torusu
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
                map_type 5               // mapování na torus
                once                     // obrázek se nebude opakovat
                interpolate 2            // interpolace při přibližování a vzdalování
            }
        }
    }
    rotate -90*y                         // lineární transformace aplikovaná na objekt
    rotate -40*x
    translate <12, 10, 20>
}

// rotační hyperboloid
object {
    Hyperboloid_Y
    translate 1*y scale <1, 0.5, 1>
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
                map_type 2               // cylindrické mapování
                once                     // obrázek se nebude opakovat
                interpolate 2            // interpolace při přibližování a vzdalování
            }
        }
    }
    scale     <1, 2, 1>                  // lineární transformace aplikovaná na objekt
    translate <0, -1, 0>
    clipped_by {                         // kvádr tvořící hranici původně nekonečného tělesa
        box {
            <-2,-1,-2>,
            <2,1,2>
        }
    }
    scale     <5, 7, 5>
    rotate    <-40, -90, 0>
    translate <-12, -10, 20>
}

// rotační paraboloid
object {
    Paraboloid_Y
    texture {
        pigment {
            image_map {                  // specifikace rastrové textury
                png "povray20_03.png"    // jméno souboru s texturou
                map_type 2               // cylindrické mapování
                once                     // obrázek se nebude opakovat
                interpolate 2            // interpolace při přibližování a vzdalování
            }
        }
    }
    clipped_by {                         // kvádr tvořící hranici původně nekonečného tělesa
        box {
            <-2,0,-2>,
            <2,1,2>
        }
    }
    translate <0, -0.5, 0>               // lineární transformace aplikovaná na objekt
    scale     <8, 16, 8>
    rotate    <-40, 0, 0>
    translate <12, -10, 20>
}

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

// ------------------------------------------------------------
// finito
// ------------------------------------------------------------ 
povray2011

Obrázek 11: Obrázek vytvořený pomocí třetího demonstračního příkladu za použití testovacího vzorku

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

V další části seriálu o raytraceru POV-Ray budeme pokračovat v popisu možností textur vytvářených pomocí externích rastrových obrázků. Ukážeme si především použití poloprůhledných textur a aplikaci průhlednosti pouze na některé barvy v obrázcích s barvovou paletou – touto technikou lze napodobit sprity známé především z her. Také se začneme zabývat modulací normálových vektorů (bump mappingem).

cyber23

povray2012

Obrázek 12: Poloprůhledná rastrová textura

povray2013

Obrázek 13: Nastavení průhlednosti jen pro vybrané indexy barev u obrázků s barvovou paletou

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