PV112 – Programování grafických aplikací 9. přednáška – Operace s fragmenty, efekty, culling 0 Operace s fragmenty při vykreslování • Scissor test – Nejjednodušší operace, provádí ořezání fragmentů do obdélníka, který je specifikován pozicí, výškou a šířkou. Fragment mimo meze obdélníka je odstraněn. Scissor test • Specifikace oblasti pro ořezání: • Zapnutí scissor testu: • Vypnutí: • Dotaz na povolení či zakázání: • Dotaz na souřadnice ořezávacího obdélníka: Stencil test • Pro každý vykreslovaný fragment se porovnává hodnota ve stencil bufferu se zadanou referenční hodnotou • V závislosti na výsledku testu může být hodnota ve stencil bufferu změněna • Nastavení stencil testu: Stencil test • Parametry funkce glStencilFunc() jsou: – func – relační funkce – ref – referenční hodnota – mask – bitová maska, která se aplikuje na referenční hodnotu • func může nabývat hodnot: GL_NEVER – fragment bude vždy odstraněn GL_ALWAYS – fragment vždy projde do dalšího zpracování GL_LESS – přijmout, když (ref & mask) < (stencil & mask) GL_LEQUAL – přijmout, když (ref & mask) <= (stencil & mask) GL_EQUAL – přijmout, když (ref & mask) = (stencil & mask) GL_GREATER – přijmout, když (ref & mask) > (stencil & mask) GL_GEQUAL – přijmout, když (ref & mask) >= (stencil & mask) GL_NOTEQUAL – přijmout, když (ref & mask) <> (stencil & mask) Stencil test • Pomocí funkce glStencilOp(fail, zfail, zpass); se specifikuje, co se má stát s hodnotou ve stencil bufferu v případě, že: 1. test na šablonu fragment odmítne z dalšího zpracování 2. test na hloubku fragmentu bude neúspěšný 3. test na hloubku fragmentu bude úspěšný • Možné hodnoty všech tří parametrů této funkce jsou: – GL_KEEP – ponechat původní hodnotu – GL_ZERO – vynulovat hodnotu ve stencil bufferu – GL_INCR – inkrementace uložené hodnoty – GL_DECR – dekrementace uložené hodnoty – GL_INVERT – vynásobení konstantou –1 (inverze bitů) – GL_REPLACE – nastaví hodnotu ve stencil bufferu na ref specifikované funkcí glStencilFunc() Stencil test • Povolení: • Zakázání: • Dotaz na povolení či zakázání: • Získání parametrů stencil testu: Stencil test • Parametr mode může nabývat hodnot: – GL_STENCIL_FUNC – GL_STENCIL_REF – GL_STENCIL_VALUE_MASK – GL_STENCIL_FAIL – GL_STENCIL_PASS_DEPTH_FAIL – GL_STENCIL_PASS_DEPTH_PASS Depth test • Relační funkci nastavujeme: – Parametr func může nabývat hodnot: GL_NEVER – fragment bude vždy odstraněn GL_ALWAYS – fragment vždy projde do dalšího zpracování GL_LESS – přijmout, když Zfragmentu < Zbufferu – standardní nastavení GL_LEQUAL – přijmout, když Zfragmentu <= Zbufferu GL_EQUAL – přijmout, když Zfragmentu = Zbufferu GL_GREATER – přijmout, když Zfragmentu > Zbufferu GL_GEQUAL – přijmout, když Zfragmentu >= Zbufferu GL_NOTEQUAL – přijmout, když Zfragmentu <> Zbufferu Depth test • Povolení: • Zakázání: • Dotaz na povolení či zakázání: Blending • Výpočet výsledné barvy závisí na nastavené míchací funkci: • Povolení: • Zakázání: • Dotaz na povolení či zakázání blendingu: Dithering • Prováděn za účelem zdánlivého přidání počtu barev do zobrazované scény • Povolení: • Zakázání: • Dotaz na stav: Dithering • Příklad vytvoření šedé barvy Maskování zápisu do bufferů – logické operace • Při zápisu do jednotlivých bufferů se mohou provádět bitové nebo logické operace mezi zapisovanými daty a předem zadanou hodnotou • Logické operace jsou aplikovány na hodnoty příchozích fragmentů (source) a hodnoty fragmentů ve fragmentovém bufferu (destination). Maskování zápisu do bufferů – logické operace • Pro každý typ bufferů z framebufferu je určena jedna z následujících funkcí: Maskování zápisu do bufferů • Při zápisu do barevných bufferů je každá barevná složka buď zapsána nebo nezapsána • Nastavení příznaku zapsání pomocí Maskování zápisu do bufferů • Pro paměť hloubky lze nastavit příznak, zda se má či nemá fragment zapsat, pomocí funkce: • Pro paměť šablony lze operací and nulovat jednotlivé bity: Maskování zápisu do bufferů • Inicializace: glColorMask(GLtrue, GLtrue, GLtrue, GLtrue); glDepthMask(GLtrue); glStencilMask((GLuint)~0); Další efekty • Bump mapping • Skinning Bump mapping Bump mapping • Nutné znát normálovou mapu = textura, která se aplikuje na každý fragment obsahující základní texturu • Normálová mapa může být odvozena z výškové mapy základní textury Bump mapping Bump mapping • Převod na normálovou mapu Bump mapping • Normály jsou škálovány a posunuty do rozsahu [0, 255] • Čtení z normálové mapy vec3 normal = texture(myNormalMap, texcoord.st).xyz * 2.0 – 1.0; • Problém – rozdílný souřadný systém oproti vektoru světla, nutné unifikovat – detaily lze dohledat v literatuře Bump mapping Skinning • Čeho chceme dosáhnout? https://www.youtube.com/watch?v=9xX7OotZ3P0 • Jak? – Transformací pozic vrcholů a normál meshe na základě matice reprezentující animaci kostí, ke kterým jsou vrcholy přiřazeny pomocí vah Culling • View frustum culling • Portal culling Culling • Detail culling (LOD) View frustum culling • Ořezávání podle pohledového objemu View frustum culling • Objekty mimo pohledový objem nemá smysl vykreslovat Portal culling • Rozdělení scény na buňky obsahující portály • Pro každou buňku je spočtena potenciálně viditelná sada buněk – Ty je třeba vykreslit v případě, že je pozorovatel do příslušné buňky umístěn Detail culling • Level of detail technika • Na základě vzdálenosti od pozorovatele přidává nebo odebírá detaily