OpenGL 4 shaderek, GLSL Valasek Gábor

Slides:



Advertisements
Hasonló előadás
OpenGL 2. gyakorlat Hapák József
Advertisements

GPU Szirmay-Kalos László.
Számítógépes grafika Szirmay-Kalos László
Számítógépes grafika Szirmay-Kalos László
Virtuális világ tárolása Szirmay-Kalos László. Belső világ tárolása l Geometria: pontok koordinátái l Topológia: élek-pontok; lapok-pontok;... l hierarchia:
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
Grafikus játékok fejlesztése Szécsi László g11-physics
 Nincs szinkronizáció és kommunikáció  Csővezeték alkalmazása  Párhuzamosítás Proc 2Proc 1 Csővezeték Proc 1 Proc 21 Proc 22 Párhuzamosság.
Számítógépes Grafika 6. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Matematikai modellek a termelés tervezésében és irányításában
Mérnöki objektumok leírása és elemzése virtuális terekben c. tantárgy Budapesti Műszaki Főiskola Neumann János Informatikai Kar Intelligens Mérnöki Rendszerek.
Változó képlethez változó kép
Fejlett grafikai algoritmusok Megvilágítási modellek
Számítógépes grafika 3. gyakorlat.
Bevezetés a Számítógépi grafikába - előadás
Számítógépes grafika 5. gyakorlat. Előző órán Textúrázási módok Pixel shader használata.
Számítógépes Grafika Programtervező informatikus (esti)‏ Textúrázás.
Készítette: Kreka Bálint
2008/2009 tavasz Klár Gergely  Gyakorlatok időpontjai: ◦ Szerda 10:05–11:35 ◦ Csütörtök 10:00+ε –11:30+ε  Gyakvez: ◦ Klár Gergely ◦
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Térfogatvizualizáció
Számítógépes grafika Bevezetés
Rendering pipeline Ogre3D
Textúrák Grafikus játékok fejlesztése Szécsi László g07-texture.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
Többmenetes renderelés Grafikus játékok fejlesztése Szécsi László g11-multipass.
Grafikus játékok fejlesztése Szécsi László t09-texture
Rekurzív algoritmusok
Pipeline Vertex shader Fragment shader. Transzformációs modul A modellünket a saját koordinátarendszerében adjuk meg Azonban a saját koordinátarendszerükben.
GPU ELTE IK Számítógépes Grafika II. Jeni László Attila
GPGPU A grafikus hardver általános célú felhasználása
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 4. Gyakorlat Függvény paraméterek, dinamikus.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
Brightr Megvilágítás modellezése. Csapattagok  Illés László  Palatinus Endre  Provits Milán  Török Péter.
Fejlett grafikai algoritmusok Megvilágítás SZTE, 2010.
Dijkstra-algoritmus. A Dijkstra-algoritmus egy mohó algoritmus, amivel irányított gráfokban lehet megkeresni a legrövidebb utakat egy adott csúcspontból.
Számítógépes Grafika 6. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Informatikai eszközök a virtuális valóság szolgálatában Hapák József ELTE-IK X. Eötvös Konferencia.
Számítógépes grafika OpenGL 5. gyakorlat.
Számítógépes grafika gyakorlat: DirectX 2007/2008 tavasz Klár Gergely
Számítógépes Grafika OpenGL 4 shaderek, GLSL. OpenGL 4 A következő programozható fázisok vannak a 4.x-es OpenGL-ben: Vertex shader Tesselation control.
A számítógépes grafika alapjai, PPKE-ITK, Benedek Csaba, 2010 Tanagyag forrás © Szirmay-Kalos László, BME A számítógépes grafika céljai és feladatai 1.
Képek, képfeldolgozás Szirmay-Kalos László.
Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos.
Vizualizáció és képszintézis Térfogati textúrák kezelése (Dart + GLSL) Szécsi László.
SZÁMÍTÓGÉPES GRAFIKA 1. gyakorlat. Elérhetőségek Honlap: lunyi.web.elte.hu Egyéb lehetőségek: – Megkeresés.
Perspektív projekció és kamera paraméterek. Szükséges transzformációk Világkoordináta rendszer (3D) Kamera koordinátarendszer (3D) Képsík koordináták.
Grafikus hardver/szoftver alapok Szirmay-Kalos László.
Bevezetés.  Miért …  … egyszálúan programozunk?  … probléma ez?  Hogyan …  … változik ez?  … tudjuk kihasználni?  Megéri-e párhuzamosítani?
Térfogati illumináció
Számítógépes Grafika OpenGL és SDL alapok
Lighting III.
Általános célú számítások a GPU-n
A grafikus hardware programozása
OpenGL 2. gyakorlat Valasek Gábor
132. óra Néhány nemlineáris függvény és függvény transzformációk
Vizualizáció és képszintézis
Vizualizáció és képszintézis
Szécsi László 3D Grafikus Rendszerek 14. előadás
óra Néhány nemlineáris függvény és függvény transzformációk
OpenGL IV.
Átlátszóság, csipkézettség, köd
Vizualizáció és képszintézis
GPGPU – CUDA 2..
OpenGL III.
Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek
OpenGL II.
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Bevezetés GPGPU Alkalmazások.
Mesh from file, OrthoCamera, PerspectiveCamera
Előadás másolata:

