 MipMap  glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA32F,...);  glFramebufferTexture2D(GL_FRAMEBUFFER,..., TexID, mipLevel);

Slides:



Advertisements
Hasonló előadás
 Árnyalási egyenlet  Saját emisszió  Adott irányú visszaverődés.
Advertisements

GPU Szirmay-Kalos László.
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.
Bevezetés a tárgyakhoz Tárgyak  Objects are the containers for values of a specified type  Objects are either signals, variables or constants  Once.
 Gauss szűrő uniform sampler2D colorMap; const float kernel[9] = float[9]( 1.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 2.0, 1.0); out vec4 outColor; void main(){
GPGPU labor I. OpenGL, Cg.
 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.
GPGPU labor V. GPU ray tracing. Kezdeti teendők Tantárgy honlapja, GPU ray tracing A labor kiindulási alapjának letöltése (lab5_base.zip), kitömörítés.
Neo4j bevezető Rácz Gábor
TRANZIENS ADATTÁROLÁS State objektum Egy alkalmazásszintű gyűjtemény (Dictionary), mely Tombstone esetén megőrzi tartalmát a memóriában kulcs/érték párokként.
FRAKTÁLOK.
Delegátumok C#-ban Krizsán Zoltán iit 1.0.
PHP VI Adatbázisok, MySQL
PHP II. Tömbök, sztringek
Edge Transport Routing and AV/AS Enterprise Network External SMTP servers Phone system (PBX or VOIP) Client Access Client connectivity Web services.
Fejlett grafikai algoritmusok Megvilágítási modellek
Számítógépes grafika 3. gyakorlat.
Könyvtár, csomag és alprogramokVHDL Könyvtár, csomag és alprogram n Library és use n Package n Alprogramok –Procedure –Function –Resolution function Egy.
AAO Csink László november.
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.
Motor II. Env map Spotlight Szécsi László. Letöltés /code/E/code/EggCoreSecondBase.zip Kibontani (vagy előző labor folyt.):
Vízfelület Szécsi László. Nyílt víz a nyílt óceánon a felületi cseppecskék körmozgást végeznek trochoid hullámforma hullámhossz hullámmagasság amplitúdó.
Transzformációk, textúrák, árnyalás Szécsi László.
DirectX9 empty project Szécsi László. Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\
Rendering pipeline Ogre3D
Grafikus játékok fejlesztése Szécsi László t09-texture
Rekurzív algoritmusok
 Map  Reduce  Scan  Histogram  Compact const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new.
 Kvantált kép fényesség értékei: G [ 0, Gmax ]  G fényességű pontok száma: P(G)
GPGPU labor III. Iteratív algoritmusok. Kezdeti teendők Tantárgy honlapja, Iteratív algoritmusok A labor kiindulási alapjának letöltése (lab3base.zip),
GPGPU labor IX. Lineáris egyenletrendszerek megoldása.
GPGPU Labor 15.. Párhuzamos primitívek Map Reduce Scan Histogram Compact.
GPGPU labor II. GPU mint vektor processzor. Kezdeti teendők Tantárgy honlapja, Bevezetés – Alap könyvtárak letöltése Tantárgy honlapja, GPU mint vektor.
Számítógépes grafika DirectX 5. gyakorlat. Emlékeztető Háromdimenziós alapok befejezése Textúrázás.
OpenGL 4 shaderek, GLSL Valasek Gábor
 OpenCL platform  Számító eszközök  OpenCL kontextusok  Parancs sorok  Szinkronizáció  Memória objektumok  OpenCL programok  OpenCL függvények.
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat 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.
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.
Fizika II..
MÉZHAMISÍTÁS.
BMEGEENATMH Hőátadás.
Csáfordi, Zsolt – Kiss, Károly Miklós – Lengyel, Balázs
Gajdácsi József Főigazgató-helyettes
Brachmann Krisztina Országos Epidemiológiai Központ
VÁLLALATI PÉNZÜGYEK I. Dr. Tóth Tamás.
Végeselemes modellezés matematikai alapjai
Varga Júlia MTA KRTK KTI Szirák,
„Hej óvoda, óvoda te ékes kacsalábon forgó aranypalota!”
A 12. C a PÁNKE Húsvéti Játszóházának rendezvényén
A SZÁMVITELI RENDSZER, A SZÁMVITELI TÖRVÉNY.
9. Üstököskutatás Németh Zoltán
Földműveléstan és területfejlesztés
Exponenciális kisimítás
A grafikus hardware programozása
OpenGL 2. gyakorlat Valasek Gábor
A vállalati döntések modellezése
Vásárhelyi Pál Szakgimnázium és Kollégium Fluidumkitermelő technikus
BEFEKTETÉSEK TECHNIKAI KÉRDÉSEI
Vizualizáció és képszintézis
Magas felharmonikusok keltése tömbi szilárdtestekben: elméleti modell Földi Péter SZTE Elm. Fiz. ELI-ALPS.
A molekuladinamika algoritmusa Potenciálok
Mikrovezérlők alkalmazástechnikája laboratóriumi gyakorlat
OpenGL IV.
Kvantitatív módszerek
A jármű beavatkozások esedékességének meghatározása
OpenGL II.
Számítógépes Hálózatok
Fizika 2017.
Előadás másolata:

 MipMap  glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA32F,...);  glFramebufferTexture2D(GL_FRAMEBUFFER,..., TexID, mipLevel);

 Adott M darab bemeneti adat  Keressük a legkisebbet/legnagyobbat/egyéb kritériumnak leginkább megfelelőt  Oszd meg és uralkodj elv: a problémát rekurzívan kisebb bementre végezzük el (quick sort)

 M = N*N kétdimenziós adathalmazba rendezzük az adatokat, ez lesz a 0-ás mipmap szint  2x2-es pixelblokkra elvégezzük a keresést  Eredményt beírjuk az egyel nagyobb mipmap szintre  Addig folyatatjuk, míg el nem jutunk a mipmap hierarchia tetejére

