NPGR019. Geometry & tessellation shaders. MFF UK Praha. Vykreslování v OpenGL Tessellation shaders Geometry shaders Literatura

Podobné dokumenty
Připravil: David Procházka. Vykreslování grafických primitiv

Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

Základy programování shaderů v OpenGL Část 2 - přenos dat

Android OpenGL. Práce s texturami

Základy programování shaderů v OpenGL Část 2 - přenos dat

Připravil: David Procházka. Vertex Buffer Objects

Programování shaderů GLSL

Fakulta informačních technologíı. Rendering Seminář 1. 1 / 28

Připravil: David Procházka. Shadery

Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky. GLSL editor

27. listopadu 2013, Brno Připravil: David Procházka

Připravil: David Procházka. Základy OpenGL

DEMONSTRAČNÍ APLIKACE PRO DISPLACEMENT MAPPING A ANALÝZU VÝKONNOSTI OPENGL PI- PELINE

Programování grafiky ÚVOD

TAM. Prezentace přednášek. Ústav počítačové grafiky a multimédií

Základy OpenGL Josef Pelikán CGG MFF UK Praha. OpenGL / 34

Programování grafiky ÚVOD

Hardware pro počítačovou grafiku NPGR019

Textury. Petr Felkel, Jaroslav Sloup a Vlastimil Havran

Nvidia CUDA Paralelní programování na GPU

Reflections, refractions, interreflections

Základy 3D modelování a animace v CGI systémech Cinema 4D C4D

Co je grafický akcelerátor

Pokročilé osvětlovací techniky Josef Pelikán, MFF UK Praha

Hierarchický model Josef Pelikán CGG MFF UK Praha. 1 / 16

Textury v real-time grafice Josef Pelikán, MFF UK Praha Josef.Pelikan@mff.cuni.cz

Android OpenGL. Pokročilé shadery

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

GIS Geografické informační systémy

GIS Geografické informační systémy

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

GIS Geografické informační systémy

1. Programování proti rozhraní

Návod k použití softwaru Solar Viewer 3D

Transformace (v OpenGL) příklady a knihovna GLM

Masivně paralelní zpracování obrazu v prostředí systému VisionLab Liberec Roman Cagaš, rc@mii.cz

Základy programování shaderů v OpenGL část 1 program

Rád bych poděkoval Ing. Davidu Ambrožovi za jeho cenné rady a připomínky a za ochotu po celou dobu vedení mé diplomové práce.

Programovatelné shadery a jazyk Cg. Petr Kmoch

Pokročilé programování v jazyce C pro chemiky (C3220) 3D grafika v knihovně Qt

Konstruktory a destruktory

3D počítačová grafika na PC Josef Pelikán, MFF UK Praha

STŘEDOŠKOLSKÁ ODBORNÁ ČINNOST

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

PB161 Programování v jazyce C++ Přednáška 9

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Geometrické praktikum

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

ADT/ADS = abstraktní datové typy / struktury

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Realtime zobrazování vodní hladiny na dnešních GPU. Jan Horáček

Matematický ústav UK Matematicko-fyzikální fakulta

Reprezentace 3D scény

Geografická informace GIS 1 155GIS1. Martin Landa Lena Halounová. Katedra geomatiky ČVUT v Praze, Fakulta stavební 1/23

Programování v C++ 2, 4. cvičení

Objektově orientované programování

Programátorská dokumentace

Zobrazování těles. problematika geometrického modelování. základní typy modelů. datové reprezentace modelů základní metody geometrického modelování

Zobrazování terénů pomocí GPU

Pokročilé architektury počítačů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ

Základní datové struktury

1. Dědičnost a polymorfismus

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Matematický ústav UK Matematicko-fyzikální fakulta

Zobrazování terénu. Abstrakt. 1. Úvod. 2. Vykreslování terénu

SOFTWARE NA ZPRACOVÁNÍ MRAČEN BODŮ Z LASEROVÉHO SKENOVÁNÍ. Martin Štroner, Bronislav Koska 1

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

Generické programování

Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky. haptického pera

Rastrová reprezentace

Reprezentace 3D modelu

HDR obraz (High Dynamic Range)

Kristýna Bémová. 13. prosince 2007

Rastrové digitální modely terénu