OpenGL 4 shaderek, GLSL Valasek Gábor

OpenGL 4 A következő programozható fázisok vannak a 4.x-es OpenGL-ben: Vertex shader Tesselation control shader Tesselation evaluation shader Geometry shader Fragment shader

OpenGL 4 pipeline

Vertex és pixel shader

Vertex shader A vertex shader programunkban végezzük el a bejövő geometria csúcspontjainak transzformációját glDrawArrays/glDrawElements hívásban hivatkozott csúcspontok lesznek a bemenetei A vertex shader bemeneti változóihoz (in módosító) a hozzárendelést a programból csináljuk A csúcspontbeli attribútumoknál ritkábban változó bemenetet uniform változókon keresztül adhatjuk át (uniform = a kirajzolás hívás idejére konstans)

Vertex shader A bejövő csúcspont koordinátáit clip space-be ( -1 <= x,y,z <= 1) kell transzformálni és a beépített gl_Position változónak átadni – ezt a pipeline nem programozható részeinek is kell gl_Position = gl_MVPMatrix * bejövő_vertex_pos4 Ezen kívül azt csinálunk „amit akarunk” (minden out-tal megjelölt változónak adhatunk értéket és továbbküldhetjük a következő programozható fázisnak)

Vertex shader A következő beépített kimeneti változók írhatóak a vertex shaderből: vec4 gl_Position: a transzformált homogén koordinátái a bejövő vertex-nek. Ebbe írnia kell a VS-nek. float gl_PointSize: a kirajzolandó pont mérete pixelben (point sprite-okhoz). Opcionális. vec4 gl_ClipVertex: felhasználói vágósíkokhoz. Opcionális. És ezeken kívül minden, amit mi is felveszünk...

Fragment shader vec4 gl_FragColor: a fragment színe, de ha nem írun bele viszont van kimeneti vec4, az lesz ez vec4 glFragData[gl_MaxDrawBuffers]: ha több color attachment-je van az aktív FBO-nak, akkor ezen keresztül írhatunk rájuk float gl_FragDepth: fragment mélységi értéke (ha módosítanánk, mint a raycasterben) vec4 gl_FragCoord: csak olvasható, a fragment homogén koordinátái (4. koord 1/w) bool gl_FrontFacing: előrefelé néz-e a fragment lapja

Vertex shader #version 400 in vec3 VertexPosition; in vec3 VertexColor; out vec3 Color; void main() { Color = VertexColor; gl_Position = vec4(VertexPosition,1.0); }

Fragment shader #version 400 in vec3 Color; out vec4 FragColor; void main() { FragColor = vec4(Color, 1.0); }

