Obsah
1. Použití průhlednosti v procedurálních texturách
2. První demonstrační příklad – průhlednost v procedurální textuře spiral1 a spiral2
3. Druhý demonstrační příklad – průhlednost a procedurální textury crackle a bozo
4. Průhlednost při použití rastrových textur
5. Třetí demonstrační příklad – průhlednost zadaná pro rastrovou texturu jako celek
6. Čtvrtý demonstrační příklad – průhlednost specifikovaná pouze pro některé indexy barev
7. Pátý demonstrační příklad – použití obrázku, který obsahuje poloprůhledné pixely
1. Průhlednost u rastrových textur
V předchozí části tohoto seriálu jsme si popsali základní principy použití rastrových textur, tj. textur uložených v externích rastrových obrázcích. Ukázali jsme si různé metody interpolace rastrových textur při jejich přílišném zvětšení či naopak zmenšení, aby se do co největší míry zabránilo nežádoucím vizuálním artefaktům vzniklým kvůli aliasu. Také byl vysvětlen princip mapování (projekce) rastrových textur na různé tvary povrchů – roviny, koule, válce a toroidu (anuloidu). Zbývá popis možnosti vytvoření tělesa s poloprůhlednými či zcela průhlednými částmi povrchu. V případě použití procedurálních textur je situace poměrně jednoduchá – každé barvě uložené v barvové mapě je možné přiřadit i hodnotu průhlednosti, která bude skutečně při vykreslování brána v potaz, což je jedna z metod tvorby těles se zdánlivě „děrovaným“ povrchem. Tato metoda je ukázána na prvním obrázku, ve kterém se nachází dvě tělesa pokrytá procedurálními texturami spiral1 a spiral2, v nichž jsou některé barvy zcela průhledné:
Obrázek 1: Použití procedurálních textur s průhlednými barvami v barvové mapě
2. První demonstrační příklad – průhlednost v procedurální textuře spiral1 a spiral2
V dnešním prvním demonstračním příkladu je ukázáno použití průhlednosti v procedurálních texturách spiral1 a spiral2, které jsme si již v tomto seriálu podrobně popsali (v prvním případě se jedná o jednoduchou spirálu s jedním či více rameny, ve druhém případě o spirálu s více proti sobě se vinoucími šroubovicemi). Ve skutečnosti je samozřejmě možné průhlednost aplikovat na libovolnou procedurální texturu, u spirál je však výsledek pravděpodobně vizuálně nejzajímavější. Při specifikaci textur je použita barvová mapa, ovšem u některých jejích položek je místo jména barvy zapsána hodnota Clear. Nejedná se o klíčové slovo, ale o hodnotu deklarovanou v souboru colors.inc, v němž můžeme nalézt následující řádek #declare Clear = rgbf 1;, tj. jedná se o zcela průhlednou barvu (filter=1). U levého objektu je přechod mezi neprůhlednou a průhlednou částí skokový (v barvové mapě jsou dva za sebou jdoucími řádky se stejnými levými hodnotami), u objektu pravého je naopak přechod pozvolný, což vede i k postupnému „průhlednění“ okrajů spirály.
Obrázek 2: První demonstrační příklad po vykreslení v POV-Rayi
Zdrojový kód prvního demonstračního příkladu má tvar:
// ------------------------------------------------------------
// První demonstrační příklad:
// použití průhlednosti při vykreslování procedurálních textur
// spiral1 a spiral2
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +B100 +FN +D +Itextures.pov +Otextures.png
// ------------------------------------------------------------
#version 3.0
global_settings {
assumed_gamma 2.2
}
#include "colors.inc"
camera { // nastavení kamery
location <100,50,50> // pozice kamery v prostoru
direction z*1.2 // směr pohledu kamery
look_at <0,25,0>
}
light_source { // světelný zdroj
<40,500,300> // pozice světelného zdroje
color White*2 // barva zdroje
}
plane { // podkladová rovina
y,0
pigment {
White
}
}
sphere { // první těleso s poloprůhlednou texturou
<0,25,-30>, 25
texture {
pigment {
spiral1 1 // jednoduchá spirála
color_map { // barvová mapa
[0.0 White]
[0.2 Wheat]
[0.4 Orange]
[0.4 Clear] // skokový přechod mezi oranžovou a průhlednou
[1.0 Clear] // zcela průhledná barva
}
scale 5 // zvětšení textury
}
}
}
sphere { // druhé těleso s poloprůhlednou texturou
<0,25,30>,25
texture {
pigment {
spiral2 5 // dvojitá spirála
color_map {
[0.0 White]
[0.2 Wheat]
[0.4 Red] // plynulý přechod
[0.6 Clear] // zcela průhledná barva
[1.0 Clear] // zcela průhledná barva
}
scale 30 // zvětšení textury
}
}
}
fog { // mlha na pozadí scény
White distance 600
}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
3. Druhý demonstrační příklad – průhlednost a procedurální textury crackle a bozo
Ve druhém demonstračním příkladu je průhlednost použita společně s procedurálními texturami crackle a bozo. Ty vytvářejí zcela odlišný vzorek než procedurální textury spiral1 či spiral2, jež byly použité v předchozím příkladu. U obou textur je specifikována barvová mapa obsahující postupný (nikoli skokový) přechod mezi zcela neprůhlednou a zcela průhlednou barvou, což je patrné zejména na pravém objektu (kouli).
Obrázek 3: Druhý demonstrační příklad po vykreslení v POV-Rayi
Zdrojový kód druhého demonstračního příkladu má tvar:
// ------------------------------------------------------------
// Druhý demonstrační příklad:
// použití průhlednosti při vykreslování procedurálních textur
// bozo a crackle
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +B100 +FN +D +Itextures.pov +Otextures.png
// ------------------------------------------------------------
#version 3.0
global_settings {
assumed_gamma 2.2
}
#include "colors.inc"
camera { // nastavení kamery
location <100,50,50> // pozice kamery v prostoru
direction z*1.2 // směr pohledu kamery
look_at <0,25,0>
}
light_source { // světelný zdroj
<40,500,300> // pozice světelného zdroje
color White*2 // barva zdroje
}
plane { // podkladová rovina
y,0
pigment {
White
}
}
sphere { // první těleso s poloprůhlednou texturou
<0,25,-30>, 25
texture {
pigment {
crackle // typ procedurální textury
color_map { // barvová mapa
[0.0 White]
[0.1 Wheat]
[0.2 Red]
[0.3 Clear] // postupný přechod mezi červenou a průhlednou
[1.0 Clear] // zcela průhledná barva
}
scale 8 // zvětšení textury
}
}
}
sphere { // druhé těleso s poloprůhlednou texturou
<0,25,30>,25
texture {
pigment {
bozo // typ procedurální textury
color_map {
[0.0 Red]
[0.2 Wheat]
[0.4 Blue] // plynulý přechod mezi modrou a průhlednou
[0.5 Clear] // zcela průhledná barva
[1.0 Clear] // zcela průhledná barva
}
scale 7 // zvětšení textury
}
}
}
fog { // mlha na pozadí scény
White distance 600
}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
4. Průhlednost při použití rastrových textur
Při použití rastrových textur ve vytvářených prostorových scénách lze průhlednost či poloprůhlednost specifikovat třemi různými způsoby. Nejjednodušší je zadání průhlednosti pro celou texturu (všechny její pixely). Mnohem sofistikovanější způsob spočívá v zadání průhlednosti pouze pro některé indexy barev (musí tedy být použity obrázky s barvovou paletou) a třetí způsob je založen přímo na rastrových obrázcích, které obsahují průhledné části – tato forma průhlednosti je podporována zejména u formátu PNG a TGA.
Jednou z největších předností grafického formátu PNG je plná podpora průhlednosti, nazývané také alfa kanál (transparency, alpha channel). Podle typu ukládaného obrázku je možné buď přímo každému pixelu umístěnému v rastrové mřížce, nebo každé barvě uložené v barvové paletě přiřadit hodnotu průhlednosti. Podporován je jak plný osmibitový či dokonce šestnáctibitový alfa kanál (256 či 65536 stupňů průhlednosti, tj. hodnot α), tak i „jednobitová“ průhlednost známá už z grafického formátu GIF. POV-Ray v případě formátu PNG rozpoznává a dokáže využít alfa kanál o hloubce osm bitů a také barvovou paletu, v níž je použita (taktéž osmibitová) průhlednost.
V následujících dvou demonstračních příkladech bude jako zdroj pro rastrovou texturu použit obrázek uložený ve formátu PNG (Portable Network Graphics) o poměrně malém rozlišení 320×200 pixelů, který obsahuje barvovou paletu se šestnácti položkami (barvami). Díky malému rozlišení obrázku bude v příkladech jasně patrný vliv bilineární interpolace při mapování rastrové textury na povrch těles a barvová paleta o pouhých šestnácti položkách nám umožní jednoduše specifikovat ty barvy, které mají být zcela průhledné či poloprůhledné. Jedná se o tento obrázek (zde zobrazený ve svém plném rozlišení):

