GPU Szirmay-Kalos László.

Slides:



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

Grafikus Hardver Alapok
2D képszintézis Szirmay-Kalos László.
2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus editor: GUI, use-case, dinamikus modell L L L R LD LU MouseLDown első pont MouseLDown második...
Inkrementális 3D képszintézis
Geometriai modellezés
2D grafikus rendszerek Szirmay-Kalos László.
Inkrementális 3D képszintézis Szirmay-Kalos László.
3D képszintézis fizikai alapmodellje
2D képszintézis Szirmay-Kalos László. Számítógépes grafika feladata képszintézis Virtuális világ modell modellezés Metafórák: 2D rajzolás világ = sík.
Geometriai modellezés
Számítógépes grafika és képfeldolgozás
Számítógépes grafika 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.
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.
 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.
Grafikus Rendszerek Zsitnyánszki Zoltán.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, D képszintézis 4. előadás.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
Textúrák, világmodellek
A számítógépes grafika céljai és feladatai
A számítógépes grafika céljai és feladatai
2D képszintézis és textúrák
Számítógépes grafika 3. gyakorlat.
4.7. Textúra A felület anyagszerűsége Sík-képek ráborítása a felületre
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.
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.
Pixel műveletek, képek Szirmay-Kalos László.
Grafikus alaphardver Szirmay-Kalos László. Jelfeldolgozási megközelítés modellezés modell képszintézis Digitális kép megjelenítés Analog Digitál Képinformáció.
Térfogatvizualizáció
Térfogatvizualizáció
2D képszintézis Szirmay-Kalos László.
Inkrementális 3D képszintézis Szirmay-Kalos László.
Számítógépes grafika Bevezetés
Rendering pipeline Ogre3D
Grafikus játékok fejlesztése Szécsi László t09-texture
 Kvantált kép fényesség értékei: G [ 0, Gmax ]  G fényességű pontok száma: P(G)
Inkrementális 3D képszintézis
GPU ELTE IK Számítógépes Grafika II. Jeni László Attila
OpenGL 4 shaderek, GLSL Valasek Gábor
GPGPU A grafikus hardver általános célú felhasználása
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.
Fotorealisztikus képszintézis valós időben Szirmay-Kalos László, Csébfalvi Balázs BME IIT.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
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ó.
Digitális képanalízis
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?
3D grafika összefoglalás
Lighting III.
Általános célú számítások a GPU-n
A grafikus hardware programozása
OpenGL 2. gyakorlat Valasek Gábor
Vizualizáció és képszintézis
Vizualizáció és képszintézis
OpenGL II.
Bevezetés GPGPU Alkalmazások.
Bevezetés Tematika Számonkérés Irodalom
Előadás másolata:

GPU Szirmay-Kalos László

GPU csúcspont primitív fragmens pixel CPU Interfész Vertex Shader Fragment Transzformáció+ Illumináció Geometry Shader primitív Vágás + Viewport transzf. + Raszterizáció + interpoláció Textúrázás Textúra memória fragmens Kompozitálás (mélység, átlátszóság) Bufferek: szín, z, … pixel

Vertex shader és környezete glBegin(GL_TRIANGLES) glVertex glNormal glColor glTextCoord CPU glEnd( ) GPU POSITION, NORMAL, COLOR0, TEXTCOORD0,… Állapot Transzformációk Fényforrások Anyagok *MV *MVIT Vertex shader *MVP Illumináció POSITION, COLOR0, TEXTCOORD0,… háromszögre Geometry shader Vágás: -w<X<w, -w<Y<w, -w<Z<w Homogén osztás: X=X/w, Y=Y/w, Z=Z/w + viewport transzformáció

