Čas 1 uvodognjen/racunarska grafika...računarska grafika - opengl 15.11.2007. uvod 9 sufiksi...
TRANSCRIPT
Računarska grafika - OpenGL
15.11.2007.
Uvod
2
OpenGL je softverski interfejs prema grafičkom hardveru.
Interfejs (u verziji 1.4) čini oko 250 komandi, i to
-oko 200 u samom jezgru OpenGL-a i
-oko 50 u OpenGL Utility Library
omogućujući specificiranje objekata i operacija za kreiranje interaktivnih 3D aplikacija.
Šta je OpenGL?
Računarska grafika - OpenGL
15.11.2007.
Uvod
3
IstorijatStari milenijum
• Verzija 1.0 (1 jul 1992.) – prva implementacija se pojavila 1993. (Iris GL) namenjena Silicon Graphics radnim stanicama. SG u saradnji sa drugim proizvođačima grafičkog hardvera nastavlja da razvija otvoreni standard koji će se uskoro nazvati OpenGL.
• Verzija 1.1(1996.) –impl. 1997., Vertex Array, Polygon Offset, Logical Operations, Texture Image Formats, Texture Replace Environment, Texture Proxies, Copy Texture and Subtexture, Texture Objects, ...
• Verzija 1.2 (16 mart 1998.) – Three-dimensional Texturing, BGRA Pixel Formats, Packed Pixel Formats, Normal Rescaling, Separate Specular Color, Texture Coordinate Edge Clamping, Texture Level of Detail Control, Vertex Array Draw Element Range, Imaging Subset (Color Tables, Convolution, Color Matrix, Pixel Pipeline Statistics, Constant Blend Color, New Blending Equations)
• Verzija 1.2.1 (14 oktobar 1998.) – uvode se ARB ekstenzije, jedina ekstenzija koja je tada usvojena je Multitexture.
Računarska grafika - OpenGL
15.11.2007.
Uvod
4
IstorijatNovi milenijum
• Verzija 1.3 (14. avgust 2001.) - Compressed Textures, Cube Map Textures, Multisample, Multitexture, Texture Add Environment Mode, Texture Combine Environment Mode, Texture Dot3 Environment Mode, Texture Border Clamp, Transpose Matrix
• Verzija 1.4 (24. jul 2002.) - Automatic Mipmap Generation, Blend Squaring, Changes to the Imaging Subset, Depth Textures and Shadows, Fog Coordinate, Multiple Draw Arrays, Point Parameters, Secondary Color, Separate Blend Functions, Stencil Wrap, Texture Crossbar Environment Mode, Texture LOD Bias, Texture Mirrored Repeat, Window Raster Position, i možda najvažnija komponenta (najava novog doba) usvojena nova ekstenzija ARB vertex program
• Verzija 1.5 (29. jul 2003.) – Buffer Objects, Occlusion Queries, Shadow Functions, Changed Tokens, i nove ekstenzije ARB shader objects, ARB vertex shader i ARB fragment shader
Računarska grafika - OpenGL
15.11.2007.
Uvod
5
Današnjica• Verzija 2.0 (7. septembar 2004.)
– Programmable Shading• Shader Objects• Shader Programs• OpenGL Shading Language (verzije 1.10 i novije)• Promene u Shader API-u
– Multiple Render Targets– Non-Power-Of-Two Textures– Point Sprites– Separate Stencil
• Verzija 2.1 (2. avgust 2006.)– OpenGL Shading Language 1.20– Non-square Matrices– Pixel Buffer Object– sRGB Textures
Računarska grafika - OpenGL
15.11.2007.
Uvod
6
Pomoćne biblioteke• OpenGL Utility Library (prefiks glu) – sastavni
je deo OpenGL implementacije i kombinuje neke elementarne komande kako bi se olakšali česti postupci pri postavljanju matrica, projekcije i sl.
• OpenGL Programming Guide Auxiliary Library (aux) – pojednostavljuje primere pisane za OpenGL Programming Guide
• OpenGL Extension for MS Windows (wgl)– proširenje Windowsa za podršku OpenGL-a
• OpenGL Utility Toolkit (glut) – API nezavisan od windowsa/sistema koji olakšava rad sa prozorima/sistemom (Mark Kilgard)
Računarska grafika - OpenGL
15.11.2007.
Uvod
7
Šta je potrebno da bi se koristio OpenGL pod Windowsom?
• Skup biblioteka (opengl32.lib, glu32.lib, poželjno i glut.lib)
• Zaglavlja (gl.h, glu.h, glaux.h, glut.h)• Run-time biblioteku (OpenGL32.dll) – mora biti iste
verzije kao i biblioteke, ili novija.• Klijentski drajver (Installable Client Driver - IDC) –
dolazi uz drajver grafičke kartice i omogućuje hardversku akceleraciju i dodatne funkcije.
Računarska grafika - OpenGL
15.11.2007.
Uvod
8
OpenGL sintaksa komandi
Colorgl 3f (1.0,1.0,1.0)Nazivi funkcija:
Nazivi konstanti:
COLOR_BUFFER_BITGL_
Računarska grafika - OpenGL
15.11.2007.
Uvod
9
Sufiksi komandi i tipovi argumenataSufiks Tip podataka Odgovarajući tip u C-u OpenGL definicija tipa
b 8-bit integer signed char GLbyte
s 16-bit integer short GLshort
i 32-bit integer long GLint, GLsizei
f 32-bit floating-point float GLfloat, GLclampf
d 64-bit floating-point double GLdouble, GLclampd
ub 8-bit unsigned integer unsigned char GLubyte, GLboolean
us 16-bit unsigned integer unsigned short GLushort
ui 32-bit unsigned integer unsigned long GLuint, GLenum, GLbitfield
Računarska grafika - OpenGL
15.11.2007.
Uvod
10
Primeri komandi
glVertex2i(1, 3);
glVertex2f(1.0, 3.0);
GLfloat vertex_array[] = {1.0, 0.0, 0.0};
glVertex3fv(vertex_array);
Računarska grafika - OpenGL
15.11.2007.
Uvod
11
OpenGL state machineOpenGL je konačni automat, koji se može postaviti u odgo-varajuće stanje (mod) i u njemu ostaje sve dok se ne promeni.
Pr. glColor3f(1.0,0.0,0.0) – postavlja boju koja se primenjuje na sve što sledi dok se ne navede ponovo.
Promenljivim stanja definišu se: boja, pogled, projekcija, šabloni linije i poligona, mod crtanja poligona, pakovanje piksela, pozicije i karakteristike svetla, kao i karakteristike materijala.
Računarska grafika - OpenGL
15.11.2007.
Uvod
12
Mnoge promenljive stanja moraju se eksplicitno “omogućiti” glEnable() ili onemogućiti glDisable().
Stanje, zavisno od tipa, dobija se jednom od 6 komandi: glGetBooleanv(), glGetDoublev(), glGetFloatv(),glGetIntegerv(), glGetPointerv() ili glIsEnabled().
Postoje i mnogo složeniji upiti o stanju promenljive, npr. glGetLight*(), glGetError() ili glGetPolygonStipple().
Stanje se može zapamtiti u steku atributa komandama glPushAttrib() ili glPushClientAttrib(), modifikovati, a zatim povratiti komandama glPopAttrib() ili glPopClientAttrib().
Upravljanje stanjem
Računarska grafika - OpenGL
15.11.2007.
Uvod
13
OpenGL rendering pipeline
Aproksimacija krivih i površina
Blending, masking...
Vertex data
Pixel data
Display list
Pixeloperacije
Evaluatori
Rasterizacija
Per-vetexoperacije i sklapanje primitiva
Sklapanjetekstura
Per-fragmentoperacije
Framebuffer
Transformacije,osve-tljenje, clpping
Računarska grafika - OpenGL
15.11.2007.
Uvod
17
OpenGL C++ projekat
• COpenGLRenderer• OpenGL rendering kontekst• Uključivanje podrške za OpenGL
– biblioteka– Include
• Funkcije za rukovanje scenom• Povezivanje sa View klasom
Računarska grafika - OpenGL
15.11.2007.
Uvod
18
COpenGLRenderer
COpenGLRenderer__________________CreateGLContext()
Reshape()PrepareSene()DrawScene()
DestroyScene()__________________
HGLRC m_hrc
Računarska grafika - OpenGL
15.11.2007.
Uvod
19
Uključuvanje podrške za OpenGL• Include
– #include <GL/gl.h>– #include <GL/glu.h>– #include <GL/glut.h>– #include <GL/glaux.h>– #include <math.h>
• Uključivanje biblioteke– Project/Settings/Link/ Object/Libraru modules:
OpenGL32.lib
Računarska grafika - OpenGL
15.11.2007.
Uvod
20
BOOL COpenGLRenderer::CreateGLContext(CDC* pDC)PIXELFORMATDESCRIPTOR pfd ;memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL |
PFD_DRAW_TO_WINDOW; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 16;pfd.cDepthBits = 32; pfd.iLayerType = PFD_MAIN_PLANE;
int nPixelFormat = ChoosePixelFormat (pDC->m_hDC, &pfd);if (nPixelFormat == 0) return FALSE; // ChoosePixelFormat FailedBOOL bResult = SetPixelFormat (pDC->m_hDC, nPixelFormat, &pfd);if (!bResult) return FALSE; // SetPixelFormat Failedm_hrc = wglCreateContext (pDC->m_hDC); // HGLRC m_hrc;if (!m_hrc) return FALSE; // wglCreateContext Failedreturn TRUE;
Računarska grafika - OpenGL
15.11.2007.
Uvod
21
ChoosePixelFormat & SetPixelFormatFunkcija ChoosePixelFormat pokušava da pronađe format piksela koji podržava DC najsličniji zadatom formatu i vraća indeks odgovarajućeg formata.
int ChoosePixelFormat( HDC hdc, // DC u kome se traži najpribližniji piksel formatCONST PIXELFORMATDESCRIPTOR * ppfd
/* piksel format za koji se traži najpribližniji koji je podržan u DC-ju*/ );
Funkcija SetPixelFormat postavlja format piksela specificiranog DC-ja na format definisan indeksom iPixelFormat.Kao indeks trebalo bi proslediti vrednost koju je vratila prethodna funkcija.
BOOL SetPixelFormat( HDC hdc, // DC čiji se format piksela postavljaint iPixelFormat, // indeks formata piksela (one-based)CONST PIXELFORMATDESCRIPTOR * ppfd// pointer na specifikaciju formata piksela);
Računarska grafika - OpenGL
15.11.2007.
Uvod
22
BOOL COpenGLRenderer::PrepareScene(CDC* pDC)
BOOL COpenGLRenderer::DrawScene(CDC* pDC)
wglMakeCurrent(pDC->m_hDC, m_hrc);//---------------------------------// Ovde se navodi sve što se izvršava samo jednom,// pre prvog iscrtavanja scene//---------------------------------wglMakeCurrent(NULL, NULL);
wglMakeCurrent(pDC->m_hDC, m_hrc);//---------------------------------// Ovde se vrši iscrtavanje scene//---------------------------------wglMakeCurrent(NULL, NULL);
Računarska grafika - OpenGL
15.11.2007.
Uvod
23
BOOL COpenGLRenderer::DestroyScene(CDC* pDC)
BOOL COpenGLRenderer::Reshape(CDC *pDC, int w, int h)
//----------------------------------------------------// Ovde se vrši dealokacija scene scene//----------------------------------------------------wglMakeCurrent(NULL,NULL); if (m_hrc) {
wglDeleteContext(m_hrc);m_hrc = NULL;
}
wglMakeCurrent(pDC->m_hDC, m_hrc);glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity ();// Definisanje projekcijeglMatrixMode (GL_MODELVIEW); wglMakeCurrent(NULL, NULL);
Računarska grafika - OpenGL
15.11.2007.
Uvod
24
wglMakeCurrent i SwapBuffersFunkcija wglMakeCurrent postavlja prosleđeni OpenGL rendering context za tekući rendering context niti koja je pozvala ovu funkciju. Svi pozivi funkcijaOpenGL-a koji slede iscrtavaju se na uređaju koji definiše hdc. Takođe se koristi “isključi” tekući rendering context.
BOOL wglMakeCurrent( HDC hdc, // DC uređaja na kome se vrši iscrtavanje
HGLRC hglrc // OpenGL rendering context koji posteje tekući za datu nit);Funkcija SwapBuffers razmenjuje front i back bafere, ukoliko tekući format piksela datog DC-ja uključuje back bafer.
BOOL SwapBuffers( HDC hdc // DC uređaja čiji se baferi zamenjuju);
Računarska grafika - OpenGL
15.11.2007.
Uvod
25
Povezivanje sa klasom CViewDodati instancu klase COpenGLRenderer u View
Funkcije koje treba overloadovati:• OnCreate ( ) - poziva se pri kreiranju prozora • OnInitialUpdate ( ) - poziva se nakon što je pogled (view)
dodeljen dokumentu, a pre inicijalnog prikaza• OnSize ( ) - poziva se nakon promene veličine prozora• OnDraw ( ) - poziva se prilikom iscrtavanja dokumenta• OnEraseBkgnd ( ) - poziva se prilikom promene veličine
prozora ili invalidacije nekog njegovog dela• OnDestroy ( ) - poziva se nakon uklanjanja prozora sa ekrana
Računarska grafika - OpenGL
15.11.2007.
Uvod
26
int COGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
if (CView::OnCreate(lpCreateStruct) == -1) return -1;
CDC* pDC = GetDC();m_glRenderer.CreateGLContext (pDC);ReleaseDC(pDC);
return 0;
void COGLView::OnInitialUpdate()
CView::OnInitialUpdate();
CDC* pDC = GetDC();m_glRenderer.PrepareScene (pDC);ReleaseDC(pDC);
Računarska grafika - OpenGL
15.11.2007.
Uvod
27
void COGLView::OnSize(UINT nType, int cx, int cy)
void COGLView::OnDraw(CDC* pDC)
CView::OnSize(nType, cx, cy);if ( (cx <= 0) || (cy <= 0) ) return;
CDC* pDC = GetDC();m_glRenderer.Reshape (pDC, cx, cy);ReleaseDC(pDC);
m_glRenderer.DrawScene (pDC);
Računarska grafika - OpenGL
15.11.2007.
Uvod
28
BOOL COGLView::OnEraseBkgnd(CDC* pDC)
BOOL COGLView::OnDestroy( )
return TRUE;//return CView::OnEraseBkgnd(pDC);
CView::OnDestroy();CDC* pDC = GetDC();m_glRenderer.DestroyScene (pDC);ReleaseDC(pDC);
Računarska grafika - OpenGL
15.11.2007.
Uvod
29
Prva scenavoid CGLRendererView::PrepareScene(){
glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_FLAT);
}void CGLRendererView::Reshape(int w, int h){
glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);glMatrixMode (GL_MODELVIEW);
}void CGLRendererView::DrawScene(){
glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity (); /* clear the matrix */gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); /* viewing trans.*/glScalef (1.0, 2.0, 1.0); /* modeling transformation */glutWireCube (1.0);glFlush ();
}
Računarska grafika - OpenGL
15.11.2007.
Uvod
30
Drawing Survival Kit• brisanje prozora• definisanje boje• prisilni završetak iscrtavanja• uklanjanje skrivenih površina• crtanje primitiva
Računarska grafika - OpenGL
15.11.2007.
Uvod
31
Brisanje prozora
void glClear(GLbitfield mask);
Primer
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
Kombinovanje brisanja više bafera
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
bafer kod
Color buffer GL_COLOR_BUFFER_BIT
Depth buffer GL_DEPTH_BUFFER_BIT
Accumulation buffer GL_ACCUM_BUFFER_BIT
Stencil buffer GL_STENCIL_BUFFER_BIT
Računarska grafika - OpenGL
15.11.2007.
Uvod
32
Definisanje boje
set_current_color(red);
draw_object(A);
draw_object(B);
set_current_color(green);
set_current_color(blue);
draw_object(C);
glColor3f(1.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
Računarska grafika - OpenGL
15.11.2007.
Uvod
33
Prisilni završetak iscrtavanjaObzirom da je OpenGL mrežno orijentisan, klijent ne šalje paketserveru dok on nije popunjen. Ako želimo da pošaljemo paket, bezobzira što on nije pun, koristimo glFlush() komandu. glFlush nečeka da se iscrtavanje završi, već ga samo inicira. glFinish(), radiisto što i glFlush, ali čeka notifikaciju od servera da je iscrtavanjezavršeno.
Ove komande se koriste pri sinhronizaciji procesa. Npr. obezbeditida je scena iscrtana pre nego što se prihvati korisnički unos.
Računarska grafika - OpenGL
15.11.2007.
Uvod
34
Uklanjanje skrivenih površinawhile (1) {get_viewing_point_from_mouse_position();glClear(GL_COLOR_BUFFER_BIT);draw_3d_object_A();draw_3d_object_B();}
Ako se A i B delimično međusobno preklapaju, redosled iscrtavanja ne može pomoći. Najlakši način je uvođenje depth bafera (tj.Z-bafera).
glEnable(GL_DEPTH_TEST);...while (1) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);get_viewing_point_from_mouse_position();draw_3d_object_A();draw_3d_object_B();}
Računarska grafika - OpenGL
15.11.2007.
Uvod
35
Crtanje primitivaglBegin(GL_POLYGON);
glVertex2f(0.0, 0.0);
glVertex2f(0.0, 3.0);
glVertex2f(3.0, 3.0);
glVertex2f(4.0, 1.5);
glVertex2f(3.0, 0.0); glEnd();
Računarska grafika - OpenGL
15.11.2007.
Uvod
36
Prvi zadaci
• Formirati prvi MFC projekat sa podrškom za OpenGL.
• Modifikovati funkciju Reshape ( ) tako da scena ne menja izgled, bez obzira na veličinu prozora.
• Promeniti boju kocke.• Pomeriti kocku tako da bude duplo dalje od
posmatrača• Pomeriti kocku tako da 6x bude dalje