Výpočet průsečíků paprsku se scénou

ak. rok 2013/2014 Michal Španěl,

Hardware pro počítačovou grafiku NPGR019

Úvod do GPGPU J. Sloup, I. Šimeček

Více o konstruktorech a destruktorech

Úvod do GIS. Prostorová data I. část. Pouze podkladová prezentace k přednáškám, nejedná se o studijní materiál pro samostatné studium.

Základy objektové orientace I. Únor 2010

GPU A CUDA HISTORIE GPU CO JE GPGPU? NVIDIA CUDA

8. přednáška z předmětu GIS1 Rastrový datový model a mapová algebra

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Grafické karty. Autor: Kulhánek Zdeněk

Geekovo Minimum. Počítačové Grafiky. Nadpis 1 Nadpis 2 Nadpis 3. Božetěchova 2, Brno

Bakalářská práce Editor vizuálních vlastností objektů pro real-time grafiku

Základní vlastnosti křivek

Studentská tvůrčí a odborná činnost STOČ D MODELY STROMŮ PRO VYUŽITÍ V REAL-TIME APLIKACI. Michaela Brázdilová

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Mezi jednotlivými rozhraními resp. na nosníkových prvcích lze definovat kontakty

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

ALGORITMIZACE PRAKTICKÉ

Principy UML. Clear View Training 2005 v2.2 1

3D akcelerátory historie a architektura

Jazyk C++, některá rozšíření oproti C

3D ANIMACE POSTAVY V POČÍTAČOVÉ GRAFICE ANIMATION OF 3D CHARACTER IN COMPUTER GRAPHICS

Transkript:

Hardware pro počítačovou grafiku NPGR019 Geometry & tessellation shaders Jan Horáček http://cgg.mff.cuni.cz/ MFF UK Praha 2012 Jan Horáček Geometry & Tesselation 1 / 42

Obsah Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva 1 2 3 4 Jan Horáček Geometry & Tesselation 2 / 42

Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva Propojení vertex shaderu s geometrickými daty vertexová data (pozice, tex. koordináty, normály... ) vstupují do OpenGL pipeline přes vertex shader je nutné spojit zdroj vertexových dat s proměnnou v shaderu proto je potřeba znát pozici atributu pozice atributu může být explicitně definovaná použitím kvalifikátoru layout explicitně definovaná funkcí glbindattriblocation() zjištěna automatická pozice voláním glgetattriblocation() Jan Horáček Geometry & Tesselation 3 / 42

Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva Propojení vertex shaderu s geometrickými daty data v oddělených částech VBO data jednoho typu spojitě jako pole #define BUFFER_OFFSET(addr) ((GLvoid*) (addr)) GLsizeiptr offset = 0; glvertexattribpointer( vpos, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset) ); offset += sizeof(v); glvertexattribpointer( vcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, BUFFER_OFFSET(offset) ); offset += sizeof(c); glvertexattribpointer( vtexcoord, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset) ); Jan Horáček Geometry & Tesselation 4 / 42

Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva Propojení vertex shaderu s geometrickými daty data prokládána ve VBO data jako struktury ve VBO GLsizei stride = sizeof( VertexData ); GLsizeiptr offset = 0; struct VertexData { GLfloat tc[2]; GLubyte c[4]; GLfloat v[3]; } glvertexattribpointer( vtexcoord, 2, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(offset) ); offset += sizeof(v.tc); glvertexattribpointer( vcolor, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, BUFFER_OFFSET(offset) ); offset += sizeof(v.c); glvertexattribpointer( vpos, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(offset) ); Jan Horáček Geometry & Tesselation 5 / 42

Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva Propojení vertex shaderu s geometrickými daty je potřeba oznámit OpenGL, která vertexová pole budou použita glenablevertexattribarray( vpos ); glenablevertexattribarray( vcolor ); glenablevertexattribarray( vtexcoord ); Jan Horáček Geometry & Tesselation 6 / 42

Vykreslování geometrických primitiv Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva pro spojité pole vertexů (po částech i prokládané) gldrawarrays( GL_TRIANGLE_STRIP, 0, n ); 0 v c tc 1 2 v c tc v c tc 1 3 5 3 v c tc 4 v c tc 0 2 4 5 v c tc Jan Horáček Geometry & Tesselation 7 / 42

