23
Predgovor Računarska grafika je oblast čije je vreme došlo, bez obzira na skupe hardverske zahteve, na računarske resurse i na specifične softverske pakete. Konačno je postala spremna da ispuni obećanja po pitanju komunikacije pomoću slika i postala je glavni oslonac u interakciji između čoveka i računara. Treba napomenuti da je računarska grafika postala sastavni deo svakodnevnog života, tako da se i deca predškolskog uzrasta sreću sa njom. U isto vreme, računarska grafika je postala nerazdvojni deo korisničkih interfejsa, vizualizacije podataka i objekata, dok je renderovanje objekata i scena postalo znatno realističnije. Tehnike koje su, tokom osamdesetih godina prošlog veka, bile u eksperimentalnoj fazi sada su u svakodnevnoj upotrebi, tako da čovek može da pronađe fotorealistične objekte odmah iza ćoška, ako mu zatrebaju. U tom periodu računaru su trebali sati i sati rada kako bi napravio jednu sliku, a danas računari rade besprekorne animacije sa željenim brojem kadrova. Računarska grafika je ostala jedna od najuzbudljivijih oblasti moderne tehnologije, a ujedno je i oblast koja najbrše napreduje i raste. Postala je i sastavni deo kako ap- likativnog softvera, tako i računarskih sistema uopšte. Računarska grafika se rutinski primenjuje u dizajniranju mnogih proizvoda, u simulatorima za obuku, u produkciji mu- zičkih videa i televizijskih reklama, u filmovima, u analiziranju podataka, u naučnim studijama, u medicinskim procedurama i u mnogim drugim aplikacijama. Ova knjiga spada u grupu stručnih dela iz oblasti računarskih nauka, koja pokriva značajno područje, koje se izučava na nivou dodiplomskih i poslediplomskih studija danas i u svetu i kod nas. Predviđena je da bude dodatni udžbenik iz predmeta Raču- narska grafika koji se izučava na Računarskom fakultetu u Beogradu. Neki delovi knjige mogu da se iskoriste za predmete Napredna računarska grafika i Računarska animacija. Ova knjiga može da se koristi i na ostalim visokoškolskim ustanovama za predmete koji imaju sličan sadržaj. Tokom pisanja ove knjige ideja je bila da se materija izloži u što popularnijem stilu, da bi bila dostupna i razumljiva i studentima sa manjim obimom predznanja iz ove oblasti. Knjiga je namenjena za širi spektar potreba. Ona može da koristi stu- dentima koji imaju dodira sa računarskom grafikom u bilo kom obliku, može da koristi dizajnerima i svim ostalim korisnicima primenjene računarske grafike kroz odgovarajuće grafičke aplikacije, koje se koriste i u svakodnevnom i u poslovnom okruženju. Ova knjiga se sastoji od tri poglavlja i tri dodatka. Prvo poglavlje je posvećeno OpenGL-u. OpenGL predstavlja primarno okruženje prilikom razvoja interaktivnih 2D i

Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

  • Upload
    others

  • View
    7

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

Predgovor

Računarska grafika je oblast čije je vreme došlo, bez obzira na skupe hardverske zahteve,na računarske resurse i na specifične softverske pakete. Konačno je postala spremnada ispuni obećanja po pitanju komunikacije pomoću slika i postala je glavni oslonac uinterakciji između čoveka i računara. Treba napomenuti da je računarska grafika postalasastavni deo svakodnevnog života, tako da se i deca predškolskog uzrasta sreću sanjom. U isto vreme, računarska grafika je postala nerazdvojni deo korisničkih interfejsa,vizualizacije podataka i objekata, dok je renderovanje objekata i scena postalo znatnorealističnije.

Tehnike koje su, tokom osamdesetih godina prošlog veka, bile u eksperimentalnojfazi sada su u svakodnevnoj upotrebi, tako da čovek može da pronađe fotorealističneobjekte odmah iza ćoška, ako mu zatrebaju. U tom periodu računaru su trebali sati isati rada kako bi napravio jednu sliku, a danas računari rade besprekorne animacije saželjenim brojem kadrova.

Računarska grafika je ostala jedna od najuzbudljivijih oblasti moderne tehnologije,a ujedno je i oblast koja najbrše napreduje i raste. Postala je i sastavni deo kako ap-likativnog softvera, tako i računarskih sistema uopšte. Računarska grafika se rutinskiprimenjuje u dizajniranju mnogih proizvoda, u simulatorima za obuku, u produkciji mu-zičkih videa i televizijskih reklama, u filmovima, u analiziranju podataka, u naučnimstudijama, u medicinskim procedurama i u mnogim drugim aplikacijama.

Ova knjiga spada u grupu stručnih dela iz oblasti računarskih nauka, koja pokrivaznačajno područje, koje se izučava na nivou dodiplomskih i poslediplomskih studijadanas i u svetu i kod nas. Predviđena je da bude dodatni udžbenik iz predmeta Raču-narska grafika koji se izučava na Računarskom fakultetu u Beogradu. Neki delovi knjigemogu da se iskoriste za predmete Napredna računarska grafika i Računarska animacija.Ova knjiga može da se koristi i na ostalim visokoškolskim ustanovama za predmete kojiimaju sličan sadržaj.

Tokom pisanja ove knjige ideja je bila da se materija izloži u što popularnijemstilu, da bi bila dostupna i razumljiva i studentima sa manjim obimom predznanja izove oblasti. Knjiga je namenjena za širi spektar potreba. Ona može da koristi stu-dentima koji imaju dodira sa računarskom grafikom u bilo kom obliku, može da koristidizajnerima i svim ostalim korisnicima primenjene računarske grafike kroz odgovarajućegrafičke aplikacije, koje se koriste i u svakodnevnom i u poslovnom okruženju.

Ova knjiga se sastoji od tri poglavlja i tri dodatka. Prvo poglavlje je posvećenoOpenGL-u. OpenGL predstavlja primarno okruženje prilikom razvoja interaktivnih 2D i

Page 2: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

x

3D grafičkih aplikacija. Naziv OpenGL predstavlja akronim od Open Graphic Language,što znači da je reč o otvorenom grafičkom jeziku, tj. o grafičkom jeziku koji je svimadostupan. OpenGL interfejs sadrži mnogo komandi, koje se mogu koristiti za manipuli-sanje objektima i izvršavanje operacija potrebnih za prikazivanje interaktivnih aplikacija.U ovom poglavlju sve komande OpenGL-a su objašnjene do najsitnijih detalja.

Drugo poglavlje je posvećeno GLUT-u i sam naziv GLUT predstavlja akronim odOpenGL Utility Toolkit. U ovom poglavlju steći će se osnovna znanja potrebna zapravljenje aplikacije pomoću GLUT-a. Sadržina poglavlja nije predviđena da korisnikanauči da pravi zadivljujuće vizuelne efekte, pošto je njegov cilj da na što jednostavnijinačin savlada korišćenje ove biblioteke.

