Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

OpenGL Szirmay-Kalos László In theory, there is no difference between theory and practice. In practice, there is.

Hasonló előadás


Az előadások a következő témára: "OpenGL Szirmay-Kalos László In theory, there is no difference between theory and practice. In practice, there is."— Előadás másolata:

1 OpenGL Szirmay-Kalos László In theory, there is no difference between theory and practice. In practice, there is.

2 OpenGL: primitívek GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POLYGON GL_TRIANGLE_STRIP GL_TRIANGLES GL_TRIANGLE_FAN GL_QUADS glBegin(GL_TRIANGLES); Csúcspont tulajdonságok … glVertex3d(x, y, z); … glEnd( );

3 OpenGL csővezeték Virtuális világ Kamera transzformáció, illumináció Perspektív transzformáció + Vágás homogén koordinátákban 1.2. Képernyő transzf+Raszterizáció+interpoláció megjelenítés szín mélység MODELVIEWPROJECTION

4 szín Textúra leképzés (u3, v3) (u1, v1) (u2, v2) Interpolációval: (u, v) Textúra objektum a grafikus kártya memóriájában: Kép + szűrés + kilógás kezelés x1, y1, z1 x2, y2, z2 x3, y3, z3 (u1, v1) (u2, v2) (u3, v3) (u1, v1) (u3, v3) (u2, v2)

5 Transzformációk xyzhxyzh Modelview mátrix Verem Projection mátrix Verem Homogén osztás Viewport transzf. Referencia helyzet Kamera k. Homogén vágási k. Normalizált képernyő illumináció vágás Triangle setup, Backface culling, Vetítés, Raszterizáció, Textúrázás modellező, kamera (nyírás), normalizáló perspektív képernyő

6 A csővezeték etetése: A modell glBegin(GL_TRIANGLES); glNormal3f(nx1,ny1,nz1); glColor3f(r1,g1,b1); glTexCoord2f(u1,v1) glVertex3f(x1,y1,z1); glNormal3f(nx2,ny2,nz2); glColor3f(r2,g2,b2); glTexCoord2f(u2,v2) glVertex3f(x2,y2,z2); … glEnd( ); állapot

7 glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); gluLookAt(eyex, eyey, eyez, vrpx, vrpy, vrpz, upx, upy, upz); //VIEW glTranslatef(px, py,pz); //MODEL glRotatef(ang, axisx,axisy,axisz); glScalef(sx, sy, sz); MODELVIEW transzformáció sorrend u x u y u z 0 v x v y v z 0 w x w y w z 0 eye 1 Kamera koordinátarendszer eye u v w x,y,z,1 T view 1 px py pz 1 R sx sy sz 1

8 Illumináció Phong-Blinn model Color = Emission + ka * Ia + kd * Id · (N  L) + + ks * Is · ((N  H) + ) shininess Glfloat kd[] = {0.0, 1.0, 1.0, 1.0}; Glfloat ks[] = {1.0, 0.5, 1.0, 1.0}; Glfloat ka[] = {0.2, 0.0, 0.2, 1.0}; glMaterialfv( GL_FRONT, GL_AMBIENT, ka); glMaterialfv( GL_FRONT, GL_DIFFUSE, kd); glMaterialfv( GL_FRONT, GL_SPECULAR, ks); glMaterialf( GL_FRONT, GL_SHININESS, 20); glEnable( GL_NORMALIZE ); glBegin(GL_TRIANGLES); glNormal3d(0.0, 0.0, 1.0); glVertex3d(10.0, 20.0, 10.0); glNormal3d(1.0, 0.0, 0.0); glVertex3d(10.0, 10.0, 10.0); …. A szín a megvilágításból keletkezzen: glEnable(GL_LIGHTING ); N L V H Kamera k.

9 Fényforrások Glfloat I[] = {0.0, 1.0, 1.0, 0.0}; Glfloat pos[] = {10, 20, 10, 1.0 }; glLightfv(GL_LIGHT0, GL_DIFFUSE, I); glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT1,…. glEnable(GL_LIGHT0 ); // bekapcs Ha h = 0, akkor direkcionális egyébként pozícionális Külön fényintenzitás az ambiens, diffúz, spekuláris visszaverődéshez Direkcionális, Pozicionális (izotróp ill. spot) Attenuation: 1/(k0+ k1·d + k2·d 2 ) direkcionális Izotróp pozicionális Spot: cos n  d Model View Kamera k.