Program-shader megfeleltetések Vertex attribútumok és a shader bemeneti változóinak összerendelés: glBindAttribLocation( programHandle, // shader prog 0, // index "VertexPosition"); // sh-s nev glBindAttribLocation( programHandle, 1, "VertexColor");

Program-shader megfeleltetések glGenVertexArrays( 1, &vaoHandle ); glBindVertexArray(vaoHandle); glEnableVertexAttribArray(0); // Vertex position glEnableVertexAttribArray(1); // Vertex color glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle); glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte *)NULL ); glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle); glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte *)NULL );

Program-shader megfeleltetések Lényegében tehát általános, indexekkel azonosított csatornákon keresztül megy az információátadás A csatornák száma a GL_MAX_VERTEX_ATTRIBS segítségével kérhetőek le

Layout A shader oldalon is megcsinálhatjuk a bejövő csatornák „index-esítését”, és nem kell bind- olni az attrib location-öket: layout (location = 0) in vec3 VertexPosition; layout (location = 1) in vec3 VertexColor; Ezt a kimeneti változóknál is lehet használni: layout (location = 0) out vec4 FragColor;

Uniform változók A shaderen belül read-only-k (konstansok), de kezdeti értéket kaphatnak uniform mat4 MVP Típusok:, n = 2,3,4 mat<n>: n x n-es mátrix vec<n>: n dim vektor

Uniform változók Először meg kell tudnunk az OpenGL-es azonosítóját a uniform változónak: GLuint mvpInShader = glGetUniformLocation( programHandle, "MVP"); Ezután már típusának megfelelő fv-vel értéket adhatunk neki: GlUniformMatrix4fv( mvpInShader, 1, GL_FALSE, &app_mvp[0][0]); Többiek: http://www.opengl.org/sdk/docs/man/xhtml/glUn iform.xml

Uniform változók Alaptípusok tömbjét is megjelölhetünk uniform- ként Ekkor pl. egy mátrixtömb konkrét indexen lévő mátrixának azonosítóját megkapjuk így: GLuint location = glGetUniformLocation( programHandle, "MyArray[1]" );

Uniform block Több shader változó használhatja a program szempontjából ugyanazon uniform változókat Ezeket mégis külön-külön kellene feltöltenünk stb., mert ugyanannak a uniform változónak más lesz a címe a különböző shader programokban A uniform block segítségével ezen segíthetünk (csak használjunk shared layout-ot)

Uniform block – a shaderben uniform BlobSettings { vec4 InnerColor; vec4 OuterColor; float RadiusInner; float RadiusOuter; };

Uniform block A uniform változók adatait tartalmazó puffer objektum a uniform buffer object A változókra hivatkozásnál elég az adattag nevét írni, nem kell prefixelni az UBO nevével (tehát pl. elég az InnerColor, nem kell BlobSettings.InnerColor)

Uniform block GLuint blockIndex = glGetUniformBlockIndex( programHandle, "BlobSettings"); GLint blockSize; glGetActiveUniformBlockiv( programHandle, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize); GLubyte * blockBuffer= (GLubyte *)malloc(blockSize);

Uniform block const GLchar *names[] = { "InnerColor", "OuterColor", "RadiusInner", "RadiusOuter" }; GLuint indices[4]; glGetUniformIndices( programHandle, 4, names, indices); GLint offset[4]; glGetActiveUniformsiv( programHandle, 4, indices, GL_UNIFORM_OFFSET, offset);

Uniform block GLfloat outerColor[] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloat innerColor[] = {1.0f, 1.0f, 0.75f, 1.0f}; GLfloat innerRadius = 0.25f, outerRadius = 0.45f; memcpy(blockBuffer + offset[0], innerColor, 4 * sizeof(GLfloat)); memcpy(blockBuffer + offset[1], outerColor, 4 * sizeof(GLfloat)); memcpy(blockBuffer + offset[2], &innerRadius, sizeof(GLfloat)); memcpy(blockBuffer + offset[3], &outerRadius, sizeof(GLfloat));

Uniform block GLuint uboHandle; glGenBuffers( 1, &uboHandle ); glBindBuffer( GL_UNIFORM_BUFFER, uboHandle ); glBufferData( GL_UNIFORM_BUFFER, blockSize, blockBuffer, GL_DYNAMIC_DRAW ); glBindBufferBase( GL_UNIFORM_BUFFER, blockIndex, uboHandle );

Fragment shader #version 400 in vec3 Color; out vec4 FragColor; void main() { FragColor = vec4(Color, 1.0); }

Az összes shader

Az összes shader Az összes shader opcionális, pass-through-ként működnek ha nincs saját hozzárendelve Ha van akár geometry, akár tesszelációs shader, akkor kell legyen vertex shader is

Geometry shader Meglévő geometria módosítására, törlésére, bővítésére Bemenete a transzformált vertexekből képezett primitívekből áll Kimenete 0, 1, vagy több primitív A kimenő primitív típus különbözhet a bejövőtől! De csak egyféle típusú lehet a kimenet

Geometry shader Minden primitívre egyszer fut le A primitív összes csúcspontját eléri, a csúcspontokban tárolt összes információval együtt Lehet akár culling-ot is csinálni benne

Geometry shader EmitVertex: ha kész vagyunk a primitív egyik csúcspontjához tartozó attribútumok kitöltésével, ezzel az utasítással adhatjuk tovább a pipeline-nak Ha nincs EmitVertex, akkor implicit eldobódik csúcspont EmitPrimitive: ha elkészült a primitív összes csúcspontja, akkor EmitPrimitive-vel tudjuk visszadobni a pipeline-ba Ha nincs EmitPrimitive, akkor a GS lefutásakor implicit hívódik egy

Tesszelációs shader Ha aktiválva van, akkor csak egyetlen rajzolási primitívünk van: GL_PATCHES A patch primitív tetszőleges geometriai és egyéb információk halmaza, ami alapján a tesszelációs shader az inkrementális képszintézisnek megfelelő primitíveket hoz létre Maximális „csúcsok” száma egy patch-ben: GL_MAX_PATCH_VERTICES

Tesszelációs shader A kirajzolandó patch-adathalmaz csúcspontjainak száma: glPatchParameteri( GL_PATCH_VERTICES, num); Például Bézier kontrollpontok száma

Tesszelációs shader A patch primitívet nem rajzoljuk ki, a tesselation control és tesselation evaluator számára szolgáltat adatokat A tényleges pipeline-ba bekerülő primitíveket a tesselation primitive generator állítja elő (ez a TCS és TES között van a pipelineban)

TCS A TPG-t konfigurálja, hogy az miképp készítsen primitíveket (mennyit és melyik beépített algoritmussal) Ezen kívül per-vertex kimeneti attribútumokat állíthat elő

TES A TPG által létrehozott primitívek minden egyes (paramétertérbeli) csúcspontjára meghívódik Lényegében: a görbe- vagy felületséma kiértékelése a feladata Fő feladat: a pozíció meghatározása

Geometry shader példa

Geometry shader - bemenet A következő típusú bemenetek lehetnek: points (1) lines (2) lines_adjacency (4) triangles (3) triangles_adjacency (6) Primitívenként 1, 2, 4, 3, 6 csúcspontokkal

Geometry shader - bemenet A szomszédossági adatos primitívek OpenGL kliens oldali kódjában a következők: GL_LINES_ADJACENCY GL_LINE_STRIP_ADJACENCY GL_TRIANGLES_ADJACENCY GL_TRIANGLE_STRIP_ADJECENCY

Geometry shader - bemenet A többi primitív típusból pedig a pipeline csinálja meg a GS bemenetet Ami tehát mindig 1 primitívből áll, amihez tartozhat szomszédossági információ is Hogyan kapja ezt meg?

Geometry shader - bemenet

Geometry shader - bemenet

Geometry shader - bemenet

Geometry shader - bemenet

Geometry shader – bemenet, kimenet