U trećem poglavlju prikazano je 47 primera sa kompletnom sintaksom svakog pro-grama, kao i sa pratećim objašnjenjima i komentarima, radi lakšeg i efikasnijeg shva-tanja zadatog problema.

Kao što je veće rečeno, knjiga ima tri dodatka. Prvi dodatak ima osam strana iu njemu su smeštene slike u boji koje su rezultat rada odgovarajućih programa. Drugidodatak je posvećen problematici pravljenja "kostura" programa. Treba napomenutida je ovaj problem rešavan kroz odgovarajuće primere, jer se pokazalo, kroz praksu, daje to najefikasniji način. Treći dodatak je posvećen koordinatnim sistemima, kako bi sestudenti podsetili svega što im treba po pitanju ove problematike. Na kraju je prikazanspisak literature, s tim što treba napomenuti da je korišćena literatura prikazana nakrajnje proizvoljan način.

Studenti druge godine Računarskog fakulteta (Opšti smer, generacija 2004.) sunam pomogli tokom pisanja ove knjige, i mi koristimo ovu priliku da im se još jednomzahvalimo.

Beograd, maj 2006. Autori

Page 3: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

Glava 1

OpenGL - Open Graphic Language

OpenGL predstavlja primarno okruženje prilikom razvoja interaktivnih 2D i 3D grafičkihaplikacija. Naziv OpenGL predstavlja akronim od Open Graphic Language, što značida je reč o otvorenom grafičkom jeziku, tj. o grafičkom jeziku koji je svima dostupan.OpenGL interfejs sadrži mnogo komandi, koje se mogu koristiti za manipulisanje objek-tima i izvršavanje operacija potrebnih za prikazivanje interaktivnih aplikacija. OpenGLje industrijski API (Application Programming Interface) koji preovladava u razvoju 2Di 3D grafičkih aplikacija i koji je originalno razvila firma SGI (Sillicon Graphics, Inc.).Za razliku od svog prethodnika, a prethodnik je IRIS GL, OpenGL je i po dizajnu i poplatformi nezavisan od operativnog sistema. Treba napomenuti da je OpenGL najpo-znatije okruženje za razvoj prenosivih i interaktivnih 2D i 3D grafičkih aplikacija. Jošjedna napomena. OpenGL je u stanju da iskoristi novu mogućnost 3D video karticakako bi se izvršilo izuzetno brzo i efikasno renderovanje scene. Ovo se često nazivahardverska akceleracija.

Biblioteka sadrži oko 120 različitih funkcija (komandi), koje programeri koriste zazadavanje objekata i operacija neophodnih za pisanje interaktivnih grafičkih aplikacija.

Danas grafički sistem OpenGL podržava većina proizvođača hardvera i softvera.Taj sistem je dostupan svima, kako onima koji rade u Windows okruženju, tako i ko-risnicima računara porodice Apple. Otvoreni kôd sistema Mesa (paket API funkcija nabazi OpenGL-a) može se kompajlirati na većini operativnih sistema, pa samim tim i naoperativnom sistemu Linux.

Karakteristične su sledeće osobine OpenGL-a, koje su obezbedile širenje i razvojtog grafičkog standarda:

• Stabilnost. Dopune i izmene u standardu realizuju se na takav način da održa-vaju kompatibilnost sa ranije razvijenim programskim alatima.

• Pouzdanost i prenosivost. Aplikacije, koje koriste OpenGL, garantuju istovetanvizuelni rezultat nezavisno od tipa korišćenog operativnog sistema i organizacijeprikazivanja informacija. Osim toga, te aplikacije mogu da se izvršavaju kako napersonalnim računarima, tako i na radnim stanicama i superračunarima.

• Lakoća primene. Standard OpenGL ima dobro osmišljenu strukturu i intuitivno

Page 4: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

2

jasan interfejs, što omogućava da se sa manje truda izgrade efektivne aplikacije,koje sadrže manji broj redova koda nego kada se koriste druge grafičke biblioteke.Neophodne funkcije za obezbeđivanje kompatibilnosti kada se primenjuje različitaoprema, realizovane su na nivou biblioteke i značajno pojednostavljuju razvojaplikacija.

Postojanje dobrog baznog paketa za razvoj tzv. trodimenzionalnih aplikacija olakšavastudentima razumevanje osnovnih tema kursa računarske grafike - modelovanje trodi-menzionalnih objekata, senčenje, nanošenje teksture, animaciju itd. Široke funkcionalnemogućnosti OpenGL-a služe kao dobar temelj za izlaganje teoretskih i praktičnih as-pekata predmeta.

1.1 Osnove OpenGL-aU ovom delu će se obratiti pažnja na osnovne mogućnosti OpenGL-a, na interfejs, nasamu arhitekturu OpenGL-a, na sintaksu komandi i funkcija, i na kraju će biti prikazanjednostavan program u celosti.

1.1.1 Osnovne mogućnosti

Opisivanje mogućnosti OpenGL-a može da se obavi preko funkcija njegove biblioteke.Sve funkcije mogu da se podele u pet kategorija:

• Funkcije za opisivanje primitiva definišu objekte nižeg nivoa hijerarhije (primi-tive), koje je grafički podsistem sposoban da prikaže. U OpenGL-u u primitivespadaju tačka, linija, poligon (mnogougao) itd.

• Funkcije za opisivanje izvora svetla služe za opisivanje položaja i parametaraizvora svetla, koji su raspoređeni u trodimenzionalnoj sceni.

• Funkcije zadavanja atributa pomoću kojih programer definiše kako će na ekranuizgledati prikazani objekat. Drugim rečima, ako se pomoću primitiva definiše štase pojavljuje na ekranu, to atributi definišu način prikazivanja na ekranu. Prekoatributa OpenGL dozvoljava zadavanje boje, karakteristika materijala, teksture,parametre osvetljavanja itd.

• Funkcije vizuelizacije omogućavaju da se definiše položaj posmatrača u virtuel-nom prostoru, kao i parametri objektiva kamere. Znajući te parametre, sistemmože ne samo da pravilno napravi prikaz, već i da iseče (odseče) objekte koji suvan vidnog polja.

• Skup funkcija za geometrijske transformacije omogućava programeru daobavi različite transformacije objekata - rotiranje, pomeranje (translacija), skali-ranje (promena dimenzija).

Pri tome, OpenGL može da obavi dodatne operacije, takve kao što je korišćenje tzv.splajnova za kreiranje linija i površina, uklanjanje nevidljivih delova prikaza, rad saprikazima na nivou piksela itd.

Page 5: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

3

1.1.2 Interfejs OpenGL-a

OpenGL se sastoji od skupa biblioteka. Sve bazne funkcije se drže u osnovnoj biblioteci,za čije se označavanje koristi skraćenica GL. Pored osnovne, OpenGL sadrži i nekolikodopunskih biblioteka.

Prva od njih je biblioteka pomoćnih alata GLU (GL Utility). Sve funkcije te biblio-teke definisane su preko baznih funkcija GL. U sastav GLU ušla je realizacija složenijihfunkcija, kao što su skup popularnih geometrijskih primitiva (kocka, sfera, cilindar,disk), funkcije za kreiranje splajnova, realizacija dopunskih operacija nad matricamaitd.