Vykreslování geometrických primitiv Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva pro indexované skupiny vertexů gldrawelements( GL_TRIANGLE_STRIP, n, GL_UNSIGNED_SHORT, BUFFER_OFFSET(offset) ); 0 v c tc 1 v c tc 2 v c tc 3 v c tc 4 v c tc 5 v c tc 0 1 2 3 1 15 3 16 15 16 17 1 3 5 0 2 4 Jan Horáček Geometry & Tesselation 8 / 42

Instancované vykreslování Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva posílání vícekrát stejné geometrie do OpenGL každá iterace je nová instance vertex shader může měnit vykreslování v závislosti na tom, která instance se zrovna vykresluje číslo iterace uloženo v GLSL proměnné gl_instanceid gldrawarraysinstanced( GL_TRIANGLE_STRIP, 0, n, 10 ); gldrawelementsinstanced( GL_TRIANGLE_STRIP, n, GL_UNSIGNED_INT, BUFFER_OFFSET(0), 10 ); Jan Horáček Geometry & Tesselation 9 / 42

Variace na gldrawelements() Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva občas se hodí přidat offset k seznamu vykreslovanému přes gldrawelements() toto umožňuje použít stejnou topologii pro různou geometrii všechny gldrawelements() varianty mají i verzi pro offset gldrawelementsbasevertex() gldrawrangeelementsbasevertex() gldrawelementsinstancedbasevertex() stejné parametry, pouze je zde navíc jeden parametr určující offset gldrawelementsbasevertex( GL_TRIANGLES, 0 GL_UNSIGNED_INT, BUFFER_OFFSET(offset), 15 ); Jan Horáček Geometry & Tesselation 10 / 42

Nepřímé vykreslování Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva parametry pro volání gldrawarraysinstanced() se dají uložit do GL_DRAW_INDIRECT_BUFFER data musí mít pevnou strukturu struct DrawArraysIndirectCommand { GLuint count; GLuint primcount; GLuint first; GLuint reservedmustbezero; }; // volání gldrawarraysindirect( primtype, BUFFER_OFFSET(offset) ); toto je připraveno pro budoucí způsoby vykreslování například dynamicky vytvářená geometrie Jan Horáček Geometry & Tesselation 11 / 42

Nepřímé vykreslování Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva podobně existuje i verze pro indexované vykreslování gldrawelementsindirect() struktura pro gldrawelementsindirect() struct DrawElementsIndirectCommand { GLuint count; GLuint primcount; GLuint firstindex; GLint basevertex; GLuint reservedmustbezero; }; Jan Horáček Geometry & Tesselation 12 / 42

Geometrická primitiva I Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva v 0 v 0 v 0 v 0 v 1 v 1 v 1 v 1 v 2 v 3 v 2 v 3 v 2 v 3 v 2 v 3 v 4 v 5 v 4 v 5 v 4 v 5 v 5 v 4 GL POINTS GL LINES GL LINE STRIP GL LINE LOOP Jan Horáček Geometry & Tesselation 13 / 42

Geometrická primitiva II Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva v 0 v 0 v 1 v 1 v 1 v 2 v 2 v 3 v 2 v 3 v 0 v 3 v 4 v 5 GL TRIANGLES v 4 v 5 GL TRIANGLE STRIP v 5 v 4 GL TRIANGLE FAN Jan Horáček Geometry & Tesselation 14 / 42

Geometrická primitiva III Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva v 6 v 5 v 6 v 5 v 7 v 4 v 7 v 4 v 0 v 1 v 2 v 3 v 0 v 1 v 2 v 3 GL LINES ADJACENCY GL LINE STRIP ADJACENCY Jan Horáček Geometry & Tesselation 15 / 42

Geometrická primitiva IV Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva v 5 v 0 v 5 v 9 v 1 v 2 v 6 v 10 v 4 v 1 v 3 v 2 GL TRIANGLES ADJACENCY v v v 4 0 v 11 8 v 3 v 7 GL TRIANGLE STRIP ADJACENCY Jan Horáček Geometry & Tesselation 16 / 42

Geometrická primitiva V Propojení Vykreslování Instancované a nepřímé vykreslování Geometrická primitiva?gl PATCHES Jan Horáček Geometry & Tesselation 17 / 42