#version 130 out vec4 outcolor; in vec2 fTexCoord; uniform int level; uniform sampler2D data; uniform vec2 center; void main() { ivec2 coord0 = ivec2(gl_FragCoord.xy) * 2; ivec2 coord1 = coord0 + ivec2(1, 1); ivec2 coord2 = coord0 + ivec2(1, 0); ivec2 coord3 = coord0 + ivec2(0, 1); vec4 d0 = texelFetch(data, coord0, level - 1); vec4 d1 = texelFetch(data, coord1, level - 1); vec4 d2 = texelFetch(data, coord2, level - 1); vec4 d3 = texelFetch(data, coord3, level - 1); //….. Szamol, keres és beírja eredmeny-be outcolor = vec4(eredmeny); }

int numMipLevels = buffer->getLevels(); //Shader engedélyezése compareShader->enable(); //Minden mipmap szintre 1-től for(int l = 1; l < numMipLevels; l++) { buffer->setRenderTarget(l); compareShader->bindUniformInt("level", l); compareShader->bindUniformTexture("data", buffer->getColorBuffer(0), 0); fullscreenQuad->render(compareShader); } buffer->disableRenderTarget(); compareShader->disable(); //Várjuk meg, míg lefutnak a rajzolások glFinish(); //Vissza kell olvasni a végeredményt, textúra visszaolvasással fogjuk megtenni float result[4]; //Kössük be a textúrát, amiből olvasni szeretnénk glBindTexture(GL_TEXTURE_2D, buffer->getColorBuffer(0)); //legfelső mipmapszintet olvassuk vissza (1x1 pixel) glGetTexImage(GL_TEXTURE_2D, buffer->getLevels() - 1, GL_RGBA, GL_FLOAT, result); //kiírjuk az eredményt printf("Result: %f %f %f %f\n", result[0], result[1], result[2], result[3]);

… vec4 d0 = texelFetch(data, coord0, level - 1); vec4 d1 = texelFetch(data, coord1, level - 1); vec4 d2 = texelFetch(data, coord2, level - 1); vec4 d3 = texelFetch(data, coord3, level - 1); float min0 = min(d0.x,min(d0.y,min(d0.z,d0.w))); float min1 = min(d1.x,min(d1.y,min(d1.z,d1.w))); float min2 = min(d2.x,min(d2.y,min(d2.z,d2.w))); float min3 = min(d3.x,min(d3.y,min(d3.z,d3.w))); float smallest = min(min(min(min0,min1),min2),min3); outcolor = vec4(smallest,smallest,smallest,smallest); Legkisebb elemet (itt N*N*4 db adatunk lehet)