OpenGL ne sadrži nikakve specijalne komande za rad sa prozorima ili prihvatulaznih informacija od korisnika. Zato su napravljene specijalne prenosive (portabilne)biblioteke koje obezbeđuju često korišćene funkcije za međusobno delovanje računara ikorisnika, kao i za prikaz informacija preko podsistema prozora. Najpopularnija biblio-teka je GLUT (GL Utility Toolkit). Formalno, GLUT nije u sastavu OpenGL-a, ali seukljuèuje u sve njegove distribucije i postoje realizacije za različite platforme. GLUTpredstavlja samo minimalni neophodni skup funkcija za pravljenje OpenGL aplikacija.Funkcionalno analogna biblioteka GL(AU)X manje je popularna.

Slika 1.1. Organizacija biblioteke OpenGL-a

Osim toga, funkcije, specifične za konkretan podsistem prozora, obično ulaze u nje-gov programski interfejs aplikacije (API). Tako funkcije, koje podržavaju izvršavanjeOpenGL-a, ulaze u sastav Win32 API i X Window. Na slici 1.1 šematski je pred-stavljena organizacija sistema biblioteka u verziji koja radi unutar operativnog sistemaWindows. Analogna organizacija se koristi i u drugim verzijama OpenGL-a.

1.1.3 Arhitektura OpenGL-a

Funkcije OpenGL-a realizovane su u modelu klijent-server. Aplikacija nastupa u uloziklijenta - ona produkuje komande, a server OpenGL ih interpretira i izvršava. Samserver može da se nalazi na tom istom računaru, na kom se nalazi i klijent (na primer,u obliku dinamički učitane biblioteke - DLL), tako i na drugom računaru (pri tome semože koristiti specijalni protokol prenosa podataka između računara).

GL obrađuje i crta u baferu kadra (frame buffer) grafičke primitive uzimajući uobzir moguće izborne režime. Svaki režim može biti promenjen nezavisno od drugih.

Page 6: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

4

Definisanje primitiva, izbor režima i druge operacije opisuju se pomoću komandi uobliku poziva funkcija prikladne biblioteke.

Primitive se definišu skupom od jednog ili više verteksa (temena). Verteks definišetačku, kraj odsečka ili ugao poligona. Svakom verteksu su pridruženi neki podaci (koor-dinate, boja, normala, koordinate teksture itd.), koji se nazivaju atributima. U većinislučajeva, svaki verteks se obrađuje nezavisno od drugih.

Sa arhitektonske tačke gledišta, grafički sistem OpenGL je konvejer (slika 1.2), kojise sastoji od sukcesivnih etapa obrade (tzv. protočna obrada) grafičkih podataka.

Slika 1.2. Funkcionisanje konvejera OpenGL-a

Komande OpenGL uvek se obrađuju u poretku koji odgovara redosledu njihovog pojavlji-vanja mada se mogu pojaviti zadrške u proizvođenju njihovog efekta. U većini slučajeva,OpenGL daje neposredni interfejs, tj. definicija objekta izaziva njegovu vizuelizaciju ubaferu kadra.

Sa tačke gledišta programera, OpenGL je skup komandi koje upravljaju korišće-njem grafičkog hardvera. Ako se hardver sastoji samo od pomenutog bafera kadra,tada OpenGL mora potpuno da se realizuje korišćenjem resursa centralnog procesora.Obično grafički hardver daje različite nivoe ubrzavanja: od hardverske realizacije gene-risanja linija i poligona do moćnih grafičkih procesora sa podrškom za različite operacijenad geometrijskim podacima.

OpenGL je međusloj između hardverskog i korisničkog nivoa, što omogućava da sedobije identičan interfejs na različitim platformama koristeći hardversku podršku.

Osim toga, OpenGL može da se razmatra kao konačni automat, čije stanje jedefinisano mnoštvom vrednosti specijalnih promenljivih i vrednostima tekuće normale,boje, koordinata teksture i drugih atributa i obeležja. Sve te informacije će se koristitipri ulasku u grafički sistem koordinata verteksa za pravljenje figure, u koju ona ulazi.Smena stanja obavlja se pomoću komandi koje se formiraju kao pozivi funkcija.

1.1.4 Sintaksa komandi

Definicije komandi GL nalaze se u fajlu gl.h i stoga ga je za njihovo uključenje potrebnonapisati

Page 7: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

5

#include <gl/gl.h>

Za rad sa bibliotekom GLU potrebno je na analogan način uključiti fajl glu.h. Verzijetih biblioteka, po pravilu, uključuju se u distribucije razvojnih okruženja (sistema zaprogramiranje) firmi Microsoft (Visual C++) ili Borland (C++). Za razliku od stan-dardnih biblioteka, paket GLUT treba instalirati i posebno priključiti.

Sve komande (procedure i funkcije) biblioteke GL počinju prefiksom gl, sve kon-stante - prefiksom GL_. Odgovarajuće komande i konstante biblioteka GLU i GLUTanalogno imaju prefikse glu (GLU_) i glut (GLUT_). Osim toga, u nazive komandi ulazei sufiksi, koji nose informaciju o broju i tipu parametara koji se prenose. U OpenGL-upun naziv komande ima oblik:

type glCommand_name[1 2 3 4][b s i f d ub us ui][v](type1 arg1,...,typeN argN)

Naziv se sastoji od nekoliko delova:

• gl - naziv biblioteke, u kojoj je opisana ta funkcija: za bazne funkcije OpenGL,funkcije iz biblioteka GL, GLU, GLUT, GLAUX su gl, glu, glut, aux, respektivno.

• Command_name - naziv komande (procedure ili funkcije).

• [1 2 3 4] - broj argumenata komande.

• [b s i f d ub us ui] - tip argumenta: simbol b deklariše GLbyte (analogonchar u C i C++ programskim jezicima), simbol i deklariše GLint (analogonint), simbol f deklariše GLfloat (analogon float) itd. Kompletan spisak tipovai njihovi opisi mogu da se vide u datoteci gl.h.

• [v] - postojanje tog simbola pokazuje da se kao parametar funkcije koristi pokazi-vač na niz vrednosti.

Simboli u kvadratnim zagradama u nekim nazivima se ne koriste. Na primer, komandaglVertex2i() opisana je u biblioteci GL, i kao parametre koristi dva cela broja, akomanda glColor3fv() koristi kao parametar pokazivač na niz od tri realna broja.

Korišćenje više varijanti svake komande može se delimično izbeći primenom pre-opterećenja funkcije jezika C++. Međutim, interfejs OpenGL nije predviđen za konkre-tan jezik programiranja i prema tome mora biti maksimalno univerzalan.

1.1.5 Primer aplikacije

Tipičan program koji koristi OpenGL počinje sa definisanjem prozora u kome će se vršitirenderovanje (prikazivanje). Zatim se pravi kontekst (klijent) OpenGL i pridružuje setom prozoru. Dalje programer može slobodno da koristi komande i operacije OpenGLAPI interfejsa.

