Véletlen szám generálás Labirintus felépítése 1x1-es felbontástól a teljes méretig

Hasonló dokumentumok
HLSL programozás. Grafikus játékok fejlesztése Szécsi László t06-hlsl

Fraktálok és káosz. Szirmay-Kalos László

Nincs szinkronizáció és kommunikáció Csővezeték alkalmazása Párhuzamosítás

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny döntő fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Textúrák. Szécsi László

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Számítógépes grafika

HLSL programozás. Szécsi László

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Plakátok, részecskerendszerek. Szécsi László

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Fordítás Kódoptimalizálás

Direct3D pipeline. Grafikus játékok fejlesztése Szécsi László t03-pipeline

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

INFORMATIKA javítókulcs 2016

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

2D képszintézis. Szirmay-Kalos László

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Függvények Függvények

Klár Gergely

Algoritmusok és adatszerkezetek II.

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Érdekes informatika feladatok

Információs Technológia

Kép mátrix. Feladat: Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 2/35

Klár Gergely 2010/2011. tavaszi félév

Programozási segédlet

Gauss szűrő L ' ( X, Y ) L ( X x, Y y ) w ( X, Y, x, y ) dxdy 2 2 x y w ( x, y ) e /

Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./0. 3D grafika programozása OpenGL támogatással A 3D API

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Algoritmusok bonyolultsága

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

DIGITÁLIS TECHNIKA I

Mintavételes szabályozás mikrovezérlő segítségével

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Dinamikus programozás vagy Oszd meg, és uralkodj!

OpenGL Compute Shader-ek. Valasek Gábor

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

Számláló rendezés. Példa

Mesterséges Intelligencia MI

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Geometria brute force tárolása

Országzászlók (2015. május 27., Sz14)

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

I. Internetes keresési feladatok (ajánlott idő: 20 perc)

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Felvételi tematika INFORMATIKA

Grafikus csővezeték és az OpenGL függvénykönyvtár

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

SR mini PLC Modbus illesztő modul. Modul beállítása Bemeneti pontok kiosztása főmodul esetén Bemeneti pontok címkiosztása kiegészítő modul esetében

A Verem absztrakt adattípus

1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT

Rubin SMART COUNTER. Műszaki adatlap 1.1. Státusz: Jóváhagyva Készítette: Forrai Attila Jóváhagyta: Parádi Csaba. Rubin Informatikai Zrt.

INFORMATIKA tétel 2019

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

SZÁLLÍTÁSI FELADAT KÖRUTAZÁSI MODELL WINDOWS QUANTITATIVE SUPPORT BUSINESS PROGRAMMAL (QSB) JEGYZET Ábragyűjtemény Dr. Réger Béla LÉPÉSRŐL - LÉPÉSRE

Lényege: valamilyen szempont szerint homogén csoportok képzése a pixelekből. Amit már ismerünk:

Navigáci. stervezés. Algoritmusok és alkalmazásaik. Osváth Róbert Sorbán Sámuel

Form1 Form Size 400;400 Text Mozgó kör timer1 Timer Enabled True Interval 100

7. Régió alapú szegmentálás

Grafikus csővezeték 1 / 44

Kupacrendezés. Az s sorban lévő elemeket rendezzük a k kupac segítségével! k.empty. not s.isempty. e:=s.out k.insert(e) not k.

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

3. Hőmérők elkészítése

Adatszerkezetek 7a. Dr. IványiPéter

T201W/T201WA 20 -os szélesvásznú LCD monitor Felhasználói kézikönyv

DIGITÁLIS TECHNIKA I KARNAUGH TÁBLA, K-MAP KARNAUGH TÁBLA PROGRAMOK PÉLDA: ÖT-VÁLTOZÓS MINIMALIZÁLÁS PÉLDA: ÖT-VÁLTOZÓS MINIMALIZÁLÁS

Keresések Gregorics Tibor Mesterséges intelligencia

Neumann János Tehetséggondozó Program Gráfalgoritmusok II.

Algoritmuselmélet 7. előadás

2018, Diszkrét matematika

Tartalom. Tartalom. Hajder Levente Szakasz raszterizálása. 2017/2018. II. félév. Poligon raszterizáció.

Geometriai modellezés. Szécsi László

Grafikus csővezeték (Általános áttekintés) Grafikus csővezeték (Általános áttekintés)