Obsah Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader 1 2 3 4 Jan Horáček Geometry & Tesselation 18 / 42

Detaily scény Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader teselace se dá považovat za další krok v přidávání detailů do scény historicky: 1 jednobarevné a gouraudově stínované polygony - holé objekty 2 textury - barevný detail 3 bumpmapping (ve všech formách od emboss-bumpmappingu až po normalmapping/procedurální generování normál) - detail pro stínování, obzvláště dynamická světla 4 parallax mapping - falešný geometrický detail 5 teselace - skutečný geometrický detail toto je ovšem pouze jedno z možných využití teselace Jan Horáček Geometry & Tesselation 19 / 42

Přehled Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader teselace se využívá ke generování geometrie pouze jeden typ primitiv - patches do gldraw*() se uvede konstanta GL_PATCHES 3 fáze: 1 konfigurovatelná, 2 programovatelné pomocí shaderů tessellation control shader zpracovává sadu vstupních vertexových atributů generuje výstupní patchové atributy definuje teselační parametry tessellation evaluation shader zpracovává výstupní patchové atributy počítá finální vertexy generovaných primitiv Jan Horáček Geometry & Tesselation 20 / 42

OpenGL pipeline Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader Vertex data Vertex Shader Tesselation Control Shader Tesselation Evaluation Shader Geometry Shader Primitive Setup and Rasterization Fragment Shader Blending Pixel Data Texture Store Jan Horáček Geometry & Tesselation 21 / 42

Tok dat v teselační části pipeline Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader layout(vertices = n) out; gl_in[] Tesselation Control Shader gl_out[] gl_in[] Tesselation Evaluation Shader layout(prim, wind, spc) in; Vertex data Vertex Shader gl_tesslevelnner[] gl_tesslevelouter[] Tesselation Primitive Generator Jan Horáček Geometry & Tesselation 22 / 42

Tok dat v teselační části pipeline Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader teselační shadery pracují na sadách vrcholů vstupní i výstupní data jsou v poĺıch proměnná gl_in[] obsahuje vstupní data pro oba shadery délka pole = gl_in.length() proměnná gl_out[] má přepočítané informace o vrcholech obě jsou pole struktur in gl_pervertex { vec4 gl_position; float gl_pointsize; vec4 gl_clipdistance[]; } gl_in[]; Jan Horáček Geometry & Tesselation 23 / 42

Tesselation control shader Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader výstupní layout vertices specifikuje počet výstupních vertexů control shader spuštěn pro každý výstupní vertex vstupem i výstupem patch má přístup ke všem vstupním atributům smí zapisovat jen do svého výstupu podle gl_invocationid základní úkol je připravit parametry pro teselaci a přepočítat patch Jan Horáček Geometry & Tesselation 24 / 42

Příklad tessellation control shaderu Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader tessellation control shader #version 400 core layout (vertices = 4) out; uniform float Inner; uniform float Outer; void main() { gl_tesslevelinner[0] = Inner; gl_tesslevelinner[1] = Inner; gl_tesslevelouter[0] = Outer; gl_tesslevelouter[1] = Outer; gl_tesslevelouter[2] = Outer; gl_tesslevelouter[3] = Outer; } gl_out[gl_invocationid].gl_position = gl_in[gl_invocationid].gl_position; Jan Horáček Geometry & Tesselation 25 / 42

Tessellation control bez shaderu Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader mnoho programů pouze přeposílá data v případě, že vstupní a výstupní patch mají stejný počet vertexů, může OpenGL tuto stage nahradit 1 specifikuj počet vertexů ve vstupní patch glpatchparameteri( GL_PATCH_VERTICES, NumVertices ); 2 specifikuj vnitřní a vnější teselační parametry GLfloat outer[4], inner[2]; glpatchparameterfv( GL_PATCH_DEFAULT_OUTER_LEVEL, outer ); glpatchparameterfv( GL_PATCH_DEFAULT_INNER_LEVEL, inner ); Jan Horáček Geometry & Tesselation 26 / 42