Niže je dat izvorni kôd malog programa napisanog korišćenjem biblioteke GLUT -svojevrsni analogon klasičnog primera "Hello, World!".

Sve što radi taj program je crtanje crvenog kvadrata u centru prozora (slika 1.3).

Page 8: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

6

Samim tim što je primer jednostavan, omogućava da se shvate osnovni principi pro-gramiranja pomoću OpenGL-a.

#include <stdlib.h>

/* ukljucivanje biblioteke GLUT */#include <gl/glut.h>

/* inicijalna sirina i visina prozora */GLint Width = 512, Height = 512;

/* velicina kocke */const int CubeSize = 200;

/* ova funkcija upravlja prikazom na ekranu */void Display(void){

int left, right, top, bottom;

left = (Width - CubeSize) / 2;right = left + CubeSize;bottom = (Height - CubeSize) / 2;top = bottom + CubeSize;

glClearColor(0, 0, 0, 1);glClear(GL_COLOR_BUFFER_BIT);

glColor3ub(255,0,0);glBegin(GL_QUADS);glVertex2f(left,bottom);glVertex2f(left,top);glVertex2f(right,top);glVertex2f(right,bottom);

glEnd();

glFinish();}

/* Ova funkcija se poziva pri promeni dimenzija prozora */void Reshape(GLint w, GLint h){

Width = w;Height = h;

/* postavljamo dimenzije oblasti prikazivanja, tj. vizir */

Page 9: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

7

glViewport(0, 0, w, h);

/* ortografska projekcija */glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0, w, 0, h, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);glLoadIdentity();

}

/* Funkcija koja obradjuje dogadjaje od tastature */voidKeyboard( unsigned char key, int x, int y ){#define ESCAPE ’\033’

if( key == ESCAPE )exit(0);

}

/* Glavna petlja aplikacije */main(int argc, char *argv[]){

glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowSize(Width, Height);glutCreateWindow("Primer crvenog kvadrata");

glutDisplayFunc(Display);glutReshapeFunc(Reshape);glutKeyboardFunc(Keyboard);

glutMainLoop();}

Bez obzira na veličinu, to je potpun program, koji može da se iskompajlira i izvršava nasvakom sistemu koji podržava OpenGL i GLUT. Rezultat rada ovog programa prikazanje na slici 1.3.

Biblioteka GLUT podržava međusobno delovanje sa korisnikom preko tzv. funkcijasa povratnim pozivom (callback function). Ako je korisnik pomerio miša, pritisnuotaster na tastaturi ili promenio veličinu prozora, javlja se događaj i poziva se odgovara-juća korisnička funkcija - rukovalac događaja (funkcija sa povratnim pozivom).

Trebalo bi razmotriti detaljnije funkciju main u datom primeru. Ova funkcija se

Page 10: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

8

sastoji od tri dela - inicijalizacije prozora, u kojem će crtati OpenGL, podešavanjafunkcija sa povratnim pozivom i glavne petlje za obradu događaja.

Slika 1.3. Izlazni prozor gornjeg programa

Inicijalizacija prozora se sastoji od podešavanja odgovarajućih bafera kadra, početnogpoložaja i dimenzija prozora, kao i zaglavlja prozora.

Funkcija glutInit(&argc, argv) obavlja početnu inicijalizaciju same bibliotekeGLUT.

Komanda glutInitDisplayMode(GLUT_RGB) inicijalizuje bafer kadra i postavljarežim RGB boja.

Komanda glutInitWindowSize(Width, Height) koristi se za zadavanje počet-nih dimenzija prozora.

Na kraju, glutCreateWindow("Primer crvenog kvadrata") zadaje zaglavljeprozora i vizuelizuje sam prozor na ekranu.

Zatim komande

glutDisplayFunc(Display);glutReshapeFunc(Reshape);glutKeyboardFunc(Keyboard);

registruju funkcije Display(), Reshape() i Keyboard() kao funkcije koje će bitipozivane, respektivno, pri ponovnom prikazivanju prozora, promeni dimenzija prozora,pritiskanju tastera na tastaturi.

Kontrola svih događaja i pozivanje potrebnih funkcija obavlja se unutar beskonačnepetlje u funkciji glutMainLoop().

Treba uočiti da biblioteka GLUT ne ulazi u sastav OpenGL-a i samo je prenosivimeđusloj između OpenGL i podsistema prozora, tako da predstavlja minimalni interfejs.OpenGL aplikacija za konkretnu platformu može da se napiše pomoću specifičnih APIfunkcija (Win32, X Window itd.), koje po pravilu daju šire mogućnosti. Detaljniji opisrada sa bibliotekom GLUT opisan je u posebnom poglavlju.

Page 11: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

9

Svi pozivi komandi OpenGL nastaju u rukovaocima događaja. Oni će biti obrađenikasnije. Sada treba obratiti pažnju na funkciju Display, u koju je smešten kôd koji jeneposredno odgovoran za crtanje na ekranu. Sledi sekvenca komandi funkcije Display:

glClearColor(0, 0, 0, 1);glClear(GL_COLOR_BUFFER_BIT);

glColor3ub(255,0,0);glBegin(GL_QUADS);glVertex2f(left,bottom);glVertex2f(left,top);glVertex2f(right,top);glVertex2f(right,bottom);

glEnd();

koja čisti prozor i prikazuje kvadrat na ekranu preko zadavanja četiri verteksa i boje.Sledi spisak sa detaljnim objašnjenjima svih komandi i funkcija OpenGL-a. Funkcije

i komande su razvrstane po oblastima primene kako bi se lakše objasnile i zapamtile.

1.2 Rad sa bitmapamaRasterske slike (bitmape) se sastoje od piksela koji su raspoređeni po zamišljenoj mrežipomoćnih tačaka. Pikseli su osnovni elementi svake rasterske slike i predstavljeni supomoću malenih tačaka sa individualnim bojama. Skup piksela generišu sliku koja sevidi na monitoru. Uobičajeni monitori imaju rezoluciju od 72 ili 96 piksela po inču, štozavisi od samog monitora i njegovog podešavanja.

Izgled bitmapa zavisi od rezolucije. Rezolucija govori koliko se piksela "nalazi"unutar slike i obično se taj broj izražava kao dpi (dots per inch - tačaka po inču) ili kaoppi (pixels per inch - piksela po inču). Rasterske slike se prikazuju na monitorima sarezolucijama 72 ppi ili 96 ppi. Kada bitmapa treba da se štampa, onda takvu rasterskusliku treba "imati" u većoj rezoluciji (od 150 ppi pa nadalje).

Kada treba povećati rezoluciju slike, to znači da treba povećati broj piksela. Kadase prave novi pikseli, onda prateći softver mora da odredi boje tih novih piksela, naosnovu boja piksela u njihovom okruženju. Ovaj proces određivanja boja novih pikselanaziva se interpolacija.

Uobičajeni grafički formati rasterskih slika su: BMP, GIF, JPEG, JPG, PNG, PICT(Mekintoš), PCX, TIFF, PSD (Adobe Photoshop).