Az MS Word szövegszerkesztés modul részletes tematika listája

A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja Teljesítménykövetelmények:

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

OKTV 2007/2008 Informatika II. kategória döntő forduló Feladatlap. Oktatási Hivatal

Cohen-Sutherland vágóalgoritmus

Gráfok 1. Tárolási módok, bejárások. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Adatszerkezetek 2. Dr. Iványi Péter

Készítette: Nagy Tibor István Felhasznált irodalom: Kotsis Domokos: OOP diasor Zsakó L., Szlávi P.: Mikrológia 19.

Valasek Gábor

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Hajder Levente 2018/2019. II. félév

Egyszerű programozási tételek

Számítógépes Graka - 4. Gyak

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Gyakori elemhalmazok kinyerése

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Képernyő. monitor

Időjárási csúcsok. Bemenet. Kimenet. Példa. Korlátok. Nemes Tihamér Nemzetközi Informatikai Tanulmányi Verseny, 2-3. korcsoport

Átírás:

Véletlen szám generálás Labirintus felépítése 1x1-es felbontástól a teljes méretig Labirintusban egy kiindulási pontból az összes pontba legrövidebb út keresése Egy végállomásból elindulva visszafejteni a legrövidebb utat a kiindulási állapotig

Fraktál zaj + =

2D zaj, 4 színcsatornában 4 független véletlen szám tárolható MipMap glteximage2d(gl_texture_2d, level, GL_RGBA32F,...); glframebuffertexture2d(gl_framebuffer,..., TexID, miplevel); Brown mozgás: R kezdeti értéke 0.5 noisescale kezdeti értéke 0.5 minden mipmap szintnél noisescale*= 0.5 vec4 R = texturelod(inputtex2, ftexcoord, level + 1); //előző szint vec4 rand = texelfetch(noisetex, ivec2(mod(coord + ivec2(noiseseed, 0), ivec2(16))), 0); R = R + noisescale * (rand - 0.5);

Cella: 4 szomszéd, 4 csatorna Ha vezet út a szomszéd felé akkor 1, egyébként 0 1 2 0 V(R,G,B,A) = (0,1,1,1) 3

Rekurzív tovább osztás Szülő cella értékeit megörököljük Közbülső falakat töröljük Az átjárók egyik felét lezárjuk Az új 4 cellát egy irányban felosztjuk (4 lehetséges irányból 1-et véletlenszerűen választunk)

Probléma: Két szomszédos cellacsoport másképp dönt az átjáró lezárásáról (kommunikáció kellene a szálak között) Legegyszerűbb megoldás: Mindig ugyanazt választjuk, pl. bal oldalt és felül tartjuk meg az átjárókat. Ismételhető lesz.

Cellák indexelése (index): 2 3 0 1 Irányok indexelése (csatornák): 1 2 0 Maszk (M), mely irányokban van szomszédja befele : 3 Maszk (D), mindig bal oldalon és felül tartjuk meg az átjárókat (melyik irányban kell átjárót lezárni): Halmaz operátorok: A * B: metszet uni(a, B) : unió Örököljünk a szülőtől, de zárjuk le a kijáratok felét: V = inv(p * D[index]) * P; (1,0,0,1) (0,0,1,1) (1,1,0,0) (0,1,1,0) (0,0,0,0) (0,1,0,0) (0,0,1,0) (1,0,0,1) Közbülső falak eltüntetése V = uni(v, M[index]);

vec4 W1; // függőleges v. vízszintes vec4 W2; // bal/lenn - jobb/fenn if(r.x < 0.25) { // right W1 = vec4(1,0,1,0); W2 = vec4(m[index].x == 1); } else if(r.x < 0.5){ // top W1 = vec4(0,1,0,1); W2 = vec4(m[index].y == 1); } else if(r.x < 0.75) { // left W1 = vec4(1,0,1,0); W2 = vec4(m[index].z == 1); } else{ // bottom W1 = vec4(0,1,0,1); W2 = vec4(m[index].w == 1); } Fontos, hogy a négy cella ugyanazt a döntést hozza a felosztásról. Az Rvéletlen számot az előző szintről olvassuk: vec4 R = texturelod(inputtex2, ftexcoord, level + 1); V = V * uni(uni(w1, W2), inv(m[index]));

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 glprogramparameteri(shader, GL_GEOMETRY_INPUT_TYPE, tipus); 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ó