… float l0 = length(d0.xyz - center); float l1 = length(d1.xyz - center); float l2 = length(d2.xyz - center); float l3 = length(d3.xyz - center); if(l0 > l1){ l0 = l1; d0 = d1; } if(l0 > l2){ l0 = l2; d0 = d2; } if(l0 > l3){ l0 = l3; d0 = d3; } outcolor = vec4(d0.xyz,l0); Egy középponttól (center) való távolságot ( az adataink 1,2,3 v. 4 dimenziósak is lehetnek, alábbi kódban 3 dimenziósak, a végeredmény a legközelebbi adat koordinátáit és a távolságot is tárolja)

 A keresést nagyobb v. kisebb alblokkokra is oszthatjuk:  1D textúra (2 db alfeladat)  3D textúra (2x2x2-es blokk)  Egyes mipmap szinteket átugorhatunk és számolhatunk pl. 16x16-os blokkokkal  Az előbbi távolság szerinti keresésnél a távolság számítása csak a 0-s mipmap szinten kell, utána már egyszerű összehasonlítást is használhatunk

 Szeretnénk megtalálni a legrövidebb utat egy adott pontból bármely más pontba egy irányított(/irányítatlan) gráfban  A gráf adjacencia mátrixával adott (2D textúra)  Geometria shadert fogunk használni a rekurzív bejáráshoz

 Opcionális lépcső  Primitíveken dolgozik  Bemenet: egy primitív  Kimenet: egy vagy több  A shader kimenete visszaköthető Vertex Shader Geometria Shader Fragmens Shader

 Bementi primitívek  Pont ▪ GL_POINTS  Szakasz ▪ GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP  Háromszög ▪ GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN  Adjacencia információ glProgramParameteri(shader, GL_GEOMETRY_INPUT_TYPE, tipus);

 Adjacencia  Szakasz ▪ GL_LINES_ADJACENCY ▪ GL_LINE_STRIP_ADJACENCY  Háromszög ▪ GL_TRIANGLES_ADJACENCY ▪ GL_TRIANGLE_STRIP_ADJACENCY

 Kimeneti primitívek  Pont ▪ GL_POINTS  Szakasz ▪ GL_LINE_STRIP  Háromszög ▪ GL_LINE_STRIP glProgramParameteri(shader, GL_GEOMETRY_OUTPUT_TYPE, tipus); glProgramParameteri(shader, GL_GEOMETRY_VERTICES_OUT, darab);

 Speciális bemeneti változók  gl_ClipDistance[] : vágási információk  gl_PointSize[] : vertex méret a vertex shaderből  gl_Position : vertex pozíció  gl_PrimitiveIDIn : a feldolgozott primitív sorszáma  Speciális kimeneti változók  A bemeneti változók  gl_Layer : melyik rétegbe tegye a fragmens shader (pl. cube map rendereléshez)

 Primitívek generálása  Vertex információk beállítása  Vertex lezárása  Primitív lezárása EmitVertex(); EndPrimitive();

 Példa #version 130 #extension GL_EXT_geometry_shader4 : enable in vec2 vTexCoord[]; out vec2 fTexCoord; void main(void){ for(int i=0; i < gl_VerticesIn; ++i){ gl_Position = gl_PositionIn[i]; fTexCoord = vTexCoord[i]; EmitVertex(); } EndPrimitive(); for(int i=0; i < gl_VerticesIn; ++i){ gl_Position = gl_PositionIn[i].yxzw; fTexCoord = vTexCoord[i].yx; EmitVertex(); } EndPrimitive(); }

 Primitívek újrafeldolgozása  Transform feedback ▪ Feedback mód ▪ Megadja a használható primitíveket  Feedback buffer kiválasztása  Tulajdonságok kiválasztása Vertex Shader Geometria Shader Fragmens Shader Feedback Buffer glBeginTransformFeedback(mode); // glDrawArrays(...); glEndTransformFeedback(); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, index, buffer); glTransformFeedbackVaryings(...);

 Információ a geometria shader működéséről  Primitive query  Query mód ▪ GL_PRIMITIVES_GENERATED ▪ Mennyi primitívet állított elő a geometria shader ▪ GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN ▪ Mennyi primitívet tudott a feedback bufferbe írni a shader GLuint outputQuery; glGenQueries(1, &outputQuery); glBeginQuery(mode, outputQuery);... glEndQuery(mode);

 Információ a geometria shader működéséről  A Query eredményének lekérdezése GLuint outPointCount = 0; GLuint succeded = 0; while(!succeded){ glGetQueryObjectiv(outputQuery, GL_QUERY_RESULT_AVAILABLE, &succeded); } glGetQueryObjectiv(outputQuery, GL_QUERY_RESULT, &outPointCount);

 Bejárás adatait 1D textúrába tároljuk, N méretű, ahol N a gráf csomópontjainak száma  Valójában 2D textúrát használtunk, kényelmességi okokból, mérete Nx1  A textúra float4-es, pixelek jelentése (nodedata): (R, G, B, A)Csúcspont ID Eddig megtalált legrövidebb teljes úthossz Az a csúcspont, melyből a legrövidebb úton ide jutottunk Érvényességi flag (0 v. 1, ha 0, akkor még nem látogattuk meg a csúcspontot)