1.2.1 glAreTexturesResident

Komanda glAreTexturesResidentproverava i određuje da li je odgovarajuća teksturaučitana u memoriju. Sintaksa ove komande unutar programskog jezika C je:

GLboolean glAreTexturesResident(GLsizei n,const GLuint *textures,GLboolean *residences)

Page 12: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

10

Definisani parametri u gorenavedenoj sintaksi su:

• n - određuje broj tekstura koje proverava da li su učitane u memoriju.

• textures - određuje niz koji sadrži imena tekstura koje treba proveriti.

• residences - definiše kako će se određeni statusi tekstura vratiti i prikazati.

GL određuje "radni set" tekstura koje su rezidentne u memoriji. Pomenuta komandaglAreTexturesResident proverava status n tekstura koje su definisane unutar para-metra textures. Ako su sve imenovane teksture rezidentne, onda pomenuta komandaglAreTexturesResident vraća GL_TRUE i sadržina memorije se ne menja. Ako ni-jedna imenovana tekstura nije rezidentna, onda komanda glAreTexturesResidentvraća GL_FALSE i prikazuje status n elemenata koji su ostali rezidentni u memoriji.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_VALUE kada je n negativno.

• GL_INVALID_VALUE kada bilo koji element parametra textures ima vrednost 0ili kada nije naziv teksture.

• GL_INVALID_OPERATION ako je komanda glAreTexturesResident izvršena iz-među izvršenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.2 glBindTexture

Komanda glBindTexture pridružuje imenovanu teksturu opisnoj odredišnoj vrednostiteksture. Sintaksa ove komande unutar okruženja programskog jezika C je:

void glBindTexture(GLenum target, GLuint texture)

Definisani parametri u gorenavedenoj sintaksi su:

• target - određuje odredišnu vrednost kojoj se tekstura pridružuje. To morajuda budu vrednosti GL_TEXTURE_1D ili GL_TEXTURE_2D.

• texture - određuje ime (naziv) teksture.

Komanda glBindTexture omogućava kreiranje ili upotrebu imenovanih tekstura. Ka-da se željena tekstura poveže sa parametrom target, prethodna povezivanja teksturasa ovim parametrom se prekidaju. Imenima tekstura dodeljuju se celobrojne vrednosti,gde je vrednost 0 rezervisana za predstavljanje uobičajene (default) teksture za svakuvrednost parametra target. Korisnik može da koristi komandu glGenTextures dageneriše nova imena tekstura.

Kada se izvrši prvo povezivanje teksture, onda ona preuzima dimenzionalnostsvog parametra target: tekstura koja se prvi put poveže sa GL_TEXTURE_1D, postajejednodimenzionalna tekstura i tekstura koja se prvi put poveže sa GL_TEXTURE_2D,postaje dvodimenzionalna tekstura. Veza teksture, kreirana od strane glBindTexturekomande, ostaje aktivna sve dok se neka druga tekstura ne poveže sa istom vrednošću

Page 13: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

11

parametra target ili dok se veza teksture ne obriše primenom glDeleteTextureskomande.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_ENUM kada target nema odgovarajuću vrednost.

• GL_INVALID_OPERATION kada tekstura nema dimenzionalnost koja odgovara di-menzionalnosti parametra target.

• GL_INVALID_OPERATION ako je komanda glBindTexture izvršena između izvr-šenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.3 glBitmap

Komanda glBitmap omogućava iscrtavanje (prikazivanje) bitmape, tj. rasterske slike.Sintaksa ove komande unutar programskog jezika C je:

void glBitmap(GLsizei width,GLsizei height,GLfloat xorig,GLfloat yorig,GLfloat xmove,GLfloat ymove,const GLubyte *bitmap)

Definisani parametri u gorenavedenoj sintaksi su:

• width - određuje širinu slike u pikselima.

• height - određuje visinu slike u pikselima.

• xorig, yorig - određuju lokaciju koordinatnog početka same rasterske slike.Koordinatni početak se meri od donjeg levog ugla rasterske slike i pozitivnismerovi su nagore i udesno od koordinatnog početka.

• xmove, ymove - određuje x i y pomeraje za koje se pomera rasterska slika, uodnosu na prvobitnu lokaciju unutar prozora.

• bitmap - određuje adresu (lokaciju) rasterske slike koja se čitava u aktuelnudatoteku.

Komanda glBitmap ima nekoliko parametara, koji su već pomenuti. Ako je inicijalnapozicija rasterske slike pogrešna, onda se komanda glBitmap ne izvršava. U drugomslučaju, donji levi ugao rasterske slike se pozicionira na sledeće koordinate prozora:

xw = |xr − x0| i yw = |yr − y0|

gde (xr, yr) predstavlja poziciju rastera i gde (x0, y0) predstavlja koordinatni poče-tak same slike. Naredni fragmenti se generišu tako što svaki sledeći piksel odgovara

Page 14: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

12

određenom pikselu same slike. Ovi fragmenti se generišu korišćenjem tekuće rasterske z

koordinate, boje, indeksa boja ili koordinata tekuće rasterske teksture. Kada se raster-ska slika iscrta, tada se vrši pomeranje slike na krajnje odredište. Treba napomenuti danema promena z koordinata tekuće rasterske pozicije, tekuće rasterske boje, koordinatateksture ili odgovarajućeg indeksa.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_VALUE kada su vrednosti width ili height negativne.

• GL_INVALID_OPERATION ako je komanda glBitmap izvršena između izvršenjalokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.4 glCopyPixels

Komanda glCopyPixels kopira piksele unutar bafera okvira. Sintaksa ove komandeunutar okruženja programskog jezika C je:

void glCopyPixels(GLint x,GLint y,GLsizei width,GLsizei height,GLenum type)

Definisani parametri u gorenavedenoj sintaksi su:

• x,y - određuje levu donju koordinatu pravougaonog regiona u koji se kopirajupikseli.

• width, height - određuje dimenzije pravougaonog regiona u koji se kopirajupikseli. Vrednosti moraju da budu pozitivne.

• type - određuju koje se vrednosti boja, vrednosti dubina ili vrednosti maskiranjakopiraju. Prihvaćene su sledeće simboličke konstante:

GL_COLOR, GL_DEPTH i GL_STENCIL.

