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

Slides:



Advertisements
Hasonló előadás
Weblapkészítési tudnivalók 2: Útmutató az elnevezésekhez Pék Ágnes © 2009.
Advertisements

Kiss-Tóth Marcell Flash és PHP? De még mennyire!
OpenGL 2. gyakorlat Hapák József
2010/2011 ősz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál  Részei.
UML Példa © Fülöp Lajos.
Mellár János 3. óra Szeptember 16. v
2 Forrás: The Standish Group International, Extreme Chaos, The Standish Group International, Inc., 2000.
8. előadás (2005. április 19.) Pozicionálás fájlban (folyt.) I/O mechanizmus váltás Hibakezelő függvények Változók tárolási osztályai Parancssor-argumentumok.
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás.
2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus editor: GUI, use-case, dinamikus modell L L L R LD LU MouseLDown első pont MouseLDown második...
2D grafikus rendszerek Szirmay-Kalos László.
OpenGL Szirmay-Kalos László In theory, there is no difference
Az előd – IIS 6 2 Forrás: Secunia, Forrás: Netcraft, August 2007 Web Server Survey Elterjedtség.
Domain tesztelés bemutatása PHP tesztelés
GPGPU labor I. OpenGL, Cg.
Programozási Nyelvek (C++) Gyakorlat Gyak 01.
Programozási Nyelvek (C++) Gyakorlat Gyak 03.
Weben publikált térképek a földrajzi kutatásokban Ádám Eszter Geográfus MSc hallgató.
Dinamikus tömbök.
Mikrovezérlők alkalmazástechnikája laboratóriumi gyakorlat Kovács Tamás & Mingesz Róbert 3. óra február 20., 23.
WEB Technológiák Dr. Pance Miklós – Kolcza Gábor Miskolci Egyetem.
WEB Technológiák Coldfusion ME Általános Informatikai Tsz. dr. Kovács László.
Közös kinézet Mester oldal, témák, skin-ek, css Webalkalkalmazás fejlesztése ASP.NET-ben Krizsán Zoltán.
Grafikus szoftver alrendszer, OpenGL alapok
 Az Apache webszervernek semmi köze az Apache indiánokhoz, akik az Egyesült Államok dél-nyugati részén élõ õslakók. A név egy szójáték: "a patchy server”,
Microsoft szoftverek a szakképzésben
Készítette: Keszthelyi Zsolt
DirectX a grafika laboron kívül. Mire lesz szükség Itt vannak a szükséges include és lib: iles/DXMinimalPack.zip.
Programozási technológia 1
Szombathely Dinamikus WEB programozás: PHP és JSP.
C++ alapok, harmadik óra
Egyszerű webes alkalmazás fejlesztése
Számítógépes Grafika 1. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Google earth és a térinformatika kapcsolata
Mikrovezérlők, perifériák laboratóriumi gyakorlat 3. óra szeptember 18. Mingesz Róbert v
V 1.0 ÓE-NIK, Programozás I. A Microsoft Visual Studio 2010 használata.
Számítógépes grafika 3. gyakorlat.
ARCHITECTArchitect AcademyFoundationsInsidersMCPtréningekvizsgákgyakorlatprojektek Novák István eEvangelist – „Dive deeper” Grepton Zrt. Technológiai vezető.
Az ASP.NET programozási modell Ez az előadó neve beosztása vállalata.
PHP nyelv. PHP Interpreteres nyelv → parancsértelmező szükséges hozzá Rasmus Lerdorf 1995 → személyes felhasználás (internetes önéletrajzának megtekintésének.
1 Operációs rendszerek I, 3. gyakorlat Windisch Gergely
Flash és PHP? De még mennyire! Kiss-Tóth Marcell
Széchenyi Isván Egyetem Számítógépes hálózatok II 1 Számítógépes Hálózatok II Széchenyi István Egyetem.
2D grafikus rendszerek Szirmay-Kalos László.
Effect framework, HLSL shader László Szécsi. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását – pass: egy ilyen.
Visual Basic 2008 Express Edition
Számítógépes grafika DirectX 5. gyakorlat. Emlékeztető Háromdimenziós alapok befejezése Textúrázás.
ARM tanfolyam 2. előadás.
Web-grafika II (SVG) 1. gyakorlat
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
Illés Zoltán ELTE Informatikai Kar
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 4. Gyakorlat Függvény paraméterek, dinamikus.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
Objektumvezérelt rendszerek tervezése
A C++ nyelv.
Webprogramozó tanfolyam
A Visual Basic nyelvi elemei
Számítógépes grafika gyakorlat DirectX segítség A következő dolgokra van szükség: CG Toolkit: 
Hogyan készítheti el egy laikus egy nap alatt az INFOÉRA konferencia programlistázó és értékelő mobilalkalmazását? Menyhárt László Gábor Zamárdi,
Egyéb interpreterek Windows Script Host Internet Explorer Hypertext application.
NIIFI Networkshop március 31. – április 2.PTE Egyetemi Könyvtár Adatbázisba kerülnek a magyar szakfolyóiratok cikkeinek hivatkozásai Szalai László,
Java web programozás 7-8..
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
Számítógépes grafika OpenGL 5. gyakorlat.
Java web programozás 5..
Számítógépes Grafika 3. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Számítógépes Grafika 5. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Grafikus szoftver Szirmay-Kalos László. Interaktív programok felépítése input csővezeték output csővezeték.
Számítógépes Grafika OpenGL és SDL alapok
Előadás másolata:

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

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

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ó: www.opengl.org

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

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

OpenGL Ezekre lesz szükségünk a CG-n kívül: GLEW: http://glew.sourceforge.net/index.html GLM (matematikai könyvtár): http://glm.g-truc.net/download.html Freeglut: http://freeglut.sourceforge.net/index.php#download

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")

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

Konkrétan graflabban letöltendő GLEW: https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3.zip/download https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3-win32.zip/download GLM: https://sourceforge.net/projects/glf/files/glm/glm-0.9.B.1/glm-0.9.B.1.zip/download

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)

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

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)

OpenGL elnevezési konvenciók

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

Első OpenGL program Készítsünk egy fekete képernyőt! Program letölthető innen: http://people.inf.elte.hu/valasek/bevgraf/08/01_Create.zip

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")

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

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

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

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

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: http://www.opengl.org/documentation/specs/glut/spec3/node12.html

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

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

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() { … }

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() { … }

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

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):

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

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

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

OpenGL adattípus typedef-ek

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

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

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

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

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

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

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;

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, }; ...

OpenGL

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

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

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

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

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

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

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

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

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

glBufferData Usage lehetséges értékei:

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); ...

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: http://www.opengl.org/sdk/docs/man/xhtml/glEnableClientState.xml Alapból minden le van tiltva Letiltani glDisableClientState-tel lehet

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

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)

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

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

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)

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

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

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

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