Hlavní navigace

Průhlednost a poloprůhlednost při texturování

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

Sdílet

V dnešní části našeho seriálu o raytraceru POV-Ray se budeme věnovat principům použití průhlednosti a poloprůhlednosti při práci s procedurálními i rastrovými texturami. Jedná se o techniku používanou například při vykreslování těles obsahujících ve svém povrchu otvory, skleněné části a podobně.

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é:

povray2101

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.

povray2102

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

povray2103

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

povray2104

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.

povray2105

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ý).

povray2106

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
// ------------------------------------------------------------ 
povray2107

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é pi­xely

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.

povray2108

Obrázek 8: Textura pro pátý demonstrační příklad

skoleni

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
// ------------------------------------------------------------ 
povray2109

Obrázek 9: Pátý demonstrační příklad po vykreslení v POV-Rayi

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.