#version 130 #extension GL_EXT_geometry_shader4 : enable uniform sampler2D adjacency; uniform sampler2D shortestPath; out vec4 nodedata; void main(void) { float nodeCount = textureSize(shortestPath, 0).x; vec4 vertexdata = gl_PositionIn[0]; int nodeID = int(vertexdata.x); vec4 storedNodeData = texelFetch(shortestPath, ivec2(nodeID, 0), 0); float pathLen = storedNodeData.y; //this should be the start node if(vertexdata.w == 0) { gl_Position = vec4(float(nodeID) / nodeCount * , 0, 0, 1); nodedata = vec4(vertexdata.xyz, 1); EmitVertex(); } …

//visit all neighbor nodes for(int i = 0; i < nodeCount; ++i) { float edgeWeight = texelFetch(adjacency, ivec2(nodeID, i), 0).r; if(edgeWeight > 0) { vec4 neighNodeData = texelFetch(shortestPath, ivec2(i, 0), 0); float neighPathLen = neighNodeData.y; float neighPathLenNew = pathLen + edgeWeight; if(neighPathLenNew < neighPathLen || (neighPathLen == 0 && neighNodeData.w == 0)) { gl_Position = vec4(float(i) / nodeCount * , 0, 0, 1); nodedata = vec4(i, neighPathLenNew, nodeID, 1); EmitVertex(); } }

nodes->setRenderTarget(); glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); exploreShader->enable(); exploreShader->bindUniformTexture("adjacency", adjacency, 0); exploreShader->bindUniformTexture("shortestPath", nodes->getColorBuffer(0), 1);

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER,0,streamoutBufffer[0]); glPointSize(1); glBeginTransformFeedback(GL_POINTS); glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, outputQuery); glBegin(GL_POINTS); glVertex4f(startNode, 0, 0, 0); glEnd(); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); glEndTransformFeedback(); GLint outPointCount = 0; GLint succ = 0; while(!succ) glGetQueryObjectiv(outputQuery, GL_QUERY_RESULT_AVAILABLE, &succ); glGetQueryObjectiv(outputQuery, GL_QUERY_RESULT, &outPointCount); succ = 0;

glEnableClientState(GL_VERTEX_ARRAY); int bb = 0; while(outPointCount > 0) { glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER,0,streamoutBufffer[(bb+1)%2]); glBeginTransformFeedback(GL_POINTS); glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, outputQuery); glBindBufferARB(GL_ARRAY_BUFFER_ARB, streamoutBufffer[bb]); glVertexPointer(4,GL_FLOAT,0,NULL); glDrawArrays(GL_POINTS, 0, outPointCount); glEndTransformFeedback(); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); while(!succ) glGetQueryObjectiv(outputQuery, GL_QUERY_RESULT_AVAILABLE, &succ); glGetQueryObjectiv(outputQuery, GL_QUERY_RESULT, &outPointCount); succ = 0; bb = (bb + 1) % 2; } glDisableClientState(GL_VERTEX_ARRAY); exploreShader->disable(); nodes->disableRenderTarget();

static float* pathData = new float[nodeCnt*4]; glBindTexture(GL_TEXTURE_2D, nodes->getColorBuffer(0)); glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,pathData);  Ezen a tömbön már végiglépkedhetünk.  float4-eseket tartalmaz:  2. elem az út hossza  3. elem a csúcspont, ahonnan ide jutottunk  3. Elemet használva eljuthatunk a kiindulási csúcsponthoz