Hlavní navigace

Grafická knihovna OpenGL (29): modulace textur

20. 1. 2004
Doba čtení: 7 minut

Sdílet

V dnešním pokračování seriálu o grafické knihovně OpenGL se budeme zabývat modulací textur, pomocí níž je možné kombinovat barvu vypočtenou osvětlovacím modelem s nanášenou texturou. Modulaci je však možné použít i pro různé další zajímavé grafické efekty, například změnu barvy textury.

Texturování 8 – modulace textur

Obsah

Motivace
Nastavení blendingu a modulace textur
Režimy výpočtu textur
Nanášení texelů bez dalších úprav
Blending na úrovni textur
Modulace textur
Demonstrační příklady
Pokračování
 

Motivace

Ve většině demonstračních příkladů v předchozích dílech seriálu (XXII, XXIII, XXIV, XXV, XXVI a XXVII), které se zabývaly texturováním, jsme předpokládali, že textura bude na vykreslovaný objekt nanesena přímo bez dalších modifikací rastrového obrazu textury. Jak jsme si však ukázali již v předchozím dílu, dají se barvy vykreslovaného objektu změnit pomocí blendingu, tj. vhodnou kombinací již dříve nakreslených objektů s objektem právě vykreslovaným.

S pomocí blendingu, vhodným nastavením funkcí paměti hloubky a změny polygon offsetu by bylo možné dokonce vykreslit tělesa, která jsou pokryta texturou a současně osvětlena. Toto řešení by však bylo poměrně pomalé, protože by se každý polygon musel vykreslit nejméně dvakrát – počet přístupů do framebufferu by byl dvakrát vyšší a tím pádem by se vykreslování značně zpomalilo.

OpenGL však podporuje modulaci textur. Pomocí modulace textur lze kombinovat texturu, která je na objekt nanášena, s barvou, která je buď přímo zadána jako vlastnost vykreslované plošky (příkaz glColor*()) nebo je vypočtena pomocí osvětlovacího modelu. Lze samozřejmě provádět i kombinaci textury s barevným přechodem.

Oproti výše uvedenému způsobu vykreslování povrchu těles za pomoci blendingu je modulace rychlejší, protože se do framebufferu zapisují pixely každé vykreslované plošky pouze jednou. Zejména u moderních grafických akcelerátorů, kde je limitujícím faktorem jejich výkonu přístup do paměti, znamená modulace značné urychlení vykreslování.

Nastavení blendingu a modulace textur

Nastavení blendingu textur nebo jejich modulace se v OpenGL provádí pomocí funkcí:

void glTexEnvf(
    GLenum  target,
    GLenum  pname,
    GLfloat param
);

void glTexEnvi(
    GLenum  target,
    GLenum  pname,
    GLint   param
);

popřípadě funkcemi, jejichž posledním parametrem je ukazatel na pole hodnot:

void glTexEnvfv(
    GLenum target,
    GLenum pname,
    const  GLfloat *params
);

void glTexEnviv(
    GLenum target,
    GLenum pname,
    const  GLint *params
);

Význam jednotlivých argumentů těchto funkcí:

  • Při volání všech uvedených funkcí se do argumentu target zadává cílový objekt, jehož parametry měníme. V případě textur se do tohoto argumentu vždy zadává symbolická konstanta GL_TEXTURE_ENV.
  • Argument pname může nabývat dvou hodnot, podle toho, jaké parametry texturování měníme. První hodnotou je GL_TEXTURE_EN­V_MODE, kdy v dalším parametru param specifikujeme mód výpočtu textur. Druhou hodnotou tohoto argumentu je symbolická konstanta GL_TEXTURE_EN­V_COLOR, kdy je dalším parametrem params zadávána barva použitá při blendingu (míchání) textur.
  • V posledním argumentu param resp. params jsou buď zadány režimy výpočtu textur, nebo barva použitá při blendingu textur.

Režimy výpočtu textur

Pomocí funkcí glTexEnvi() a glTexEnvf(), které jsou popsané v předchozím odstavci, je možné nastavit režim výpočtu textur, tj. způsob, jakým bude barva jednotlivých texelů textury kombinována s jinou barvou, získanou například pomocí osvětlovacího modelu. Nastavování se provede konkrétně tímto příkazem:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode); 

