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

Számítógépes grafika OpenGL 1. gyakorlat.

Hasonló előadás


Az előadások a következő témára: "Számítógépes grafika OpenGL 1. gyakorlat."— Előadás másolata:

1 Számítógépes grafika OpenGL 1. gyakorlat

2 Tartalom OpenGL röviden Első program: üres képernyő
Második program: rajzolás

3 OpenGL SGI által elkezdett API, grafikus alkalmazások programozására
Gyakorlatilag is cross-platform Eredetileg az SGI IRIS GL-jéből fejlődött ki OpenGL Architecture Review Board kezelte kezdetekben 2006 óta a Khronos Groupé az irányítás OpenGL specifikáció:

4 OpenGL Állapotgép, a Khronos által kezelt specifikációknak megfelelő driverek valósítják meg az utasításokat Kliens-szerver jellegű, ahol a szerver a GL, a kliens az alkalmazás Lehetőséget nyújt a szabványon túli kiegészítések elkészítésére is

5 OpenGL Verziók: Forrás: http://www.opengl.org/documentation/specs/
OpenGL 1.0: július 1. OpenGL 2.0: október 22. OpenGL 3.0: augusztus 11. OpenGL 4.0: március 11. Forrás:

6 OpenGL Ezekre lesz szükségünk a CG-n kívül:
GLEW: GLM (matematikai könyvtár): Freeglut:

7 Visual Studio beállítása OpenGL-hez
Include könyvtárak közé: glm-0.9.B.1\ glew-1.5.3\include freeglut-2.6.0\include Library könyvtárak közé: glew-1.5.3\lib Szükséges lib fájlok: #pragma comment(lib, "cg.lib") #pragma comment(lib, "cgGL.lib") #pragma comment(lib, "glew32s.lib")

8 Konkrétan graflabban beállítandó
Tools/Options/Projects and Solutions/VC++ directories/ Include files: C:\Program Files\freeglut-2.4.0\include T:\glew-1.5.3\include Library files: C:\Program Files\freeglut-2.4.0\ReleaseStatic T:\glew-1.5.3\lib

9 Konkrétan graflabban letöltendő
GLEW: GLM:

10 Visual Studio beállítása OpenGL-hez
DLL fájlok amikre szükség lesz: CG-hez cg.dll és cgGL.dll glew.dll freeglut.dll (hacsak nem statikusan linkeljük utóbbi kettőt)

11 GLUT Segédkönyvtár, ami elfedi előlünk a Windows-os dolgokat
Mi a freeglut-ot fogjuk használni

12 Extension-ök Az alap OpenGL specifikáció lehetőséget nyújt bővítésre
Ezt ezeken a kiterjesztéseken keresztül lehet elérni Tipikusan gyártó specifikus indíttatású egy-egy extension Ha mindenkinek tetszik, akkor végül a szabvány része lesz (pl. vbo-k)

13 OpenGL elnevezési konvenciók

14 Tartalom OpenGL röviden Első program: üres képernyő
Második program: rajzolás

15 Első OpenGL program Készítsünk egy fekete képernyőt!
Program letölthető innen:

16

17

18 main.cpp #define FREEGLUT_STATIC #include <GL/glew.h>
#include <GL/freeglut.h> #include <windows.h> #include <iostream> #pragma comment(lib, "glew32.lib") #pragma comment(lib, "freeglut_static.lib")

19 main.cpp int main(int argc, char* argv[]) { glutInit(&argc, argv);
glutInitWindowSize(640, 480); glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("OpenGL program"); ...

20 glutInit glutInit( int *argcp, char **argv)
A GLUT segédkönyvtár inicializálása argcp: a programunk parancssorának számát tartalmazó módosítatlan változóra

21 glutInit glutInit( int *argcp, char **argv)
A GLUT segédkönyvtár inicializálása argv: a tényleges parancssor

22 glutInitWindowSize glutInitWindowSize( int width, int height)
Létrehozandó ablak szélessége és magassága

23 glutInitDisplayMode glutInitDisplayMode( unsigned int mode)
A kezdeti megjelenítési tulajdonságok beállítása: GLUT_RGBA: RGBA színmodell használata GLUT_DOUBLE: dupla pufferelés használata GLUT_DEPTH: mélységi puffer használata További információk:

24 glutCreateWindow glutCreateWindow( char *name)
A paraméterben megadott feliratú ablak létrehozása

25 main.cpp ... glutDisplayFunc(Render); glutIdleFunc(Idle);
if (glewInit() != GLEW_OK) { std::cout << "Hiba!" << std::endl; return -1; } Init(); glutMainLoop(); return 0; }

26 glutDisplayFunc glutDisplayFunc( void (*func)(void))
Egy callback függvényt adunk át a GLUT-nak, ami akkor hívódik meg, ha a kliensterületet újra kell rajzolni A függvénynek így kell kinéznie: void név() { … }

27 glutIdleFunc glutIdleFunc( void (*func)(void))
Egy callback függvényt adunk át a GLUT-nak, ami akkor hívódik meg, ha nincs feldolgozásra váró üzenete az ablakunknak A függvénynek így kell kinéznie itt is: void név() { … }

28 glewInit() Inicializálja a glew-t (ez fogja betölteni az extension-öket)

29 glutMainLoop() Elindul a fő ciklusa a GLUT-nak
Ez csak akkor hívja a rajzoló callback-et, ha az ablakozó szerint újra kell rajzolni Ezért mi az idle callback-ben mindig kiadunk egy render parancsot (glutPostRedisplay-t):

30 main.cpp void Idle() { glutPostRedisplay(); }

31 main.cpp void Init() { glClearColor(0,0,0,1); }

