OpenGL OpenGL-översikt Geometri Operationer på hörn Projective shadows Advanced Rendering Techniques Using OpenGL, SIGGRAPH Courses 997. Gustav Taxén CID gustavt@nada.kth.se Bilddata Operationer på bildelement Rastrering Texturminne Operationer på fragment Framebuffert (bildbuffert + hjälpbuffertar) Viktigt att komma ihåg: OpenGL-kommandon Ex: ändra aktuell färg glcolor3f(.0,.0,.0); OpenGL är en tillståndsmaskin. Antal argument b byte s short i int f float d double ub unsigned byte us unsigned short ui unsigned int v vector (c array) R G B Argumentens datatyp Alla kombinationer är inte relevanta för alla kommandon! Geometrispecifikation Transformationer glbegin(gl_triangles); glvertex3f(.0, 0.0, 0.0); glvertex3f(0.0,.0, 0.0); glvertex3f(0.0, 0.0,.0); glend(); Alla hörn anges i homogena koordinater. Om w saknas sätts den till. Om z saknas sätts den till 0. Det är tillåtet (och önskvärt) att ange fler primitiver i rad. Data för hörn MÅSTE anges INNAN hörnets position. Transformation Transformation Projektion Viewporttransformation
Transformationer i OpenGL Objektkoord. x o y o z o w o x w y w z w Fönsterkoord. Matrisstack v e = M v o n = (M - ) T n Ögonkoord. x e y e z e w e (x w, y w, z w ) = (sx n + o, sy n + o, sz n + o) Matrisstack x n y n z n v c = P v e Normerade enhetskoord. Klippkoord. x c y c z c w c (Klippning) Exempel (0,0,) z glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(0.0, 0.0, -3.0); y (0,,0) (0,0,-2) (,0,0) x (0,,-3) (,0,-3) Exempel Transformation Byte av koordinatsystem glloadidentity(); gltranslatef(0,0,-3); glrotatef(50,0,,0); gltranslatef(0,0,3); glbegin(gl_triangles); glvertex3f(,0,0); glvertex3f(0,,0); glvertex3f(0,0,); glend(); Viktigt att komma ihåg: glpushmatrix pushar aktuellt koordinatsystem på stacken. glpopmatrix ersätter aktuellt koordinatsystem med det som finns överst på stacken. Animation och hierarkier Animation Modelviewmatris Projektionsmatris Perspektivdivision (x n, y n, z n ) = (x c / w c, y c / w c, z c / w c ) Viewporttransformation Uppdateringsmekanism Parametrar Rendering/ utritning OpenGL 2
Hierarkiska modeller Består-av-hierarki pivotpunkt Skelett Arm Överarm Underarm Lokala koordinatsystem Från hierarki till kod, steg Subnodens origo positioneras m.a.p. förälderns koordinatsystem. Skelett Arm void drawskeleton(void) { drawarm(); void drawarm(void) { drawupperarm(); drawlowerarm(); Överarm Underarm void drawupperarm(void) { void drawlowerarm(void) { Från hierarki till kod, steg 2 void drawskeleton(void) { glpushmatrix(); positionera armens origo; drawarm(); glpopmatrix(); void drawarm(void) { glpushmatrix(); positionera överarmens origo; drawupperarm(); glpopmatrix(); glpushmatrix(); positionera underarmens origo; drawlowerarm(); glpopmatrix(); Transformation av delträd Ändra rotation här! void drawskeleton(void) { glpushmatrix (); positionera armens origo; drawarm (); glpopmatrix (); 3
Demo Animationstekniker param 0 = f 0 (t) param = f (t) Kända Animationstekniker Animationstekniker Keyframing Inverse Kinematics (param 0, param, ) = F(x, y, z) Definieras implicit Kända Ljussättning: Phongs reflektionsmodell Ambient Matt Phongmodellen i OpenGL Color = Ambient + + [ MatDiffuse LightDiffuse i (N L i ) + i + MatSpecular LightSpecular i (E H) Shininess ] Ekvationen evalueras tre ggr: R, G, B. Speglande E H R N L i H= (E + L i ) / E + L i är en approximation av reflektionsvektorn R. 4
Phongmodellen i OpenGL Ljussättning av hörn Ljuskälla Ambient RGBA Diffuse RGBA Ambient RGBA Hörnets material Diffuse RGBA Specular RGBA, shininess + Hörn RGBA Specular RGBA Hörnets normal Ögats position (= världsorigo) Färg beräknas i varje hörn och interpoleras sedan över polygonen (Goraud shading). Bra att komma ihåg om ljussättning Då ljussättning är aktivt har aktuell färg ingen effekt. OpenGL stöder minst 8 aktiva ljuskällor. En ljuskälla avger en viss mängd av varje ljustyp. Då ljuskällans position specificras multipliceras den med aktuell modelviewmatris. Demo Back face culling Back face culling 90 o > 90 o Kamera glenable(gl_cull_face); 5
Normalen? Rastrering Fram/baksida beräknas genom tecknet i a = 0.5 x i y i - x i y i, 0 i (n - ), i (i + ) mod n, (x i, y i ) fönsterkoordinater för hörn nr i, n = antal hörn i polygonen Operationer på hörn: RGBA, z w, texturkoord. Fragment Denna beräkning visar om hörnen ligger i medsols eller motsols ordning. Konventionen är att motsols är riktat mot kameran. Operationer på bildelement Texturminne Bilddataspecifikation Operationer på bildelement Två typer av bilddata: Bitmap - bit per pixel. Bild - max 32 bitar per pixel. Finns ingen filformatstolk, data hämtas från C-array. (http://openil.sourceforge.net/) Byt plats på bytes i bilddata, delbilder Skalning & offset av bilddata, m.m. Processorminne Pixellagringslägen Pixeltransferoperationer Texturminne Bitmaps går direkt till rastreringen. Bilder går direkt till rastreringen eller lagras som texturdata (internt eller på grafikkortet). Rastrering (inkl. zoomning) Var ritas bilddata? Rita bild Aktuell rasterposition: glrasterpos2f(x, y); glrasterpos3f(x, y, z); glrasterpos4f(x, y, z, w); Då rasterpositionen anges transformeras den på samma sätt som övriga hörn. Jfr. position för ljuskällor! height gldrawpixels(width, height, format, type, const void *pixels); format R G B R G B R G B A R G B A R R R R (x w, y w, y w ) för aktuell rasterposition utgör origo för bilden/bitmapen. origo width type GL_UNSIGNED_BYTE GL_FLOAT 6
Texturer Texturer t s Demo MIP-maps Teknik för att undvika aliasing-problem vid texturförminskning. MIP-maps Filtrera ett antal texturer i förväg och lagra dem effektivt. Texturobjekt Filtreringsalternativ. Clamp/wrap-around för texturkoord. Texturobjekt Vid texturering väljs automatiskt den textur som passar bäst m.a.p. avstånd från kameran (om MIP-mapping är aktiverat). Texturkoordinat Texturappliceringsparametrar Texturkoordinater Rastrering 7
Texturobjekt Innehåller: Texturdata (texels). Information filter och texturkoordinatapplicering: gltexparameter Information om huruvida kopia av texturdata har laddats ned till grafikhårdvaran. Endast ett texturobjekt är aktivt! Förstoring och förminskning Textur FÖRSTORING Pixelpunkter på skärmen FÖRMINSKNING Pixelpunkter Textur på skärmen Alternativ: GL_NEAREST, GL_LINEAR, m.m. (Labbtips: GL_NEAREST_MIPMAP_LINEAR är default, men vi använder inte MIP-maps) Clamp/wrap around Texturdataspecifikation (s, t) = (.25, -2.75) t m GL_REPEAT GL_CLAMP origo n ram s (width, height) = (2 n + 2b, 2 m + 2b) där m, n är heltal 0, b = om texturen har ram, 0 annars. Texturdataspecifikation glteximage2d(gl_texture_2d, level, internalformat, width, height, border, format, type, const GLvoid *texels); level = MIP-mapnivå (= 0 på den här kursen) internalformat = internt lagringsformat (normalt = type) format, type som i gldrawpixels Observera att lagringslägen och transferoperationer även gäller texturer! Texturapplicering gltexenvi(gl_texture_env, GL_TEXTURE_ENV_MODE, mode); där mode är GL_DECAL = Ersätt RGB med texturdata, spara A. GL_REPLACE = Ersätt RGBA med texturdata. GL_MODULATE = Kombinera texturdata med ljussättning/färg. OBS! LAGRAS INTE I TEXTUROBJEKT! 8
Texturkoordinater Texturkoordinater gltexcoord2f(s, t); gltexcoord3f(s, t, r); gltexcoord4f(s, t, r, q); Anges före glvertex (precis som för normaler). s' t' r' q' = T s t r q t glmatrixmode(gl_texture); Texturkartan indexeras sedan med (s'/q', t'/q'). r'/q' ignoreras normalt, men används vid 3D-texturering. s PPM-biblioteket #include <GL/glut.h> #include <ppm.h> GLuint tex; int main(int argc, char *argv) { float *texels; int w, h; w = ppmwidth( img.ppm ); h = ppmheight( img.ppm ); texels = ppmread( img.ppm, NULL); PPM-biblioteket glutcreatewindow( Win ); glgentextures(&tex, ); glteximage2d(, w, h,, texels); Programmet xv kan läsa/skriva PPM-bilder (gör module add graphics). På Windows: PaintShop Pro. Bufferttester Djupbuffert och djuptest Djuptest Färgbuffert Fragment = (R, G, B, A, djup, texturkoordinat) Färgbuffert Djupbuffert Fönster Fragment 9
Mer information om OpenGL Woo, Neider, Davis: The OpenGL Programming Guide, Addison Wesley Developer Press. Segal, Akeley: The OpenGL Graphics System: A Specification. Version.3. X-Windows och Win32 Kilgard, OpenGL Programming for the X Window System, Addison Wesley Developer Press. Fosner, OpenGL Programming for Windows 95 and Windows NT, Addison Wesley Developer Press. Problem? Gå till http://www.opengl.org/ 0