Generování primitiv Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader teselace vytváří geometrická primitiva rozdělením parametrického prostoru k dispozici jsou tři typy parametrizací Typ Parametrický prostor Teselační faktory quad triangle isolines jednotkový čtverec: (u, v) gl_tesslevelinner: 0... 1 u, v [0, 1] gl_tesslevelouter: 0... 3 barycentrické: (u, v, w) gl_tesslevelinner: 0 u, v, w [0, 1] gl_tesslevelouter: 0... 2 u + v + w = 1 čára: (u, v) u, v [0, 1] gl_tesslevelouter: 0... 1 u se na čáře mění, v je konstantní Jan Horáček Geometry & Tesselation 27 / 42

Příklad teselace čtyřúhelníku Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader gl_tesslevelouter[3] (1,1) parametry gl_tesslevelinner[0] = 3.0; gl_tesslevelinner[1] = 4.0; gl_tesslevelouter[0] = 3.0; gl_tesslevelouter[1] = 4.0; gl_tesslevelouter[2] = 2.0; gl_tesslevelouter[3] = 3.0; gl_tesslevelouter[0] gl_tesslevelinner[0] gl_tesslevelinner[1] gl_tesslevelouter[2] (using equal_spacing) (0,0) gl_tesslevelouter[1] Jan Horáček Geometry & Tesselation 28 / 42

Příklad teselace trojúhelníku Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader parametry gl_tesslevelinner[0] = 5.0; gl_tesslevelouter[0] = 3.0; gl_tesslevelouter[1] = 4.0; gl_tesslevelouter[2] = 2.0; (using equal_spacing) gl_tesslevelouter[0] gl_tesslevelinner[0] gl_tesslevelouter[2] gl_tesslevelouter[1] Jan Horáček Geometry & Tesselation 29 / 42

Příklad teselace čar Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader (1,1) parametry gl_tesslevelouter[0] = 7.0; gl_tesslevelouter[1] = 4.0; (using equal_spacing) gl_tesslevelouter[0] (0,0) gl_tesslevelouter[1] Jan Horáček Geometry & Tesselation 30 / 42

Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader Příklad tessellation evaluation shaderu tessellation evaluation shader #version 400 core layout (quads, equal_spacing, ccw) in; uniform mat4 MV, P; float B( int i, float u) { const vec4 bc = vec4( 1, 3, 3, 1 ); return bc[i] * pow( u, i ) * pow( 1.0 - u, 3 - i ); } void main() { float u = gl_tesscoord.x, v = gl_tesscoord.y; } vec4 pos = vec4( 0.0 ); for( int j = 0; j < 4; j++ ) for( int i = 0; i < 4; i++ ) pos += B( i, u ) * B( j, v ) * gl_in[4*j+i].gl_position; gl_position = P * MV * pos; Jan Horáček Geometry & Tesselation 31 / 42

Kontrolování pozic teselace Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader teselační faktory jsou čísla s plovoucí řád. čárkou různé módy kontrolují, jak se bude strana rozdělovat každá hrana se může rozdělit na max. GL_MAX_TESS_GEN_LEVELS, aktuálně to je 64 Mód teselace Interval hodnot equal_spacing [1, max] fractional_even_spacing [2, max] fractional_odd_spacing [1, max-1] equal_spacing akceptuje celá čísla (zaokrouhluje nahoru), vytvoří n stejných intervalů fractional_... teselace zaokrouhĺı na nejbližší vyšší sudé/liché číslo, (n-2) intervalů je stejných a 2 většinou menší intervaly jsou závislé na desetinné části hodnoty Jan Horáček Geometry & Tesselation 32 / 42

Primitive winding a Point mode Úvod Tok dat Tesselation control shader Parametrizace Tesselation evaluation shader vytvořená primitiva mají vrcholy implicitně proti směru hodinových ručiček (ccw) použijte cw pro pořadí po směru hodinových ručiček místo polygonů (trojůhelníků) se dají generovat body, stačí nastavit point_mode v direktivě layout příklad nastavení layoutu v evaluation shaderu layout( triangles, cw, fractional_even_spacing, point_mode ) in; Jan Horáček Geometry & Tesselation 33 / 42

Obsah Přehled Příklad Geometry vs. Tessellation 1 2 3 4 Jan Horáček Geometry & Tesselation 34 / 42