Komanda glCopyPixels kopira piksele iz bafera u odgovarajući region. Nekolikoparametara kontroliše procesiranje podataka piksela dok se vrši kopiranje. Ovi parametrisu podešeni unutar tri komande: glPixelTransfer, glPixelMap i glPixelZoom.Komanda glCopyPixels počinje kopiranje od donjeg levog ugla sa koordinatama (x+i, y + j), gde je 0 < i < width i 0 < j < height. Pikseli se kopiraju od najnižegreda naviše i od kolone uz levu ivicu pravougaonog regiona nadesno. Parametar typedefiniše koji će se podaci iskopirati, a reč je o podacima "vezanim" za boju, dubinui maskiranje. Parametar type može da ima sledeće vrednosti (vrednosti i pripadajućekomponente se detaljnije objašnjene unutar komande glGet:

Page 15: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

13

• GL_COLOR - učitava RGBA boje iz izvornog bafera. Kada je GL u RGBA modu,svaka učitana crvena, zelena, plava i alfa komponenta piksela se konvertuje uinternu vrednost sa pokretnim zarezom i sa proizvoljnom preciznošću. Prilikommapiranja vrši se konverzija najveće vrednosti na vrednost 1.0, a vrednosti 0na vrednost 0.0. Rezultujuća vrednost boje se množi sa GL_c_SCALE i dodajeGL_c_BIAS, gde argument c ima vrednosti RED, GREEN, BLUE i ALPHA za kom-ponente boja, respektivno. Sve vrednosti se nalaze u opsegu [0, 1].

• GL_DEPTH - učitava vrednosti dubine iz izvornog bafera i konevrtuje ih u zapisesa pokretnim zarezom i sa proizvoljnom preciznošću. Rezultujuća vrednost semnoži sa GL_DEPTH_SCALE i dodaje GL_DEPTH_BIAS. Sve vrednosti se nalaze uopsegu [0, 1].

• GL_STENCIL - učitava parametre maskiranja iz izvornog bafera maski i konver-tuje ih u internu vrednost sa fiksnim zarezom. Svaka vrednost se pomera zaGL_INDEX_SHIFT bitova ulevo i dodaje se vrednost GL_INDEX_OFFSET. Ako jevrednost GL_INDEX_SHIFT negativna, onda se pomeranje vrši udesno.

Gornja rasterizacija se obavlja sa faktorom zumiranja, čija je vrednost 1.0. Ako se isko-risti komanda glPixelZoom da bi se promenili x i y faktori zumiranja, onda se pikselikonvertuju na sledeći način. Ako koordinate (xr, yr) predstavljaju tekuću rasterskupoziciju i ako se željeni pikseli nalaze u koloni i i u redu j, onda se generišu fragmentiza piksele koji se nalaze unutar pravougaonika sa temenima

[xr + zoomx(i), yr + zoomy(j)] i [xr + zoomx(i + 1), yr + zoomy(j + 1)] ,

gde zoomx predstavlja vrednost promenljive GL_ZOOM_X i gde zoomy predstavlja vred-nost promenljive GL_ZOOM_Y.

Na primer, za kopiranje piksela u boji u donji levi ugao prozora na tekuću rasterskupoziciju, komanda je:

glCopyPixels(0, 0, 1, 1, GL_COLOR);

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_ENUM kada vrednost type nije prihvaćena.

• GL_INVALID_VALUE kada su vrednosti width ili height negativne.

• GL_INVALID_OPERATION ako parametar type ima vrednost GL_DEPTH, a ne pos-toji bafer dubine.

• GL_INVALID_OPERATION ako parametar type ima vrednost GL_STENCIL, a nepostoji bafer maske.

• GL_INVALID_OPERATION ako je komanda glCopyPixels izvršena između izvr-šenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

Page 16: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

14

1.2.5 glCopyTexImage1D

Komanda glCopyTexImage1D kopira piksele u jednodimenzionalnu sliku teksture. Sin-taksa pomenute komande unutar okruženja programskog jezika C je:

void glCopyTexImage1D(GLenum target,GLint level,GLint internalformat,GLint x,GLint y,GLsizei width,GLint border)

Definisani parametri u gorenavedenoj sintaksi su:

• target - određuje odredišnu teksturu. Mora imati vrednost GL_TEXTURE_1D.

• level - određuje broj koji određuje nivo detalja. Nivo 0 je osnovni nivo slike.Nivo n je n-ta mipmap redukcija slike.

• internalformat - određuje interni format teksture i mora da bude jedna odsledećih simboličkih konstanti:

GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16,GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, GL_LUMINANCE12,GL_LUMINANCE16, GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4,GL_LUMINANCE6_ALPHA2,GL_LUMINANCE8_ALPHA8,GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,GL_LUMINANCE16_ALPHA16, GL_INTENSITY,GL_INTENSITY4,GL_INTENSITY8, GL_INTENSITY12, GL_INTENSITY16,GL_RGB, GL_R3_G3_B2, GL_RGB4,GL_RGB5, GL_RGB8,GL_RGB10, GL_RGB12, GL_RGB16, GL_RGBA, GL_RGBA2,GL_RGBA4, GL_RGB5_A1, GL_RGBA8, GL_RGB10_A2,GL_RGBA12, ili GL_RGBA16.

• x, y - određuje koordinate levog ugla reda piksela koji se kopira unutar prozora.

• width - određuje širinu slike teksture. Mora biti 2n + 2 border (ivica) za celo-brojno n. Visina 1D slike teksture je 1.

• border - određuje širinu ivice. Mora biti 1 ili 0.

Komanda glCopyTexImage1D definiše jednodimenzionalnu sliku teksture sa pikselimaiz tekućeg GL_READ_BUFFER. Red piksela, usaglašen sa ekranom, sa levim uglom ukoordinati (x, y) i sa dužinom width + 2 * border definiše niz tekstura na niovumipmapa. Pikseli u redu se procesiraju upravo onako kako ih komanda glCopyPixelspoziva, ali se proces zaustavlja pre krajnje konverzije. U tom momentu, sve vrednostikomponenti piksela nalaze se u opsegu [0, 1] i tada se konvertuju u interni formattekstura kako bi se lakše smestile u niz teksela.

U toku rada mogu da se generišu sledeće greške:

Page 17: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

15

• GL_INVALID_ENUM ako target nije GL_TEXTURE_1D.

• GL_INVALID_VALUE ako je vrednost level manja od 0.

• GL_INVALID_VALUE ako je vrednost level veća od max, gde je max vraćenavrednost od strane GL_MAX_TEXTURE_SIZE.

• GL_INVALID_VALUE ako internalFormat nije jedna od ponuđenih vrednosti.

• GL_INVALID_VALUE ako je parametar width manji od vrednosti 0 ili ako jeveći od vrednosti 2+GL_MAX_TEXTURE_SIZE ili ako ne može da se predstavi kao2**n+2*border za neke celobrojne vrednosti n.

• GL_INVALID_VALUE ako border nije 0 ili 1.

• GL_INVALID_OPERATION ako je komanda glCopyTexImage1D izvršena izmeđuizvršenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.6 glCopyTexImage2D

Komanda glCopyTexImage2D kopira piksele u dvodimenzionalnu sliku teksture. Sin-taksa pomenute komande unutar okruženja programskog jezika C je:

void glCopyTexImage1D(GLenum target,GLint level,GLint internalformat,GLint x,GLint y,GLsizei width,GLsizei height,GLint border)

Definisani parametri u gorenavedenoj sintaksi su:

• target - određuje odredišnu teksturu. Mora imati vrednost GL_TEXTURE_1D.

• level - određuje broj koji određuje nivo detalja. Nivo 0 je osnovni nivo slike.Nivo n je n-ta mipmap redukcija slike.

• internalformat - određuje interni format teksture i mora da bude jedna odsledećih simboličkih konstanti:

GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16,GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, GL_LUMINANCE12,GL_LUMINANCE16, GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4,GL_LUMINANCE6_ALPHA2,GL_LUMINANCE8_ALPHA8,GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,GL_LUMINANCE16_ALPHA16, GL_INTENSITY,GL_INTENSITY4,GL_INTENSITY8, GL_INTENSITY12, GL_INTENSITY16,

Page 18: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

16

GL_RGB, GL_R3_G3_B2, GL_RGB4,GL_RGB5, GL_RGB8,GL_RGB10, GL_RGB12, GL_RGB16, GL_RGBA, GL_RGBA2,GL_RGBA4, GL_RGB5_A1, GL_RGBA8, GL_RGB10_A2,GL_RGBA12, ili GL_RGBA16.

• x, y - određuje koordinate levog ugla reda piksela koji se kopira unutar prozora.

• width - određuje širinu slike teksture. Mora biti 2n + 2 border (ivica) za celo-brojno n.

• height - određuje visinu slike teksture. Mora biti 2m + 2 border (ivica) zacelobrojno m.

• border - određuje širinu ivice. Mora biti 1 ili 0.

Komanda glCopyTexImage2D definiše dvodimenzionalnu sliku teksture sa pikselimaiz tekućeg GL_READ_BUFFER. Red piksela, usaglašen sa ekranom, sa levim uglom ukoordinati (x, y), sa dužinom width + 2 * border i visinom height + 2 * borderdefiniše niz tekstura na nivou mipmapa. Pikseli u redu se procesiraju upravo onako kakoih komanda glCopyPixels poziva, ali se proces zaustavlja pre krajnje konverzije. Utom momentu, sve vrednosti komponenti piksela se nalaze u opsegu [0, 1] i tada sekonvertuju u interni format tekstura, kako bi se lakše smestile u niz teksela. Trebanapomenuti da x i y ekranske koordinate odgovaraju s i t koordinatama teksture.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_ENUM ako target nije GL_TEXTURE_2D.

• GL_INVALID_VALUE ako je vrednost level manja od 0.

• GL_INVALID_VALUE ako je vrednost level veća od max, gde je max vraćenavrednost od strane GL_MAX_TEXTURE_SIZE.

• GL_INVALID_VALUE ako internalFormat nije jedna od ponuđenih vrednosti.

• GL_INVALID_VALUE ako je parametar width manji od vrednosti 0 ili ako je većiod vrednosti 2+GL_MAX_TEXTURE_SIZE ili ako visina i širina ne mogu da se pred-stave kao 2**k+2*border za neke celobrojne vrednost k.

• GL_INVALID_VALUE ako border nije 0 ili 1.

• GL_INVALID_OPERATION ako je komanda glCopyTexImage2D izvršena izmeđuizvršenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.7 glCopyTexSubImage1D

Komanda glCopyTexSubImage1D kopira jednodimenzionalnu podsliku teksture. Sin-taksa ove komande unutar okruženja programskog jezika C je:

Page 19: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

17

void glTexSubImage1D(GLenum target, GLint level,GLint xoffset, GLint x, GLint y,GLsizei width)

Definisani parametri u gorenavedenoj sintaksi su:

• target - određuje odredište teksture. Mora biti tipa GL_TEXTURE_1D.

• level - određuje broj koji određuje nivo detalja. Nivo 0 je osnovni nivo slike.Nivo n predstavlja n-tu redukciju slike.

• xoffset - određuje pomeraj u pravcu x ose u nizu teksture.

• x, y - definiše koordinate donjeg levog temena reda piksela koji se kopira unutarprozora.

• width - određuje širinu podslike teksture.

Komanda glCopyTexSubImage1D zamenjuje deo jednodimenzionalne slike teksture sapikselima iz izvornog bafera. Pikseli u redu se procesiraju upravo onako kako ih ko-manda glCopyPixels poziva, ali se proces zaustavlja pre krajnje konverzije. U tommomentu, sve vrednosti komponenti piksela se nalaze u opsegu [0, 1] i tada se konver-tuju u interni format tekstura, kako bi se lakše smestile u niz teksela.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_ENUM ako target nije GL_TEXTURE_1D.

• GL_INVALID_OPERATION ako niz tekstura nije definisan pomoću prethodne ope-racije koju su "odradile" komande glTexImage1D ili glCopyTexImage1D.

• GL_INVALID_VALUE ako je level manji od 0.

• GL_INVALID_VALUE ako je level veći od max, gde je max vrednost koju vraćaGL_MAX_TEXTURE_SIZE.

• GL_INVALID_VALUE ako je

y < -b ili width < -b,

gde je b širina GL_TEXTURE_BORDER okvira slike teksture.

• GL_INVALID_VALUE ako je

xoffset < -b ili (xoffset + width) > (w - b),

gde je w vrednost GL_TEXTURE_WIDTH, dok je b širina GL_TEXTURE_BORDERokvira slike teksture koja je izmenjena. Vrednost w uključuje dvostruku širinuokvira.

• GL_INVALID_OPERATION ako je komanda glCopyTexSubImage1D izvršena iz-među izvršenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

Page 20: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

18

1.2.8 glCopyTexSubImage2D

Komanda glCopyTexSubImage2D kopira dvodimenzionalnu podsliku teksture. Sin-taksa komande unutar programskog jezika C je:

void glTexSubImage2D(GLenum target, GLint level,GLint xoffset, GLint yoffset, GLint x,GLint y, GLsizei width, GLsizei height)

Definisani parametri u gorenavedenoj sintaksi su:

• target - određuje odredište teksture. Mora biti tipa GL_TEXTURE_2D.

• level - određuje broj koji određuje nivo detalja. Nivo 0 je osnovni nivo slike.Nivo n predstavlja n-tu redukciju slike.

• xoffset - određuje pomeraj u pravcu x ose u nizu teksture.

• yoffset - određuje pomeraj u pravcu y ose u nizu teksture.

• x, y - definiše koordinate donjeg levog temena reda piksela koji se kopira unutarprozora.

• width - određuje širinu podslike teksture.

• height - određuje visinu podslike teksture.

Komanda glCopyTexSubImage2D zamenjuje deo dvodimenzionalne slike teksture sapikselima iz izvornog bafera. Pikseli u redu se procesiraju upravo onako kako ih ko-manda glCopyPixels poziva, ali se proces zaustavlja pre krajnje konverzije. U tommomentu, sve vrednosti komponenti piksela se nalaze u opsegu [0, 1] i tada se konver-tuju u interni format tekstura, kako bi se lakše smestile u niz teksela.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_ENUM ako target nije GL_TEXTURE_2D.

• GL_INVALID_OPERATION ako niz tekstura nije definisan pomoću prethodne ope-racije koju su "odradile" komande glTexImage2D ili glCopyTexImage2D.

• GL_INVALID_VALUE ako je level manji od 0.

• GL_INVALID_VALUE ako je level veći od max, gde je max vrednost koju vraćaGL_MAX_TEXTURE_SIZE.

• GL_INVALID_VALUE ako je

y < -b ili width < -b,

gde je b širina GL_TEXTURE_BORDER okvira slike teksture.

• GL_INVALID_VALUE ako je

Page 21: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

19

xoffset < -b ili (xoffset + width) > (w - b),

gde je w vrednost GL_TEXTURE_WIDTH, gde je h vrednost GL_TEXTURE_HEIGHTi gde je b širina GL_TEXTURE_BORDER okvira slike teksture koja je izmenjena.Vrednosti w i h uključuju dvostruku širinu okvira.

• GL_INVALID_OPERATION ako je komanda glCopyTexSubImage2D izvršena iz-među izvršenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.9 glDrawPixels

Komanda glDrawPixels omogućava zapisivanje bloka piksela u bafer. Sintaksa ovekomande unutar programskog jezika C je:

void glDrawPixels(GLsizei width,GLsizei height,GLenum format,GLenum type,const GLvoid *pixels)

Definisani parametri u gorenavedenoj sintaksi su:

• width, height - određuju dimenzije pravougaonika piksela koji će biti zapisanu bafer.

• format - određuje format podataka piksela. Prihvatljive su sledeće vrednostisimboličkih konstanti:

GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT,GL_RGBA, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB,GL_LUMINANCE i GL_LUMINANCE_ALPHA.

• type - određuje tip podataka za piksele. Prihvatljive su sledeće vrednosti sim-boličkih konstanti:

GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP,GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT,GL_INT i GL_FLOAT.

• pixels - definiše marker za podatke piksela.

Komanda glDrawPixels učitava piksele iz memorije i zapisuje ih u bafer, i to u rela-tivnom odnosu na tekuću rastersku poziciju. Korisnik može da podesi rastersku pozicijuaktiviranjem glRasterPos. Gorepomenuti parametri utiču na to kako će se odvijatiproces prosleđivanja padataka piksela. Zanimljiv je parametar format. Taj parametarmože da ima jedanaest simboličkih vrednosti:

• GL_COLOR_INDEX - svaki piksel ima jedinstvenu vrednost i to je indeks boje.

Page 22: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

20

• GL_STENCIL_INDEX - svaki piksel ima jedinstvenu vrednost i to je indeks maske.

• GL_DEPTH_COMPONENT - svaki piksel ima jedinstvenu vrednost i to je komponentadubine.

• GL_RGBA - svaki piksel predstavlja grupu od četiri komponente: crvena kompo-nenta je prva, zelena druga, plava treća i četvrta komponenta je alfa.

• GL_RED - svaki piksel ima jedinstvenu vrednost i to je crvena komponenta.

• GL_GREEN - svaki piksel ima jedinstvenu vrednost i to je zelena komponenta.

• GL_BLUE - svaki piksel ima jedinstvenu vrednost i to je plava komponenta.

• GL_ALPHA - svaki piksel ima jedinstvenu vrednost i to je alfa komponenta.

• GL_RGB - svaki piksel predstavlja grupu od tri komponente: crvena komponentaje prva, zelena druga i treća komponenta je plava.

• GL_LUMINANCE - svaki piksel ima jedinstvenu vrednost i to je komponenta svet-losti.

• GL_LUMINANCE_ALPHA - svaki piksel predstavlja grupu od dve komponente: kom-ponenta svetlosti je prva i druga je alfa komponenta.

U sledećoj tabeli prikazana su značenja validnih konstanti za parametar type.

Tabela 1.1. Prateće vrednosti parametra TYPE i njihova značenja

type ZnačenjeGL_UNSIGNED_BYTE Neoznačena 8-bitna celobrojna vrednostGL_BYTE Jedinstveni bitovi u 8-bitnim celobrojnim vrednostimaGL_BITMAP Neoznačena 8-bitna celobrojna vrednostGL_UNSIGNED_SHORT Neoznačena 16-bitna celobrojna vrednostGL_SHORT Označena 16-bitna celobrojna vrednostGL_UNSIGNED_INT Neoznačena 32-bitna celobrojna vrednostGL_INT 32-bitna celobrojna vrednostGL_FLOAT Zapis sa pokretnom tačkom

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_VALUE ako su vrednosti width i height negativne.

• GL_INVALID_ENUM ako vrednosti parametara format i type nisu prihvatljive.

• GL_INVALID_OPERATION ako su vrednosti parametra format

GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB,GL_RGBA,GL_LUMINANCE ili GL_LUMINANCE_ALPHA,

i ako se GL nalazi u kolornom indeks modu.

Page 23: Predgovor - cet.rscet.rs/wp-content/uploads/2017/06/OpenGL-praktikum-Za-sajt.pdf · U sastav GLU ušla je realizacija složenijih funkcija, kao što su skup popularnih geometrijskih

21

• GL_INVALID_ENUM ako parametar type ima vrednost GL_BITMAP i ako parametarformat nema ili vrednost GL_COLOR_INDEX ili GL_STENCIL_INDEX.

• GL_INVALID_OPERATION ako parametar format ima GL_STENCIL_INDEX vred-nost i ako ne postoji bafer maski.

• GL_INVALID_OPERATION ako je komanda glDrawPixels izvršena između izvr-šenja lokalne komande glBegin i odgovarajućeg "para" glEnd.

1.2.10 glGetPixelMap

Komande

glGetPixelMapfv, glGetPixelMapuiv i glGetPixelMapusv

vraćaju specificirane mape piksela. Sintakse ovih komandi unutar okruženja program-skog jezika C su:

void glGetPixelMapfv(GLenum map, GLfloat *values)

void glGetPixelMapuiv(GLenum map, GLuint *values)

void glGetPixelMapusv(GLenum map, GLushort *values)

Definisani parametri u gorenavedenim sintaksama su:

• map - specificira ime mape piksela koju vraća. Prihvaćene su sledeće vrednosti:

GL_PIXEL_MAP_I_TO_I, GL_PIXEL_MAP_S_TO_S, GL_PIXEL_MAP_I_TO_R,GL_PIXEL_MAP_I_TO_G, GL_PIXEL_MAP_I_TO_B, GL_PIXEL_MAP_I_TO_A,GL_PIXEL_MAP_R_TO_R, GL_PIXEL_MAP_G_TO_G, GL_PIXEL_MAP_B_TO_Bi GL_PIXEL_MAP_A_TO_A.

• values - vraća sadržinu mape piksela.

Komanda glGetPixelMap vraća unutar parametra values sadržinu mape piksela spe-cificiranu unutar parametra map. Mape piksela se koriste kada rade sledeće komande:glReadPixels, glDrawPixels, glCopyPixels, glTexImage1D i glTexImage2D.

U toku rada mogu da se generišu sledeće greške:

• GL_INVALID_ENUM ako vrednost parametra map nije prihvatljiva.

• GL_INVALID_OPERATION ako je komanda glGetPixelMap izvršena između izvr-šenja lokalne komande glBegin i odgovarajućeg "para" glEnd.