Beveetés
A sámítógépes grafika inkrementális képsintéis algoritmusának hardver realiációja Teljesítménykövetelmények: Animáció: néhány nsec/ képpont Massívan párhuamos Pipeline(stream processor) Párhuamos ágak
MODELVIEW PROJECTION Virtuális világ 2. 1. Kamera transformáció, illumináció Perspektív transformáció + Vágás homogén koordinátákban sín mélység Képernyő transf+rasteriáció+interpoláció megjelenítés
x3, y3, 3 x2, y2, 2 (u3, v3) (u1, v1) (u2, v2) (u3, v3) (u2, v2) x1, y1, 1 Interpolációval: (u1, v1) (u, v) sín (u1, v1) (u2, v2) (u3, v3) Textúra objektum a grafikus kártya memóriájában: kép + sűrés + kilógás keelés
Descartes: (x,y,) Homogén: [X,Y,Z,w] = [xw,yw,w,w] Miértjó? Eltolás, elforgatás, köéppontos vetítés, stb. mind 4x4-es mátrixsal sorás Több transformáció egyetlen mátrixban össefogható Párhuamosok nem okonak gondot (párhuamosok ideális pontban metsik egymást) A homogén koordináták lineáris transformációi: háromsöget háromsögbe visnek át
x, y, a irány w a távolság invere y [x,y,1] [x,y,1/3] [2x,2y,1] = [x,y,1/2] [x,y,0] x
Eltolás Elforgatás [x,y,,1] [x,y,,1] 1 1 1 px, py, p, 1 cosα sinα -sinα cosα 1 1 Skáláás [x,y,,1] Sx Sy S 1
Vetítés ( ) 1,,,, y x y x Nem lineáris = = = = = 1 ' 1 ' 1 1 ' b f K + = ' β α -f -b ( ) + =,1,, ', ', ', ' β α y x w y x ( ) y x,,, 2 β α Nem lineáris
Vetítés ( ) + = + =,1,, ', ', ', ' ' y x w y x β α β α ( ) β α 1 1 -α -1 -β 0 [x,y,,1] ( ) y x,,, β α Lineáris
MODELVIEW PROJECTION Virtuális világ Kamera transformáció Perspektív transformáció [x,y,,1] T modelviewproj = [X,Y,Z,w] Z camera
(1, 1, 1) -1 < x < 1-1 < y < 1-1 < < 1 w > 0 (-1,-1,-1) -w < X < w -w < Y < w -w < Z < w [X,Y,Z,w] = [xw,yw,w,w]
(-1,-1,-1) (1, 1, 1)
(-1,-1,-1) (1, 1, 1)
(1, 1, 1) (-1,-1,-1) Képernyő k. 1 Z(-1,1) (0,1)
(X 3,Y 3 ) (X 2,Y 2 ) (X 1,Y 1 )
Z (X 2,Y 2,Z 2 ) Z(X,Y) = ax + by + c (X 3,Y 3,Z 3 ) Y (X 1,Y 1,Z 1 ) X Z(X,Y) Z(X+1,Y) = Z(X,Y) + a
X Z(X,Y) X sámláló Z register CLK Σ a
v Y Perspektív helyes u X u/w =a u X+b u Y+c u v/w = a v X+b v Y+c v 1/w =a w X+b w Y+c w u = a u X+b u Y+c u a h X+b h Y+c h lineáris w = - v = a v X+b v Y+c v a h X+b h Y+c h
X Div u Div v [u/h](x,y) [v/h](x,y) [1/h](X,Y) X sámláló [u/h] register [v/h] register [1/h] register CLK Σ Σ Σ a u a v a h
2. 1. 3. 0.3 0.6 0.8 0.6 0.3 = 1 Sín buffer Mélység buffer Z-buffer
Interpolált vagy textúrából olvasott sín (R s,g s,b s,a s ) (R d,g d,b d,a d ) * * első első (R,G,B,A) ALU Rastertár (R,G,B,A) = (R s A s +R d (1-A s ), G s A s +G d (1-A s ), B s A s +B d (1-A s ), A s A s +A d (1-A s ))
Csúcspont Transf.+ megvilágítás Vágás + homogén ostás Képernyő transf Triangle setup Rasteriáció+ interpoláció Textúráás Z-buffer kompoit Rastertár
Korai nem PC rendserek A teljes csőveeték megvalósítva Workstation és Graphics Terminal HP, Sun, Textronix Csúcspont Transf.+ megvilágítás Vágás + homogén ostás Képernyő transf Triangle setup Rasteriáció+ interpoláció Textúráás Z-buffer kompoit Rastertár
1970-1990 Tipikusan 2D Spriteok, primitivek Blitter, vonal, négysög rajolás Ablakkeelő gyorsítás Amiga, Atari, S3 Csúcspont Transf.+ megvilágítás Vágás + homogén ostás Képernyő transf Triangle setup Rasteriáció+ interpoláció Textúráás Z-buffer kompoit Rastertár
1990-1998 Vertex feldolgoás, textúra sűrés, Z-buffer PlayStation, Nintendo64 S3 Virge, ATI Rage, Matrox Mystique 3dfx Voodoo 3dfx Glide Microsoft DirectX 5.0 Csúcspont Transf.+ megvilágítás Vágás + homogén ostás Képernyő transf Triangle setup Rasteriáció+ interpoláció Textúráás Z-buffer kompoit Rastertár
1990-2000 A csőveetés felbontása Transform& Lighting Microsoft DirectX 7.0 OpenGL NVIDIA GeForce 256 (NV10) a első nem professionális 3D gyorsító Csúcspont Transf.+ megvilágítás Vágás + homogén ostás Képernyő transf Triangle setup Rasteriáció+ interpoláció Textúráás Z-buffer kompoit Rastertár
2000 Shaderek megjelenése Vertex és fragmens shader (2001) Geometria shader (2006) Programoható tesselátor (2010) Csúcspont Transf.+ megvilágítás Vágás + homogén ostás Képernyő transf Triangle setup Rasteriáció+ interpoláció Textúráás Z-buffer kompoit Rastertár
Általános felület a GPU-ho Csőveeték veérlése Shaderek Geometria definíció Textúrák Framebuffer Párhuamos renderelés
Microsoft DirectX Windows specifikus DirectX7: transform & lighting DirectX9: vertex és pixel shader DirectX10: geometry shader DirectX11: tesselation, DirectCompute
OpenGL OpenGL 2.0: vertex és pixel shader OpenGL 3.0: framebuffer objects OpenGL 3.1: opencl interop OpenGL 3.2: geometry shader OpenGL 3.3/4.0: tesseláció, GPGPU
CUDA Compute Unified Device Architecture 2007. NVIDIA Magas sintű, C serű nyelv Atomi műveletek Savaás Dupla pontosságú sámítás Sinkroniáció
OpenCL 2008 november, Khronos Group Gyártó független GPGPU API CPU és GPU össemosás ATI, Intel, Apple, IBM és NVIDIA
CPU Textúra memória Vertex buffer Transformáció+ Vertex Illumináció Shader Geometry Shader Vágás + Viewport transf. + Rasteriáció + interpoláció Korai eldobás Fragment Textúráás Shader csúcspont primitív GPU fragmens Kompoitálás (mélység, átlátsóság) Bufferek: sín,, pixel
Felsín árnyaló (Hull Shader) Felbontás veérlése Tesselátor (Tesselator) Fix funkciójú egység Tartomány árnyaló (Domain Shader) Felbontás ellenőrése Vertexek létrehoása Vertex Shader Hull Shader Tesselator Domain Shader Geometry Shader
glbegin(gl_triangles) glvertex glnormal glcolor gltextcoord glend( ) POSITION, NORMAL, COLOR0, TEXTCOORD0, *MVP Illumináció Vertex shader Vágás: -w<x<w, -w<y<w, -w<z<w CPU GPU Állapot Transformációk Fényforrások Anyagok POSITION, COLOR0, TEXTCOORD0, háromsögre Geometry shader Homogén ostás: X=X/w, Y=Y/w, Z=Z/w + viewport transformáció
POSITION, COLOR0, TEXTCOORD0, háromsög csúcsokra Háromsög kitöltés és interpoláció POSITION, COLOR0, TEXTCOORD0, pixelekre Korai -eldobás Fragment shader Textúráás X,Y, DEPTH COLOR Kompoitálás: blending, -bufferelés Állapot Textúra aonosító és paraméterek Textúra memória Rastertár és -buffer
.cpp CPU program: GLUT, OpenGL inicialiálás Shader environment létrehoá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álastás: BIND Uniform vertex/fragment input váltoó létrehoás Uniform vertex/fragment váltoó értékadás Váltoó input váltoó értékadás (glvertex, glcolor, gltexcoord) Inicialiálás Display.cg vertex program Fragment program váltoó input váltoó + homogén poíció.cg fragment program Sín kimenet
OpenGL/GLUT inicialiálás, textúra feltöltés #include <GL/glut.h> int main(int argc, char* argv[]) { glutinit(&argc, argv); glutinitdisplaymode(glut_rgba GLUT_DEPTH GLUT_DOUBLE); glutinitwindowsie(600, 600); glutcreatewindow( GLUT Window ); InitCg(); glutdisplayfunc(ondisplay); glutkeyboardfunc(onkeyboard); glutidlefunc(onidle); } glutmainloop(); return(0);
Árnyaló inicialiálás #include <Cg/cgGL.h> // Cg függvények Vertex shader betölté és CGparameter LightDir, TextureShift; // uniform paraméterek a CPU-n int InitCg( ) { 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); cgglbindprogram(vertexprogram); // GPU-ra töltés // e legyen a futó program // vertex program uniform paraméterek. CPU-n LightPos; GPU-n lightpos LightPos = cggetnamedparameter(vertexprogram, lightpos");
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); // e a program fusson // fragmens program uniform paraméterek TextureShift = cggetnamedparameter(fragmentprogram, shift");
void ondisplay( ) { // á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); // lightpos cgglsetparameter1f(shine, 40); // shininess cgglsetparameter3f(kd, 1, 0.8, 0.2); // kd cgglsetparameter3f(ks, 2, 2, 2); // ks // váltoó paraméterek, a PASS glbegin( GL_TRIANGLES ); for( ) { gltexcoord2f(u, v); // TEXCOORD0 register glvertex3f(x, y, ); } glend(); // POSITION register + trigger
void main( in float4 position : POSITION, in float4 texcoord : TEXCOORD0, in float3 normal : NORMAL, in float3 color : COLOR0, uniform float4x4 MVP : state.matrix.mvp, uniform float3 lightpos, // fényforrás világ k-ban out float4 hposition : POSITION, out float3 otexcoord : TEXCOORD0, out float3 ocolor : COLOR0 ) { hposition = mul(mvp, position); L ocolor = color * dot(normal, lightpos); N otexcoord = texcoord; }
void main( in float2 texcoord : TEXCOORD0, in float3 color : COLOR0, uniform sampler2d texture_map, uniform float2 shift, out float4 ocolor : COLOR ) { texcoord += shift; float3 texcol = tex2d(texture_map, texcoord); ocolor = texcol * color; }