Obrázek 4: Zdrojový soubor pro tvorbu rastrových textur
5. Třetí demonstrační příklad – průhlednost zadaná pro rastrovou texturu jako celek
Ve třetím demonstračním příkladu je ukázáno, jakým způsobem je možné nastavit průhlednost pro celou rastrovou texturu, tj. pro všechny její pixely. Pro tento účel je vyhrazeno klíčové slovo filter použité s modifikátorem all, za nímž je zapsána numerická hodnota z rozsahu 0,0–1,0 odpovídající 0 procentům až 100 procentům. Výsledkem jsou tělesa se stejnou mírou průhlednosti po celé, jejich povrchu.
Obrázek 5: Třetí demonstrační příklad po vykreslení v POV-Rayi
Následuje zdrojový kód třetího demonstračního příkladu:
// ------------------------------------------------------------
// Třetí demonstrační příklad:
// použití průhlednosti při vykreslování rastrových textur
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +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 "test.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í
filter all 0.7 // specifikace průhlednosti pro celou texturu
}
}
}
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 "test.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í
filter all 0.9
}
}
}
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 "test.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í
filter all 0.7
}
}
}
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 "test.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í
filter all 0.7
}
}
}
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
// ------------------------------------------------------------
6. Čtvrtý demonstrační příklad – průhlednost specifikovaná pouze pro některé indexy barev
Ve čtvrtém demonstračním příkladu je ukázána možnost specifikace průhlednosti či poloprůhlednosti pouze pro některé indexy barev. Tuto možnost je možné využít, jak již víme, pouze u těch rastrových obrázků, které obsahují barvovou paletu (tuto podmínku náš testovací obrázek bezezbytku splňuje, protože má šestnáctibarevnou paletu s indexy 0 až 15). Přímo v uzlu představujícím rastrovou texturu (image_map) je možné zadat jeden či více parametrů filter, za nimiž následuje pořadí barvy v barvové paletě obrázku a hodnota průhlednosti ležící typicky v rozsahu 0,0 až 1,0 (lze použít i hodnoty mimo tento rozsah; POV-Rayi je totiž jedno, jakou multiplikativní konstantu při výpočtu průhlednosti používá). Kromě parametru filter lze použít i parametr transmit, který má stejný význam až na hodnoty, jež jsou přesně opačné než u parametru filter. Dvě různé varianty parametrů filter vedou ke zcela odlišným výsledkům, což je patrné i ze šestého a sedmého obrázku (v prvním případě je nápis neprůhledný, ve druhém naopak zcela průhledný).
Obrázek 6: Čtvrtý demonstrační příklad po vykreslení v POV-Rayi
Zdrojový kód čtvrtého demonstračního příkladu:
// ------------------------------------------------------------
// Čtvrtý demonstrační příklad:
// nastavení průhlednosti v závislosti na indexu barvy v textuře
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +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
}
// torus (toroid, anuloid)
torus {
6.4, 3.5 // hlavní a vedlejší poloměr torusu
texture {
pigment {
image_map { // specifikace rastrové textury
png "test.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í
filter 0, 0.8 // barva s indexem 0 je transparentní na 80%
filter 1, 0.8
filter 2, 0.8
filter 3, 0.8
filter 4, 0.8
filter 5, 0.0 // barva s indexem 5 je neprůhledná
}
}
}
rotate -90*y // lineární transformace aplikovaná na objekt
rotate -40*x
translate <12, 0, 20>
}
// 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 "test.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í
filter 0, 0.8 // barva s indexem 0 je transparentní na 80%
filter 1, 0.8
filter 2, 0.8
filter 3, 0.8
filter 4, 0.8
filter 5, 0.0 // barva s indexem 5 je neprůhledná
}
}
}
scale 10 // lineární transformace aplikovaná na objekt
rotate -90*y
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: Čtvrtý demonstrační příklad po vykreslení v POV-Rayi (jiné nastavení průhledností v barvové mapě)
7. Pátý demonstrační příklad – použití obrázku, který obsahuje poloprůhledné pixely
V dnešním pátém demonstračním příkladu je jako zdroj pro rastrovou texturu použit obrázek typu PNG, který obsahuje průhledné pixely (jedná se o obrázek dodávaný spolu s tabulkovým procesorem Gnumeric). Tento obrázek je nanesen na plochu zobrazenou nad další plochou se šachovnicovou texturou. To, že je v obrázku použita průhlednost o 256 stupních (osmibitový alfa kanál), je patrné jak z okrajů odpadkového koše (plynulý přechod), tak i z jeho stínu.

