27. listopadu 2013, Brno Připravil: David Procházka Texturování Počítačová grafika 2
Obsah přednášky Strana 2 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Obsah přednášky Strana 3 / 37 Obsah přednášky Dnes se naučíme jak se vytváří textury a jakým způsobem je můžeme aplikovat na objekty ve scéně.
Texturování Strana 4 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Texturování Strana 5 / 37 Textura Textura je v případě OpenGL matice přirozených čísel. U 2D textury je to např. GLubyte texture[texturewidth][textureheight][4]. Poslední parametr představuje RGBA komponenty. OpenGL přímo nepodporuje načítání PNG/JPEG, atp. Od toho jsou různé nástavby a samozřejmě vlastní kód.
Texturování Strana 6 / 37 Obecný postup texturování 1 Vytvořím (nahraji) texturu. 2 Informuji OpenGL o uložení bytů v textuře (glpixelstorei). 3 Vytvořím texturovací objekt, např.: glgentextures(1, &texturename); glbindtexture(gl TEXTURE 2D, texturename); 4 Nastavím chování textury (gltexparameter*). 5 Nahraji data do aktuálního texturovacího objektu (glteximage*d). 6 Zapnu texturování (glenable(gl TEXTURE *D)) 7 Zvolím metodu aplikace textury (gltexenv*).
Texturování Strana 7 / 37 2D textura Definice 2D textury void glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei w, GLsizei h, GLint border, GLenum format, GLenum type, const GLvoid *texels) target budeme nastavovat na GL TEXTURE 2D, level specifikace úrovně textury u mipmapy, jinak 0, internalformat struktura dat v tex. obj. (např. GL RGB), width šířka specifikované textury, height výška specifikované textury, border zastaralý parametr, nastavit na 0, format formát dat v předávaném poli (např. GL RGB), type typ předávaných hodnot (např. GL UNSIGNED BYTE), texels pole s definovanými hodnotami.
Texturování Strana 8 / 37 Možné hodnoty parametrů internalformat: GL RGB, GL RGBA, GL RGB8, GL RGBA8, GL RGBA32F, GL DEPTH COMPONENT. format: GL RGB, GL RGBA, GL BGR, GL BGRA, GL RED, GL GREEN, GL BLUE, GL ALPHA, GL DEPTH COMPONENT. type: GL UNSIGNED BYTE, GL BITMAP, GL BYTE, GL UNSIGNED SHORT, GL SHORT, GL UNSIGNED INT, GL INT, GL HALF FLOAT, GL FLOAT, GL UNSIGNED BYTE 3 3 2 (8-bit integer, R3, G3, B2), aj.
Texturování Strana 9 / 37 3D textura Definice 3D textury void glteximage3d(glenum target, GLint level, GLint internalformat, GLsizei w, GLsizei h, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *texels) Stejné významy jako u 2D. depth hloubka (třetí rozměr matice).
Texturování Strana 10 / 37 Umístění textury na objekt Existuje příkaz gltexcoord, který umožňuje připojení textury k vrcholu objektu v im. mode. U VBO však rozšíříme pouze definici vrcholu o souřadnice textury a aktivujeme příslušné pole. 1 struct Vertex { 2 GLint position [ 3]; 3 GLfloat color [ 3]; 4 GLfloat normal [ 3]; 5 GLfloat texturecoord [ 2]; 6 }; 7... 8 static Vertex vertices [] = { 9 {{0,0,0}, {1.0, 0.0, 0.0}, {0,0, -1}, {0.0,0.0}},... 10... 11 gltexcoordpointer (2, GL_FLOAT, sizeof ( Vertex ), ( void *) 12 glenableclientstate ( GL_TEXTURE_COORD_ARRAY );
Texturování Strana 11 / 37 Souřadnice textury 2D textura je dána čtveřicí bodů, které představují její vrcholy. 2D textura má bod [0,0] v levém dolním rohu a [1,1] v pravém horním rohu. Souřadnice vrcholů tedy nabývají hodnot 0 a 1. Pokud použijeme vyšší číslo, znamená to, že se bude textura opakovat (2 = 2x). Souřadnice textur jsou označovány písmeny s, t, r a q.
Texturování Strana 12 / 37 Transformace textury Na texturu lze aplikovat maticové operace transformační maticí 4x4 glmatrixmode(gl TEXTURE). Transformace se aplikují ještě před nanesením na objekt. Lze také použít maticový zásobník glpushmatrix() a glpopmatrix().
Texturování Strana 13 / 37 Nastavení umístění textury Umístění textury void gltexparameter{i f}[v](glenum target, GLenum name, TYPE param) target bude v našem případě GL TEXTURE 2D, name je volba strany (šířka (s), výška (t), hloubka (r)) GL TEXTURE WRAP S, GL TEXTURE WRAP T, GL TEXTURE WRAP R, param je GL CLAMP TO EDGE (přichytit), GL REPEAT (opakovat), GL MIRRORED REPEAT (opakovat zrcadlově).
Texturování Strana 14 / 37 Filtrování textury Filtrování textury (stejný příkaz jako u mapování) void gltexparameter{i f}[v](glenum target, GLenum name, TYPE param) Problém: Texely a pixely objektu obvykle nejsou stejně velké, je nutný přepočet. name param GL TEXTURE MAG FILTER GL NEAREST, GL LINEAR GL TEXTURE MIN FILTER GL NEAREST, GL LINEAR GL NEAREST MIPMAP NEAREST GL NEAREST MIPMAP LINEAR GL LINEAR MIPMAP NEAREST GL LINEAR MIPMAP LINEAR
Texturování Strana 15 / 37 Filtrování textury vysvětlení parametrů GL TEXTURE MAG FILTER co dělat při zvětšení. GL TEXTURE MIN FILTER co dělat při zmenšení. GL NEAREST nejbližší soused (rychlé). GL LINEAR lineární interpolace (pěkné). Uvedené varinaty jsou jedniné možné, pokud nepoužíváme mipmapy. Výchozí nastavení pro GL TEXTURE MIN FILTER je GL NEAREST MIPMAP LINEAR je potřeba mít nagenrovánu mipmapu, jinak se textura nezobrazí!
Multum In Parvo Strana 16 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Multum In Parvo Strana 17 / 37 Multum In Parvo Při zmenšování textur dochází k nepříjemným artefaktům, moiré, atp. Lineární interpolace problém částečně reší, ale výrazně ovlivňuje výkon. Lze používat FSAA Full Scene AntialiAsing, nicméně také spomaluje (nastavení grafiky). Řešením je uložení textury ve více rozlišeních - MIP mapa. Zmenšené verze textury jsou vždy čtvrtinové velikosti. Pro jejich ukládání používáme parametr level u glteximage2d(). Práce s MIP mapami je označována jako práce s Level Of Detail (LOD). Aby nedocházelo ke skokovité změně velikosti, tak se interpolují hodnoty mezi vygenerovanými velikostmi.
Multum In Parvo Strana 18 / 37 Multum In Parvo obrázek
Multum In Parvo Strana 19 / 37 MIP mapa příklad uložení textur do TO 1 glteximage2d ( GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB, 2 GL_ UNSIGNED_ BYTE, texture0 ); 3 glteximage2d ( GL_TEXTURE_2D, 1, 3, 32, 32, 0, GL_RGB, 4 GL_ UNSIGNED_ BYTE, texture1 ); 5 glteximage2d ( GL_TEXTURE_2D, 2, 3, 16, 16, 0, GL_RGB, 6 GL_ UNSIGNED_ BYTE, texture2 ); 7 glteximage2d ( GL_TEXTURE_2D, 3, 3, 8, 8, 0, GL_RGB, 8 GL_ UNSIGNED_ BYTE, texture3 ); 9 glteximage2d ( GL_TEXTURE_2D, 4, 3, 4, 4, 0, GL_RGB, 10 GL_ UNSIGNED_ BYTE, texture4 ); 11 glteximage2d ( GL_TEXTURE_2D, 5, 3, 2, 2, 0, GL_RGB, 12 GL_ UNSIGNED_ BYTE, texture5 ); 13 glteximage2d ( GL_TEXTURE_2D, 6, 3, 1, 1, 0, GL_RGB, 14 GL_ UNSIGNED_ BYTE, texture6 );
Multum In Parvo Strana 20 / 37 MIP mapa uložení do jednoho souboru
Multum In Parvo Strana 21 / 37 Multum In Parvo automatické generování Automatické generování textur do MIP mapy int glubuild2dmipmaps(glenum target, GLint internalformat, GLint width, GLint height, GLenum format, GLenum type, void *texels) Vytvoří automaticky hierarchii MIP map a zavolá glteximage2d(). Parametry mají stejný význam jako u glteximage2d. Existují i varianty pro 1D a 3D (+ height). Vrací 0 v případě úspěchu.
Multum In Parvo Strana 22 / 37 Multum In Parvo filtrace GL NEAREST MIPMAP NEAREST vybrán nejbližší texel z nejbližší větší nebo menší textury. Nejrychlejší, ale nejhorší. GL NEAREST MIPMAP LINEAR vybrány dva nejbližší texely z obou textur a lineární interpolace. Odstraní skokové změny v obraze při výběru jiné dvojice textur z mipmapy. GL LINEAR MIPMAP NEAREST billineární interpolaci nejbližších texelů v jedné textuře. Při zmenšování nebo zvětšování tělesa mohou nastat skokové změny. GL LINEAR MIPMAP LINEAR interpolace pro výpočet barev texelů v obou texturách a poté se výsledná barva spočte další interpolací. Nejlepší.
Modulace textury ve fixed pipeline Strana 23 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Modulace textury ve fixed pipeline Strana 24 / 37 Modulace textury Nastavení modulace textury void gltexenv{if}(glenum taget, GLenum pname, TYPE param) nastaví aktuální texturovací funkci. Význam parametrů je popsán v tabulce níže. Přípustné jsou uvedené kombinace parametrů + některé další. target pname param GL TEXTURE ENV GL TEXTURE ENV MODE GL DECAL GL REPLACE GL MODULATE GL BLEND GL ADD GL COMBINE GL TEXTURE ENV COLOR RGBA pole pro blend
Modulace textury ve fixed pipeline Strana 25 / 37 Nastavení modulace textury parametry GL DECAL texely budou nanášeny na vykreslovaný povrch bez úprav. GL BLEND vykreslované texely jsou míchány s předem zadanou barvou. Musíme definovat barvu. GL MODULATE vykreslované texely čtené z rastrové textury jsou modulovány podkladovou barvou.
Modulace textury v shaderu Strana 26 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Modulace textury v shaderu Strana 27 / 37 Textura v shaderu Záleží pouze na tom, jak texturu přičteme k původní barvě povrchu. Lze: přičítat, násobit, přepsal... 1 # version 130 2 uniform sampler2d texture0 ; 3 in vec2 texcoord0 ; 4 out vec4 outcolor ; 5 6 int main ( void ){ 7... 8 color = ambient +( diffuse + specular )* attenuation ; 9 outcolor = color * texture ( texture0, texcoord0. st ); 10 }
Multitexturování Strana 28 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Multitexturování Strana 29 / 37 Mutitexturování V OpenGL lze pracovat s více, než jednou text. jednotkou. To umožní kombinování textur na povrch objektů. Následně stačí na úrovni shaderu kombinovat hodnoty textur podle potřeby: 1 # version 130 2 uniform sampler2d texture0 ; 3 uniform sampler1d texture1 ; 4 in vec4 color ; 5 in vec2 texcoord0 ; 6 in float texcoord1 ; 7 out vec4 outcolor ; 8 9 void main ( void ) { 10 outcolor = color * texture ( texture0, texcoord0. st) 11 * texture ( texture1, texcoord1.s) 12 }
Multitexturování Strana 30 / 37 Aktivace více text. jednotek 1 // aktivace vice texturovacich jednotek 2 glactivetexture ( GL_ TEXTURE0 ); 3 glbindtexture ( GL_ TEXTURE_ 2D, m_ grasstexid ); 4 5 glactivetexture ( GL_ TEXTURE1 ); 6 glbindtexture ( GL_ TEXTURE_ 1D, m_ heighttexid ); 7 8... 9 // odeslani vice textur do shaderu 10 m_glslprogram -> senduniform (" texture0 ", 0); 11 m_glslprogram -> senduniform (" texture1 ", 1); Počet dostupných text. jednotek je dobré testovat pomocí: 1 int maxunits ; 2 glgetintegerv ( GL_ MAX_ TEXTURE_ UNITS, & maxunits );
Průhlednost Strana 31 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Kompletní seznam možností viz specifikace. Pro nás důležité: GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA Průhlednost Strana 32 / 37 Blending Blending umožňuje tvorbu průhledných povrchů. Aktivujeme pomocí: glenable(gl BLEND); Následně musíme vybrat metodu míchání původní barvy pixelu ve framebufferu s novou: glblendfunct(); void glblendfunct(glenum sf, GLenum df) Uvedené parametry představují source a destination factor. Tj. čísla mezi 0 a 1, kterými se násobí nová, resp. původní barva. Source je obvykle označována nová barva, destination hodnota již uložená v frame bufferu.
Průhlednost Strana 33 / 37 Alpha testing Někdy je vhodné zcela průhledné části objektů vypustit (díry v plotu) Ve fragment shaderu lze snadno testovat, zda daný pixel vůbec do f.b. vykreslovat: 1 # version 130 2 uniform sampler2d texture0 ; 3 in vec2 texcoord0 ; 4 out vec4 outcolor ; 5 6 int main ( void ){ 7 outcolor = texture ( texture0, texcoord0. st ); 8 if ( outcolor.a <0.1){ 9 discard ; 10 } 11 }
Průhlednost Strana 34 / 37 Neúplná průhlednost
Shrnutí Strana 35 / 37 Obsah přednášky 1 Obsah přednášky 2 Texturování 3 Multum In Parvo 4 Modulace textury ve fixed pipeline 5 Modulace textury v shaderu 6 Multitexturování 7 Průhlednost 8 Shrnutí
Shrnutí Strana 36 / 37 Rady glhint(gl PERSPECTIVE CORRECTION HINT, GL NICEST); nastavuje kvalitu interpolace (jiné volby GL DONT CARE a GL FASTEST)
Shrnutí Strana 37 / 37 Kontrolní otázky Co je to texturovací objekt? Pokud má textura velikost 128x128, jaké budou velikosti jejích mipmap? Jaký je výchozí mód přepočtu velikosti při aplikaci textur?