Čas 1 uvodognjen/racunarska grafika...računarska grafika - opengl 15.11.2007. uvod 9 sufiksi...

36
Računarska grafika - OpenGL 15.11.2007. Uvod OpenGL Čas 1 Uvod

Upload: others

Post on 25-Dec-2019

9 views

Category:

Documents


0 download

TRANSCRIPT

Računarska grafika - OpenGL

15.11.2007.

Uvod

OpenGL

Čas 1

Uvod

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

14

OpenGL Pipeline

Računarska grafika - OpenGL

15.11.2007.

Uvod

15

Pojednostavljeni dijagram

Računarska grafika - OpenGL

15.11.2007.

Uvod

16

Vizuelni pregled fiksne funkcionalnosti

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