kde poslední argument mode může nabývat tří hodnot:

  1. GL_DECAL – jednotlivé texely budou nanášeny na vykreslovaný povrch bez dalších úprav. Tímto příkazem tedy zakazujeme jak blending, tak i modulaci textur. Více informací o tomto režimu je uvedeno ve čtvrtém odstavci.
  2. GL_BLEND – vykreslované texely jsou míchány s předem zadanou barvou. Více informací o tomto režimu je uvedeno v pátém odstavci.
  3. GL_MODULATE – vykreslované texely čtené z rastrové textury jsou modulovány podkladovou barvou. Více informací je uvedeno v šestém odstavci.

Při inicializaci aplikace, která pro vykreslování používá grafickou knihovnu OpenGL, je standardně nastaveno modulování textur (tj. GL_MODULATE) a míchací barva (GL_TEXTURE_EN­V_COLOR) pro blending je černá s nulovou alfa složkou, tj. (0, 0, 0, 0).

Při běhu aplikace je možné provést dotaz na aktuálně nastavený režim výpočtu textur. K tomuto účelu se používají funkce:

void glGetTexEnvfv(
    GLenum target,
    GLenum pname,
    GLfloat * params
);

void glGetTexEnviv(
    GLenum target,
    GLenum pname,
    GLint * params
);

Význam jednotlivých parametrů je stejný jako při zadávání režimu výpočtu, pouze s tím rozdílem, že poslední argumenty jsou určeny pro přepis.

Nanášení texelů bez dalších úprav

Pokud je texturování nastaveno do režimu GL_DECAL, jsou barvy texelů pro některé typy textur mapovány do jednotlivých fragmentů bez dalších úprav barevných složek.

Jestliže je však formát textury nastaven tak, že neobsahuje přímé barvy, jsou tyto barvy vypočteny buď na základě zadané intenzity či luminance (tj. textury ve stupních šedi), nebo se použije původní barva fragmentu (formát GL_ALPHA). Pokud je textura uložena v barevném modelu RGBA, je provedeno i míchání barev na základě alfa složky texelů.

Všechny popsané možnosti jsou vyjádřeny v následující tabulce:

Tabulka č. 535
Počet
barevných
komponent
Typ
komponent
Výpočet
barvy
1 GL_ALPHA C=Cf
A=At
1 GL_LUMINANCE C=Lt
A=Af
1 GL_INTENSITY C=It
A=It
2 GL_LUMINANCE_ALPHA C=Lt
A=At
3 GL_RGB C=Ct
A=Af
4 GL_RGBA C=(1-At)Cf+AtCt
A=At

Význam jednotlivých symbolů:
C – výsledná barva, jedná se o vektor C=(R, G, B)
Cf – barva fragmentu
Ct – barva texelu
A – vypočtená alfa složka
Af – alfa složka fragmentu
At – alfa složka texelu
Lt – luminance texelu

Blending na úrovni textur

V případě, že je povolen blending textur, tj. je zavolán příkaz
glTexEnvi(GL_TEX­TURE_ENV, GL_TEXTURE_EN­V_MODE, GL_BLEND), musí se specifikovat barva, se kterou se bude textura míchat. Pro zadání této barvy je možné použít funkce:
glTexEnviv(GL_TEX­TURE_ENV, GL_TEXTURE_EN­V_COLOR, color) resp.
glTexEnvfv(GL_TEX­TURE_ENV, GL_TEXTURE_EN­V_COLOR, color), kde color je ukazatel na čtyři hodnoty typu GLint neboGLfloat, které reprezentují barvu v barevném modelu RGBA. Pokud je blending vypnutý, nemá nastavená barva na vykreslovanou texturu samozřejmě žádný vliv.

Pokud je barva zadaná jako čtyři složky typu GLfloat, jsou tyto složky oříznuty do intervalu –1..1. Pokud se naopak použijí složky typu GLint, je interně proveden převod na GLfloat tak, aby byla nejvyšší hodnota typu GLint převedena na hodnotu 1.0 a nejnižší hodnota na –1.0.

Připomeňme si, že při zadávání rastrových dat textury pomocí funkce glTexImage() je v této funkci specifikováno, které složky barvy jsou v textuře použity. V případě, že je zadána pouze jedna složka, je považována za světlost (L – Luminance). Pokud jsou zadány složky dvě, jsou považovány za světlost následovanou průhledností alfa. Tři zadané složky představují barvový model RGB bez alfa kanálu, složky čtyři potom úplný model RGBA.