Přehled Přehled Příklad Geometry vs. Tessellation poslední volitelná shader stage před rasterizerem svým způsobem podobné teselační části generování nové geometrie dosahuje podobných výsledků za pomocí jiných principů programátor specifikuje počet a typ vygenerovaných primitiv Jan Horáček Geometry & Tesselation 35 / 42

Vstup Přehled Příklad Geometry vs. Tessellation vstupem assembled primitives (tedy ne strips nebo fan) points... 1 lines... 2 lines_adjacency... 4 triangles... 3 triangles_adjacency... 6 má veškerou informaci o celém primitivu, nejen o 1 vrcholu nová primitiva se sousedností (adjacency) dodávají informaci o bezprostředním okoĺı Vestavěné proměnné in gl_pervertex { vec4 gl_position; float gl_pointsize; float gl_clipdistance[]; } gl_in[]; in int gl_primitiveidin; // pouze v OpenGL 4.0+ in int gl_invocationid; Jan Horáček Geometry & Tesselation 36 / 42

Výstup Přehled Příklad Geometry vs. Tessellation možná výstupní primitiva: points line_strip triangle_strip typy vstupního a výstupního primitiva jsou nezávislé vstup je po vykonání shaderu zapomenut výstupem 0 nebo více primitiv např. dva triangle_strips, každý ze 3 trojůhelníků pozn.:vzhledem k původní myšlence geometry shaderů nemusí být implementace nutně optimalizovaná pro masivní tvorbu geometrie na to je teselační část pipeline Jan Horáček Geometry & Tesselation 37 / 42

Výstupní proměnné Přehled Příklad Geometry vs. Tessellation Vestavěné proměnné vec4 gl_position; float gl_pointsize; float gl_clipdistance[]; out int gl_primitiveid; out int gl_layer; // pouze v OpenGL 4.0+ out int gl_viewportindex; Jan Horáček Geometry & Tesselation 38 / 42

Příklad geometry shaderu Přehled Příklad Geometry vs. Tessellation geometry shader #version 400 core layout (triangles, invocations = 1) in; layout (triangle_strip, max_vertices = 3) out; uniform float scale; void main() { vec4 v[3], center = vec4(0); for( int i = 0; i < 3; i++ ) { v[i] = gl_in[i].gl_position; center += v[i]; } center /= 3; for( int i = 0; i < 3; i++ ) { gl_position = mix( v[i], center, scale ); EmitVertex(); } EndPrimitive(); } Jan Horáček Geometry & Tesselation 39 / 42

Geometry vs. Tessellation Přehled Příklad Geometry vs. Tessellation Problém Geometry Tessellation generování primitiv topologie zdrojová primitiva praskliny mezi primitivy explicitní kontrola: specifikuje se pozice i propojení velmi lokalizovaná: je vidět jen nejbližší okoĺı s limitovanou konektivitou limitovaná sada: v podstatě jen základní primitiva, body, čáry, trojůhelníky problematické: je třeba dávat velký pozor na umístění vrcholů parametrická kontrola: teselační parametry určují počet vygenerovaných primitiv implicitně propojené: všechna primitiva jsou propojená, upravuje se jen umístění vrcholu jakákoliv patch: OpenGL vidí jen seznam vrcholů, vztahy se definují explicitně jednodušší: spoj je vodotěsný, pokud jsou teselační parametry stejné, praskání limitováno jen na výpočetní přesnost Jan Horáček Geometry & Tesselation 40 / 42

Obsah 1 2 3 4 Jan Horáček Geometry & Tesselation 41 / 42

OpenGL Architecture Review Board: OpenGL Programming Guide: The Official Guide to Learning OpenGL, Addison-Wesley, nejnovější vydání (aktuálně 8. vydání pro OpenGL 4.1) Randi J. Rost, Bill Licea-Kane: OpenGL Shading Language, 3 rd Edition, Addison-Wesley The Khronos Group: The OpenGL Graphics System: A Specification (Core/Compatibility profile), http://www.opengl.org/registry/ Christophe Riccino: OpenGL reviews, http://www.g-truc.net/post-opengl-review.html Wikipedia: http://en.wikipedia.org/wiki/opengl OpenGL tutorials: http://nehe.gamedev.net Jan Horáček Geometry & Tesselation 42 / 42