“Standard” vertex shader (Cg, Shader Model 3.0) void main( in float4 position : POSITION, in float3 normal : NORMAL, in float4 color : COLOR0, in float2 texcoord : TEXCOORD0, uniform float4x4 modelviewproj : state.matrix.mvp, out float4 hposition : POSITION, out float4 ocolor : COLOR0, out float2 otexcoord : TEXCOORD0 ) { hposition = mul(modelviewproj, position); otexcoord = texcoord; ocolor = color; } Változó bemenet Uniform Változó kimenet glDisable(GL_LIGHTING ); Mezők elérése: v.x, v.y, v.z, v.w, v.xy, v.wxx c.r, c.rgb, c.ar, …

glEnable(GL_LIGHTING ); main( in float4 position : POSITION, in float4 normal : NORMAL, uniform float4x4 modelview, modelviewIT, modelviewproj, uniform float4 lightpos, Idiff, Iamb, Ispec,  uniform float4 em, ka, kd, ks,  uniform float shininess, out float4 hposition : POSITION, out float4 ocolor : COLOR0 ) { hposition = mul(modelviewproj, position); float3 N = mul(modelviewIT, normal).xyz; N = normalize(N); // glEnable(GL_NORMALIZE) float3 cpos = mul(modelview, position).xyz; float3 L = normalize(lightpos – cpos); float costheta = dot(N, L); if (costheta < 0) costheta = 0; float3 V = normalize(-cpos); float3 H = normalize(L + V); float cosdelta = dot(N, H); if (cosdelta < 0) cosdelta = 0; ocolor = em + Iamb * ka + Idiff * kd * costheta + Ispec * ks * pow(cosdelta, shininess); } L N V

Pixel shader és környezete POSITION, COLOR0, TEXTCOORD0,…háromszög csúcsokra Háromszög kitöltés és interpoláció POSITION, COLOR0, TEXTCOORD0,… pixelekre Állapot Textúra azonosító és paraméterek Fragment shader Textúrázás POSITION, COLOR Textúra memória Kompozitálás: blending, z-bufferelés Rasztertár (szín, mélység, …)

“Standard” pixel shader void main( in float4 color : COLOR0, out float4 ocolor : COLOR ) { ocolor = color; } void main( in float2 texcoord : TEXCOORD0, in float3 color : COLOR0, uniform sampler2D texture_map, out float4 ocolor : COLOR ) ocolor = tex2D(texture_map, texcoord); glDisable(GL_TEXTURE_2D); *color; glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

Gouraud helyett Phong árnyalás Per-vertex helyett per-pixel árnyalás

Gouraud (per-vertex) árnyalás CPU program Illumináció Vertex shader Raszterizáció interpoláció Pixel shader pozíció normálvektor Transzformációk Anyagok Fényforrások Interpolált szín Transzf. poz. szín

Phong (per-pixel) árnyalás CPU program Illumináció Vertex shader Raszterizáció interpoláció Pixel shader pozíció normálvektor Transzformációk Fényforrás poz. Transzf. poz. N=Transzf.normál V=Nézeti irány L=Fény irány Interpolált N,V,L Anyagok Fény intenzitás

Programok (lábbal hajtós megoldás) .cpp CPU program: Shader environment létrehozás GPU képesség beállítás (profile) Vertex/fragment program betöltés és fordítás: CREATE Vertex/fragment program átadás a GPU-nak: LOAD Vertex/fragment program kiválasztás: BIND Uniform vertex/fragment input változó létrehozás Uniform vertex/fragment változó értékadás Változó input változó értékadás (glVertex, glColor, glTexCoord) .cg vertex program Fragment program változó input változó + homogén pozíció .cg fragment program Szín kimenet Inicializálás Display

CPU program - Inicializálás … #include <Cg/cgGL.h> // Cg függvények CGparameter Lightpos, Shine, Ks, Kd; // uniform paraméterek a CPU-n int main( ) { CGcontext shaderContext = cgCreateContext(); // árnyaló kontextus CGprofile vertexProf = cgGLGetLatestProfile(CG_GL_VERTEX); cgGLEnableProfile(vertexProf); CGprogram vertexProgram = cgCreateProgramFromFile( shaderContext, CG_SOURCE, “vertex.cg", vertexProf, NULL, NULL); cgGLLoadProgram(vertexProgram); // GPU-ra töltés cgGLBindProgram(vertexProgram); // ez legyen a futó program // vertex program uniform paraméterek. CPU-n Lightpos; GPU-n clightpos Lightpos = cgGetNamedParameter(VertexProgram, “clightpos"); Vertex shader betöltés

Fragmens árnyaló betöltés CGprofile fragmentProf = cgGLGetLatestProfile(CG_GL_FRAGMENT); cgGLEnableProfile(fragmentProf); CGprogram fragmentProgram = cgCreateProgramFromFile( shaderContext, CG_SOURCE, “fragment.cg", fragmentProf, NULL, NULL); cgGLLoadProgram(fragmentProgram); // GPU-ra töltés cgGLBindProgram(fragmentProgram); // ez a program fusson // fragmens program uniform paraméterek Shine = cgGetNamedParameter(fragmentProgram, "shininess"); Kd = cgGetNamedParameter(fragmentProgram, "kd"); Ks = cgGetNamedParameter(fragmentProgram, "ks"); … OpenGL inicializálás

CPU program - OpenGL display void Display( ) { // állapot (implicit uniform) paraméterek beállítása glLoadIdentity(); gluLookAt(0, 0, -10, 0, 0, 0, 0, 1, 0); glRotatef(angle, 0, 1, 0); // explicit uniform paraméterek beállítása cgGLSetParameter3f(Lightpos, 10, 20, 30); // clightpos cgGLSetParameter1f(Shine, 40); // shininess cgGLSetParameter3f(Kd, 1, 0.8, 0.2); // kd cgGLSetParameter3f(Ks, 2, 2, 2); // ks // változó paraméterek, a PASS glBegin( GL_TRIANGLES ); for( … ) { glNormal3f(nx, ny, nz); // NORMAL regiszter glVertex3f(x, y, z); // POSITION regiszter + trigger } glEnd();

Phong árnyalás: vertex shader void main( in float4 position : POSITION; in float4 normal : NORMAL; uniform float4x4 MVP : state.matrix.mvp, uniform float4x4 MV : state.matrix.modelview, uniform float4x4 MVIT : state.matrix.modelview.invtrans, uniform float3 clightpos, // fényforrás poz. kamerak-ban out float4 hposition : POSITION; out float3 cnormal : TEXCOORD0; out float3 cview : TEXCOORD1; out float3 clight : TEXCOORD2; ) { hposition = mul(MVP, position); float3 cpos = mul(MV, position).xyz; cnormal = mul(MVIT, normal).xyz; clight = clightpos - cpos; cview = -cpos; } L N V

Phong árnyalás: fragment shader void main( in float3 N : TEXCOORD0, in float3 V : TEXCOORD1, in float3 L : TEXCOORD2, uniform float shininess, uniform float3 kd, uniform float3 ks, out float3 ocolor : COLOR ) { N = normalize( N ); V = normalize( V ); L = normalize( L ); float3 H = normalize(V + L); ocolor = kd * max(dot(N, L), 0) + ks * pow(max(dot(N, H), 0), shininess); } L N V

NPR void main( in float3 N : TEXCOORD0, in float3 V : TEXCOORD1, in float3 L : TEXCOORD2, uniform float3 kd, out float3 ocolor : COLOR ) { N = normalize( N ); V = normalize( V ); L = normalize( L ); float costheta = dot(N, L); float y = (costheta >= 0) ? 0.5f : 0.2f; if (abs(dot(N, V)) < 0.1) ocolor = float3(0, 0, 0); else ocolor = y * kd; }

Árnyék térképek Tl Tv Y 1. pass: Z X 2. pass: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(lightx, lighty, lightz, lookatx, lookaty, lookatz, lupx, lupy, lupz); Modellezési transzformáció Képszintézis Z-buffer -> textúra másolás (v. közv) 2. pass: gluLookAt(eyex, eyey, eyez, upx, upy, upz); Képszintézis + árnyék teszt Árnyék térképek Z X Tl Tv

Képszintézis + árnyékteszt DepthMap id CPU program Pixel shader Vertex shader Raszterizáció Interpoláció Pozíció Szín MVP, LMVP transzformációk Transzf. Poz. Szem norm. képernyő Fény norm. képernyő Szín DepthMap texelek

Vertex shader Vertex Shader void main( in float4 position : POSITION, in float4 color : COLOR0, uniform float4x4 MVP, uniform float4x4 LMVP, out float4 hPosition : POSITION, out float4 lPosition : TEXCOORD0, out float4 ocolor : COLOR0 ) { ocolor = color; // model-space -> to light's (depth map's) clipping space lPosition = mul(LMVP, position); // model-space to eye's clipping space hPosition = mul(MVP, position); } Vertex Shader hposition position lposition

Fragment shader 1,1 Y Y X Z X -1,-1 0, 0 fragment Pixel shader color void main( in float4 lPosition : TEXCOORD0, in float4 color : COLOR0, uniform sampler2D depthMap, uniform float bias, out float4 ocolor : COLOR ) { float3 lPosCartesian = lPosition.xyz/lPosition.w; float2 texcoord; texcoord.x = (lPosCartesian.x + 1)/2; texcoord.y = (lPosCartesian.y + 1)/2; float this_depth = (lPosCartesian.z + 1)/2 - bias; float stored_depth = tex2D(depthMap, texcoord); bool vis = (this_depth <= stored_depth); // == kéne ocolor = vis * color; } lposition Clipping space to Texture space

Projektív textúrázás mátrixa float3 lPosCartesian = lPosition.xyz/lPosition.w; texcoord.x = (lPosCartesian.x + 1)/2; texcoord.y = (-lPosCartesian.y + 1)/2; float this_depth = (lPosCartesian.z + 1)/2 - bias; Model Light’s camera Light’s perspective ½ 0 0 0 0 ½ 0 0 0 0 ½ 0 ½ ½ ½-b 1 X, Y, Z, 1

Egyszerűbb árnyékteszt void SM_VS ( in float4 position : POSITION, in float4 color : COLOR0, uniform float4x4 MVP, uniform float4x4 LMVPT, out float4 hPosition : POSITION, out float4 depthPos : TEXCOORD0, out float4 ocolor : COLOR0 ) { ocolor = color; depthPos = mul(LMVPT, position); hPosition = mul(MVP, position); } void SM_FS ( in float4 lPosition : TEXCOORD0, in float4 color : COLOR0, uniform sampler2D depthMap, out float4 ocolor : COLOR ) { ocolor = color * tex2Dproj(depthMap, lPosition); Returns 0/1 If it is a depth texture

Árnyéktérkép aliasing

Classic shadow map Variance shadow map

Fénytörés és visszaverődés

Visszaverődés/törés számítás Environment map id CPU program Pixel shader Vertex shader Raszterizáció Interpoláció Pozíció Normál Transzformációk törésmutató Transzf. Poz. Világ normál Világ nézet Interpolált normál nézeti irány Env.Map texelek

Vertex shader void main( in float4 position : POSITION, in float4 normal : NORMAL, uniform float4x4 MVP, // modelviewproj uniform float4x4 M, // model uniform float4x4 MIT, // IT of model uniform float3 eye, // eye in world out float4 hPos : POSITION, out float3 V : TEXCOORD0,// view in world out float3 N : TEXCOORD1 // normal in world ) { hPos = mul(MVP, position); float3 x = mul(M, position).xyz; // transform to world sp. V = eye - x; N = mul(MIT, normal).xyz; }

Fragment shader void main( in float3 V : TEXCOORD0, in float3 N : TEXCOORD1, uniform float n, // IOR uniform samplerCUBE envMap, out float3 color ) { V = normalize(V); N = normalize(N); float3 T = refract(V, N, 1/n); float3 R = reflect(V, N); float3 refractedRad = texCUBE(envMap, T).rgb; float3 reflectedRad = texCUBE(envMap, R).rgb; float F0 =(n-1)*(n-1)/(n+1)/(n+1); float F = F0 + (1-F0) * pow(1-dot(N,V), 5); color = F * reflectedRad + (1 – F) * refractedRad; }

RayTrace Car The second demo game is a driving simulator game. Here the car is reflective, and the wheels generate caustics. In this arena the goal is to push bit glass bottles that are reflective/refractive and also caustic generators. When the car moves in this corridor, we can observe the indirect diffuse/glossy reflections as well. In the other arena, gas tanks should be hit, where the explosions are generated with spherical billboards.

Űrállomás

Moria

Óceán

Többszörös szóródás

Geometria árnyaló Procedurális geometria Catmull-Clark subdivision

Minden kimeneti tömbelemre GPGPU Az eredménytömb mely elemeit számítjuk ki Geometria: „háromszögek” Eredmény tömb Bemeneti adat Képszintézis Kimeneti kép Bemeneti kép Textúra vagy rasztertár Textúrák Minden kimeneti tömbelemre ugyanaz az algoritmus, más adatokra: SIMD

Bemeneti adat Eredmény tömb Melyik kimeneti tömbelemet számítjuk „Teljes képernyős” téglalap (CPU): glViewport(0, 0, HRES, VRES) glBegin(GL_QUADS); glTexCoord2f(1,1); glVertex4f(-1,-1, 0, 1); glTexCoord2f(1,0); glVertex4f(-1, 1, 0, 1); glTexCoord2f(0,0); glVertex4f( 1, 1, 0, 1); glTexCoord2f(0,1); glVertex4f( 1,-1, 0, 1); glEnd( ); Vertex shader (Cg): void main ( in float4 Pos : POSITION, in float2 Tex : TEXCOORD0, out float4 hPos : POSITION, out float2 oTex : TEXCOORD0 ) { hPos = Pos; oTex = Tex; } Fragment shader (Cg): void main ( in float2 Tex : TEXCOORD0 , uniform sampler2D bemAdat, out float4 result : COLOR ) { result = Bemeneti képből számított adat a tex2D(bemAdat, f(Tex)) alapján; Melyik kimeneti tömbelemet számítjuk Bemeneti adat Eredmény tömb

CUDA GPU CPU + SIMD Kernel program(ok): Szálak Szálblokk, szálblokk, Nyüst, nyüst, … Host program Szálblokk Közös gyors memória Közös Utasítás végrehajt SIMD

Két N elemű vektor összeadása GPU-n fut, CPU-ról hívható __global__ void AddVectorGPU( float *C, float *A, float *B, int N ) { int i = blockIdx.x * blockDim.x + threadIdx.x; // szálazonosító if (i < N) C[i] = A[i] + B[i]; } float C[100000], A[100000], B[100000]; int main ( ) { … int N = 100000; int blockDim = 256; // szálak száma egy blokkban: 128, 256, 512 int gridDim = (N + blockDim – 1) / blockDim; // szálblokkok száma AddVectorGPU<<<gridDim, blockDim>>>(C, A, B, N); 0 ,…, gridDim.x-1 0 ,…, blockDim.x-1 …

Folyadékszimuláció

Smoothed Particle Hydrodynamics (SPH) Particles were rendered as small spheres in a distributed way and the final image was produced by depth compositing of the ParaComp library. We executed simulations from a few thousand up to a hundred thousand particles. According to the measurements, the communication overhead makes the distributed simulation slower than the single node implementation if the particle count is moderate. However, it is impossible to simulate higher number of particles in real time on a single node, so these problems can only be solved in a distributed way. We also plan to develop more sophisticated visualization techniques for the flow, which increases the computational burden associated with a single particle. In this case, the communication overhead gets relatively small, so the distributed solution will be preferred even at moderate particle counts.

Többszörös szóródás diffúzióval

Pozitron emissziós tomográfia