10 PROJECTION transzformáció glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluPerspective(fov, asp, fp, bp); Kamera k.Homogén, vágási k. (1, 1, 1, 1) (-1,-1,-1, 1) fp bp 1/(tg(fov/2)·asp) /tg(fov/2) (fp+bp)/(bp-fp) fp·bp/(bp-fp) 0 -h < X h < h -h < Y h < h -h < Z h < h Vágás

11 Képernyő transzformáció glViewport( left, bottom, width, height ); Normalizált képernyő k.: Vágás és homogén osztás után 1 (-1,-1,-1) (1, 1, 1) Képernyő k.

12 Z-bufferes takarás és konstans vagy Gouraud árnyalás 1.2. szín mélység glEnable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); glDisable(GL_TEXTURE_2D); Inicializálás: glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); glShadeModel(GL_FLAT); glShadeModel(GL_SMOOTH);

13 Textúra leképzés (u1, v1) (u2, v2) (u3, v3) glBegin(GL_TRIANGLES); glTexCoord2d(u1, v1); glVertex3d(x1, y1, z1); glTexCoord2d(u2, v2); glVertex3d(x2, y2, z2); … Ne az interpolált szín legyen a pixel szín: glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //GL_MODULATE Textúra kiválasztása: glBindTexture(GL_TEXTURE_2D, id); szín (u3, v3) (u1, v1) (u2, v2) Interpolációval: (u, v) Textúra objektum a grafikus kártya memóriájában

14 Textúra szűrés glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); Mip-map is van: Az a default: 

15 unsigned int texids; glGenTextures(1, &texids); glBindTexture( GL_TEXTURE_2D, texids ); int level = 0, border = 0, width = 256, height = 256; // 2 hatvány !!! unsigned char image[256*256*3]; // Feltöltés BMP, TGA, JPG fáljból. glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, width, height, border, GL_RGB, GL_UNSIGNED_BYTE, &image[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // default Textúra objektum létrehozása

16 Átlátszóság: Sorrend számít! glEnable(GL_BLEND); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SCR_ALPHA ); glBegin( … ); Geometria … glEnd(); glDisable(GL_BLEND); Interpolált vagy textúrából olvasott szín Rasztertár ALU (R s,G s,B s,A s )(R d,G d,B d,A d ) (R,G,B,A) (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 )) * * hátsó első

17 Dupla buffer animációhoz Rasztertár 1. Rasztertár 2. monitor glClear(GL_COLOR_BUFFER_BIT); rajzol… glutSwapBuffers( ); Inicializálás: glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

