Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
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:
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:
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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.