32 glClearColor glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); Beállítja a törlési színt Az egyes színkomponensek 0 és 1 közötti lebegőpontos számok kellenek, hogy legyenek

33 OpenGL adattípus typedef-ek

34 main.cpp void Render() {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); }

35 glClear glClear(GLbitfield mask) Mit töröljünk:
GL_COLOR_BUFFER_BIT: a frame puffert (OpenGL-ül color buffer) GL_DEPTH_BUFFER_BIT: mélységi puffert GL_STENCIL_BUFFER_BIT: stencil puffert

36 glutSwapBuffers glutSwapBuffers()
A back és a front buffer megcserélése

37 Feladat 3 másodperc alatt feketéből váltson át a képernyő színe zöldre és vissza, szép folyamatosan

38 Tartalom OpenGL röviden Első program: üres képernyő
Második program: rajzolás

39 Második program Rajzoljunk ki egy háromszöget!

40 main.cpp A main() és Idle() függvényeink nem változnak
Van egy új globális változónk, ez a Vertex Buffer Object-ünk (VBO) azonosítója lesz: GLuint g_vb;

41 main.cpp/void Init() void Init() { glClearColor( 0, 0, 0.5f, 1);
float geom[] = -1, -1, 0.5f, 0, 1, 0.5f, 1, -1, 0.5f, }; ...

42 OpenGL

43 main.cpp/void Init() ... glGenBuffers(1, &g_vb);
glBindBuffer(GL_ARRAY_BUFFER, g_vb); glBufferData( GL_ARRAY_BUFFER, sizeof(geom), geom, GL_STREAM_DRAW); }

44 glGenBuffers glGenBuffers( GLsizei n, GLuint * buffers)
Puffer objektumokat hoz létre n darab puffert hoz létre A buffers egy tömb, ami tárolni fogja a létrehozott pufferek azonosítóit

45 glBindBuffer glBindBuffer( GLenum target, GLuint buffer);
A második paraméterben megadott puffert hozza létre (rendeli a contexthez), vagy veszi használatba: GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER GL_PIXEL_PACK_BUFFER GL_PIXEL_UNPACK_BUFFER

46 glBufferData glBufferData( enum target, sizeiptr size, const void *data, enum usage) A tényleges memóriafoglalás itt történik meg Ha már létező pufferre hívjuk meg, akkor újrafoglalódik neki memóriaterület Meglévő memória átírására: glBufferSubData

47 glBufferData glBufferData( enum target, sizeiptr size, const void *data, enum usage) Milyen puffert hozunk létre: GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER GL_PIXEL_PACK_BUFFER GL_PIXEL_UNPACK_BUFFER

48 glBufferData glBufferData( enum target, sizeiptr size, const void *data, enum usage) A létrehozandó puffer mérete bájtban

49 glBufferData glBufferData( enum target, sizeiptr size, const void *data, enum usage) Memóriaterület, ahonnan feltöltődik a puffer a méretének megfelelő bájtnyi adattal

50 glBufferData glBufferData( enum target, sizeiptr size, const void *data, enum usage) A puffer felhasználási módja, adatfeltöltés gyakoriságának szempontjából: STATIC: csak egyszer lesz adat feltöltve rá STREAM: használat után változó tartalom DYNAMIC: többszöri változtatások, de egy-egy változtatás után többszöri felhasználás

51 glBufferData glBufferData( enum target, sizeiptr size, const void *data, enum usage) A puffer felhasználási módja, az adatfelhasználás módjának függvényében: DRAW: az adatokat az alkalmazás hozza létre, kirajzoláshoz szükséges adatok tárolója COPY: az adatokat a GL hozza létre, kirajzoláshoz is használja READ: az adatokat a GL hozza létre, de nem használja fel inputként

52 glBufferData Usage lehetséges értékei:

53 main.cpp/Render() void Render() {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, g_vb); glVertexPointer(3, GL_FLOAT, 3*sizeof(float), 0); ...

54 glEnableClientState glEnableClientState(GLenum cap)
Engedélyezünk egy kliens (alkalmazás) oldali dolgot: GL_VERTEX_ARRAY GL_TEXTURE_COORD_ARRAY GL_COLOR_ARRAY És a többi: Alapból minden le van tiltva Letiltani glDisableClientState-tel lehet

55 glVertexPointer glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) Vertexek egy tömbjét definiáljuk

56 glVertexPointer glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) size: a vertexek adattagjainak száma Itt a vertex csak pozíciókat jelent, így ennek lehetséges értéke 2, 3 illetve 4 (utóbbi az alapértelmezett)

57 glVertexPointer glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) A koordináták megadásához használt adattípus: GL_FLOAT (alapértelmezett) GL_DOUBLE GL_SHORT GL_INT

58 glVertexPointer glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) Egymást követő vertexek közti távolság nagysága, bájtban mérve

59 glVertexPointer glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) Mutató az első koordináta memóriacímére (a kezdeti eltolást így adhatjuk meg)

60 main.cpp/Render() ... glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, 0); glDisableClientState( GL_VERTEX_ARRAY); glutSwapBuffers(); }

61 glDrawArrays glDrawArrays( GLenum mode, GLint first, GLsizei count);
Mode: kirajzolandó primitívek típusa:

62

63 glDrawArrays glDrawArrays( GLenum mode, GLint first, GLsizei count);
first: kezdőindex a felhasznált vertex tömbben (vbo-ban)

64 glDrawArrays glDrawArrays( GLenum mode, GLint first, GLsizei count);
A kirajzolás során felhasznált csúcspontok száma


Letölteni ppt "Számítógépes grafika OpenGL 1. gyakorlat."

Hasonló előadás


Google Hirdetések