18 Példa: Háromszög int main(int argc, char * argv[]) { glutInitWindowSize(600, 600); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("3D progim"); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glViewport(0, 0, 600, 600); glMatrixMode(GL_PROJECTION); glLoadIdentity( ); glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); glutDisplayFunc( ReDraw ); glutMainLoop(); } void ReDraw( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3d(0, 1, 0); glVertex3d(0.1, 0.2, -0.1); glColor3d(1, 0, 0); glVertex3d(0.1, 0.1, -0.1); glVertex3d(0.2, 0.1, -0.1); glEnd( ); glutSwapBuffers( ); // glFlush( ); } x y z

19 Példa: Zászló Textúra kép x y x z (1,1) Paraméterezés triviális mivel paraméteres felület. u v x(u,v) = u · W y(u,v) = v · H z(u,v) = sin(K · u · PI + phase(t)) H W Geometria Textúra

20 main int main( int argc, char * argv[ ] ) { glutInitWindowSize(winWidth, winHeight); // ablak létrehozás glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Sej a mi lobogonkat fenyes…"); onInit( );// Inicializálás glutDisplayFunc( DrawFlag ); // Display callback regisztráció glutIdleFunc( AnimateFlag );// Idle callback regisztráció glutMainLoop(); }

21 onInit: OpenGL kezdő állapot void onInit ( ) { glViewport(0, 0, winWidth, winHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(54, (float)winWidth/(float)winHeight, 1, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 0, 0, 0, -1, 0, 1, 0); glTranslatef(-15, -10, -50); glEnable(GL_TEXTURE_2D);// Textúrázás bekapcs unsigned int texture, width, height; glGenTextures(1, &texture); // Azonosító gen. glBindTexture(GL_TEXTURE_2D, texture); // Kötés static unsigned char bitmap[3*maxwidth*maxheight]; // Textúra CPU-n LoadBmp(“zaszlo.bmp”, &bitmap[0], &width, &height); // Ilyen nincs! 2 hatvány? glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmap); // Textúra->OpenGL glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } Transzformációk Textúra fp ne legyen kicsi!

22 void DrawFlag( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glBegin(GL_QUADS); for (float u = 0; u < 1; u+=1.0/N) for (float v = 0; v < 1; v+=1.0/M) { float uc = u, vc = v; glTexCoord2f(uc, vc); glVertex3f( uc*W, vc*H, sin(uc*K*M_PI + phase) ); uc = u+1.0/N; glTexCoord2f(uc, vc); glVertex3f( uc*W, vc*H, sin(uc*K*M_PI + phase) ); vc = v+1.0/M; glTexCoord2f(uc, vc); glVertex3f( uc*W, vc*H, sin(uc*K*M_PI + phase) ); uc = u; glTexCoord2f(uc, vc); glVertex3f( uc*W, vc*H, sin(uc*K*M_PI + phase) ); } glEnd(); glutSwapBuffers( ); } DrawFlag = tesszelláció+OpenGL átadás x(u,v) y(u,v) z(u,v) (u,v)

23 AnimateFlag float phase = 0; void AnimateFlag( ) { phase += 0.3; DrawFlag(); } Vagy … long time = 0; void AnimateFlag( ) { long new_time = glutGet(GLUT_ELAPSED_TIME); phase += 0.2 * (new_time – time); time = new_time; DrawFlag(); } Az idle callback-nek az a dolga, hogy fusson! Ne akadályozd ebben!

24 Zászló textúra + megvilágítás x z r(u,v) = [u · W, v · H, sin(K · u · PI+phase)]  r/  u = [W, 0, K · PI · cos(K · u · PI+phase)]  r/  v = [0, H, 0] n(u,v) =  r/  u   r/  v = [-K · PI · H · cos(K · u · PI+phase), 0, W · H] n

25 Fényforrás(ok) és anyagjellemzők float pos[4] = {0, 0, 1, 0}; // irányfényforrás float Ia[4] = {0, 0, 0, 1}, Id[4] = {0.5, 0.5, 0.5, 1}, Is[4] = {2, 2, 2, 1}; glLightfv(GL_LIGHT0, GL_AMBIENT, Ia); glLightfv(GL_LIGHT0, GL_DIFFUSE, Id); glLightfv(GL_LIGHT0, GL_SPECULAR, Is); glLightfv(GL_LIGHT0, GL_POSITION, pos); glEnable(GL_LIGHT0); float col[4] = {1, 1, 1, 1}; glMaterialfv( GL_FRONT, GL_DIFFUSE, col); glMaterialfv( GL_FRONT, GL_SPECULAR, col); glMateriali( GL_FRONT, GL_SHININESS, 20); Color = ka * Ia + kd * Id · (N  L) + + ks * Is · ((N  H) + ) shininess ColorVertex = Ia + Id · (N  L) + + Is · ((N  H) + ) shininess ColorPixel = k * InterpolColorVertex gluLookAt után

26 void DrawFlag( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable( GL_LIGHTING ); // illumináció számítás glEnable( GL_NORMALIZE ); // nomálvektort normalizálja glBegin(GL_QUADS); for (float u = 0; u < 1; u+=1.0/N) for (float v = 0; v < 1; v+=1.0/M) { glTexCoord2f(u, v); glNormal3f(-K*M_PI*cos(u*K*M_PI+phase), 0, W); // H eldob glVertex3f(u*H, v*W, sin(u*K*M_PI + phase)); … } glEnd(); SwapBuffers( ); } n(u,v) r(u,v)

27 3. Kisfeladat Sziget: texúrázott, diffúz Bézier Víz: Spekuláris, átlátszó, Paraméteres felület Hajó: Textúrázott Diffúz Poligonmodell „Ringatózik” Nap: Irányfényforrás Égbolt: Ambiens Fényforrás


Letölteni ppt "OpenGL Szirmay-Kalos László In theory, there is no difference between theory and practice. In practice, there is."

Hasonló előadás


Google Hirdetések