Obrázek 8: Textura pro pátý demonstrační příklad
Zdrojový kód pátého demonstračního příkladu:
// ------------------------------------------------------------
// Pátý demonstrační příklad:
// použití rastrového obrázku s průhledností
//
// rendering lze spustit příkazem:
// povray +W1024 +H768 +B100 +FN +D +Itextures.pov +Otextures.png
// ------------------------------------------------------------
#include "colors.inc"
#include "textures.inc"
camera { // nastavení kamery
orthographic // bez perspektivy
location <2, 2, 1> // pozice kamery
right 7*x // šířka a výška snímané části scény
up 7*y
direction -z // směr pohledu kamery (k počátku)
}
light_source { // světelný zdroj
<5, 5, 10> // pozice zdroje
color White // barva zdroje
shadowless // zákaz výpočtu stínů
}
plane { // podkladová plocha
z,-1
texture {
pigment { // šachovnicová textura
checker
color <0.4, 0.3, 0.1>,
color <0.7, 0.5, 0.2>
scale 10
}
finish { // odlesky a odrazy na povrchu
diffuse 0.7
reflection 0.2
}
scale 0.1
}
}
plane { // plocha s texturou
z,0
texture {
pigment {
image_map { // rastrový obrázek s průhledností
png "test2.png"
once
}
scale 5
}
}
}
// ------------------------------------------------------------
// finito
// ------------------------------------------------------------
Obrázek 9: Pátý demonstrační příklad po vykreslení v POV-Rayi