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).
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).
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...]
}

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ří:

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 |

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.
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
// ------------------------------------------------------------
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.
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
// ------------------------------------------------------------
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.
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
// ------------------------------------------------------------
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).
Obrázek 12: Poloprůhledná rastrová textura
Obrázek 13: Nastavení průhlednosti jen pro vybrané indexy barev u obrázků s barvovou paletou