V následující tabulce je ukázáno, jak se vypočte vykreslovaná barva v režimu GL_BLEND v závislosti na počtu a typu barevných komponent:

Tabulka č. 536
Počet
barevných
komponent
Typ
komponent
Výpočet
barvy
1 GL_ALPHA není definováno
1 GL_LUMINANCE C=(1-Lt)Cf+LtCc
A=Af
1 GL_INTENSITY C=(1-It)Cf+ItCc
A=Af
2 GL_LUMINANCE_ALPHA C=(1-Lt)Cf+LtCc
A=AtAf
3 GL_RGB není definováno
4 GL_RGBA není definováno

Význam jednotlivých symbolů v tabulce:
C – výsledná barva, jedná se o vektor C=(R, G, B)
Cf – barva fragmentu
Cc – barva nastavená pomocí funkce glTexEnv*v()
Ct – barva texelu
A – vypočtená alfa složka
Af – alfa složka fragmentu
At – alfa složka texelu
Lt – luminance texelu

Modulace textur

Modulace textur přímo souvisí s blendingem. Barva vykreslovaných texelů totiž nemusí být jednoduše smíchána s barvou podkladu. Naopak lze s těmito barvami a jejich alfa složkami provádět i složitější operace. Tyto operace souhrnně nazýváme modulací textur, protože barvové složky texelů, které jsou nanášené na fragmenty, jsou násobeny barvami fragmentů, které jsou zase vypočteny například pomocí osvětlovacího modelu.

V následující tabulce je ukázáno, jak se vypočte vykreslovaná barva v režimu modulace textur v závislosti na počtu a typu barevných komponent:

Tabulka č. 537
Počet
barevných
komponent
Typ
komponent
Výpočet
barvy
1 GL_ALPHA C=Cf
A=At
1 GL_LUMINANCE C=LtCf
A=Af
1 GL_INTENSITY C=ItCf
A=Af
2 GL_LUMINANCE_ALPHA C=LtCf
A=AtAf
3 GL_RGB C=CtCf
A=Af
4 GL_RGBA C=CtCf
A=AtAf

Význam jednotlivých symbolů v tabulce:
C – výsledná barva, jedná se o vektor C=(R, G, B)
Cf – barva fragmentu
Ct – barva texelu
A – vypočtená alfa složka
Af – alfa složka fragmentu
At – alfa složka texelu
Lt – luminance texelu

Demonstrační příklady

Všechny dnešní demonstrační příklady používají pro vykreslování prakticky shodný kód, který se liší pouze v nastavení parametrů textur a osvětlení.

První příklad (obarvená verze): vykreslení tělesa s nanesenou texturou, ale se zakázaným osvětlením. Textura je zadána rastrovým RGBA obrázkem.

Screenshot z prvního demonstračního příkladu
Obrázek 1: Screenshot z prvního demonstračního příkladu

Druhý příklad (obarvená verze): vykreslení tělesa s nanesenou texturou a povoleným osvětlením. Textura je nanášena v režimu GL_DECAL, takže se vypočtené osvětlení na zobrazeném povrchu neprojeví.

Screenshot ze druhého demonstračního příkladu
Obrázek 2: Screenshot z druhého demonstračního příkladu

Třetí příklad (obarvená verze): vykreslení tělesa se zakázaným texturováním, ale s povoleným osvětlením.

Screenshot ze třetího demonstračního příkladu
Obrázek 3: Screenshot ze třetího demonstračního příkladu

Čtvrtý příklad (obarvená verze): vykreslení tělesa s nanesenou texturou i s povoleným osvětlením. Textura je nanášena v režimu GL_MODULATE, takže se vhodně zkombinuje s vypočteným světlem.

Screenshot ze čtvrtého demonstračního příkladu
Obrázek 4: Screenshot ze čtvrtého demonstračního příkladu

UX DAy - tip 2

Pokračování

Další díl, kterým ukončíme část zabývající se texturováním, bude věnován automatickému generování souřadnic do textur. Tato technika se používá například při environment mappingu, což je grafický efekt použitý ve filmu Terminátor II.

Pro majitele pomalejšího připojení k internetu je zde k dispozici celý článek i s přílohami zabalený do jednoho zip souboru.

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