Adjacencia Szakasz GL_LINES_ADJACENCY GL_LINE_STRIP_ADJACENCY Háromszög GL_TRIANGLES_ADJACENCY GL_TRIANGLE_STRIP_ADJACENCY 1 2 3 4 5 6 7 8 1 2 3 4 5 6 2 3 4 1 5 6

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

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 EmitVertex(); Primitív lezárása 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 glbegintransformfeedback(mode); // gldrawarrays(...); glendtransformfeedback(); Feedback Buffer Vertex Shader Feedback mód Megadja a használható primitíveket Feedback buffer kiválasztása glbindbufferbase(gl_transform_feedback_buffer, index, buffer); Tulajdonságok kiválasztása gltransformfeedbackvaryings(...); Geometria Shader Fragmens Shader

Információ a geometria shader működéséről Primitive query GLuint outputquery; glgenqueries(1, &outputquery); glbeginquery(mode, outputquery);... glendquery(mode); 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

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);

Elágazó folyamat, szélességi gráf bejárás

A bejárás során egy cellának egy pont primitív fog megfelelni V(x,y,d,n) x,y: cella index d: eddig megtalált legrövidebb úthossz n: a legrövidebb úton melyik szomszédból jutottunk ide (irány index) A legrövidebb úthosszat egy textúrában tároljuk Textúra inicializálása (0,0,0,0) A start cellából indulva azonosítjuk a szomszédjait Ha az adott szomszédba vezet út, megvizsgáljuk, hogy az ahhoz tartozó eddig megtalált legrövidebb úthossz hosszabb-e a csomópontunkhoz tartozó (d + 1) értéknél (vagy még nem is jártunk ebben a cellában) Ha igen, a cella értékét frissíteni kell, és szomszédaitmeg kell látogatni (előző lépés ismétlése)

Elágazás: egy pontból több pont lesz megoldás: Geometry Shader Rekurzió: a szomszédokra újra végre kell hajtani a feladatot megoldás: Vertex Transform Feedback

... vec2 windowsize = texturesize(inputtex2, 0); vec4 vertexdata = gl_positionin[0]; //read neighbour information vec4 neighinf = texelfetch(inputtex1, ivec2(vertexdata.xy), 0); vec4 storedcelldata = texelfetch(inputtex2, ivec2(vertexdata.xy), 0); if(storedcelldata.z > vertexdata.z storedcelldata.w == 0){ celldata = vertexdata; vec2 wcoord = vertexdata.xy / windowsize * 2.0-1.0; gl_position = vec4(wcoord,0,1); EmitVertex(); }...

//emit neighbours if connected //right if(neighinf.r == 1){ celldata = vertexdata; celldata.x += 1; celldata.z += 1; celldata.w = 3; storedcelldata = texelfetch(inputtex2, ivec2(celldata.xy), 0); if((storedcelldata.z > celldata.z storedcelldata.w == 0) && celldata.x < windowsize.x){ vec2 wcoord = celldata.xy / windowsize * 2.0-1.0; gl_position = vec4(wcoord,0,1); EmitVertex(); } }... EndPrimitive();

Hasonló a feladat, csak nincs elágazás Célcellából indulunk (pontprimitív) Kiolvassuk, hogy melyik cellából jutottunk ide Ez a cella lesz az új pont primitív (ki is rajzoljuk a képernyőre, hogy lássuk) Addig folytatjuk, míg el nem jutunk a start cellába (ahol az úthossz 0)

#version 130 #extension GL_EXT_geometry_shader4 : enable uniform sampler2d inputtex1; //cell information out vec4 celldata; void main(void){ vec2 windowsize = texturesize(inputtex1, 0); vec4 vertexdata = gl_positionin[0]; } vec4 storedcelldata = texelfetch(inputtex1, ivec2(vertexdata.xy), 0); if(storedcelldata.z == 0) return; if(storedcelldata.w == 1){ // right celldata = vertexdata; celldata.x += 1; vec2 wcoord = (celldata.xy * 2 + 1) / (windowsize * 2 + 1) * 2.0-1.0; gl_position = vec4(wcoord,0,1); EmitVertex(); }... EndPrimitive();