Sunteți pe pagina 1din 6

Universitatea Titu Maiorescu Bucureti

Facultatea de Informatic

PRIMITIVE RASTER N OPENGL

Student:
Drjneanu Gelu-Marian
An II, I.D., Grupa 208

Pe lng faptul c este o interfa pentru aplicaiile de grafic vectorial 3D, OpenGL
este i un foarte bun motor de procesare a imaginilor folosite n aplicaiile de grafic
punctual sau raster.
OpenGL lucreaz cu dou tipuri de primitive raster:
-

Bitmap-uri, acestea folosesc cte un singur bit (0 sau 1) pentru ficare pixel. Funcia
glColor() determin noua culoare a pixelilor, care corespund valorii 1, in timp ce

biii cu valoare 0 sunt transpareni;


Pixelmap-uri, acestea sunt nite blocuri de pixeli care conin informaii complete
de culoare pentru fiecare pixel;

Pixelii se citesc din memoria principal i sunt procesai ntr-un format pe care
OpenGL l poate utiliza, astfel nct se pot face modificri de culoare sau nlocuire de octei.
Bitmap-urile si pixelmap-urile sunt dou primitive neafectate de operaii geometrice care au
loc n fluxul operaiilor anterior rasterizrii.
Un bitmap specific un dreptunghi completat cu 0 i 1, iar fiecare valoare de 1 din
bitmap reprezinta un fragment ale crui valori asociate sunt cele ale poziiei raster curente, in
timp ce pentru valoarea 0 nu se produce nici un fragment. Comanda glBitmap() specific
offset-urile care controleaz plasarea bitmap-ului raportat la poziia raster curent.
O alta funcie importanta este glRasterPos3f(x,y,z) care reprezint poziionarea
primitivelor raster. Prin specificarea poziiei raster sunt poziionate si imaginile, iar dac o
poziie raster se pierde prin decuparea fa de vewiport, nu mai este rasterizat niciun fragment
din primitiva bitmap.
Bitmap-urile se redau cu ajutorul funciei glBitmap(width, height, xorig, zorig, xmove,
bitmap). Funcia red bitmap-ul in culoarea curent, iar dupa redarea primitivei, poziia raster
este actualizat. Bitmap-urile sunt folosite ca o masc pentru actulizarea pixelilor.
n cazul in care originea bitmap-ului este (0,0), atunci bitmap-ul va fi plasat in poziia
raster curent, iar dac difer de valorile (0,0), poziia raster va fi utilizat pentru plasarea
originii bitmap-ului. Coordonatele originii bitmap-ului se stabilesc la colul stanga-jos al
acestuia.

Pentru redarea caracterelor n OpenGL, putem folosi atat fonturi vectoriale ct i


fonturi bitmap. Primele sunt construite din segmente de dreapt i se folosesc epntru
dispozitive vectoriale, precum ploterele, pe cnd fonturile bitmap formeaza fiecare caracter ca
un bitmap. Pentru a fi mai simpl utilizarea fonturilor, n OpenGL se folosesc listele de
display, iar fiecare lista conine doar un apel glBitmap() pentru redarea carcaterului
corespunzator. Fiecare list de display are un identificator unic, un numr, care poate fi ales ca
valoare succesiv pentru caracterele fontului. n acest fel, pentru redarea unui text, trebuie
apelate listele de display care corespund fiecrui caracter din textul respectiv.
Avem dou posibiliti pentru construirea bitmap-urilor corespunzatoare fiecrui
caracter dintr-un font:
-

Declararea tabloului de tip unsigned byte (Glubyte in OpenGL), care conine

caracterele respective;
Construirea bitmap-urilor corespunzatoare fiecrui caracter pe baza fontului
curent din mediul de lucru;

n OpenGL, pentru afiarea unui caracter, se construiete un tablou care conine


caracterul i se ine seama de faptul c pentru limea bitmap-ului trebuie s avem un numr
par de octei.
Exemplu:
/* Programul este un exemplu de utilizare a primitivei bitmap * in OpenGL,
pentru desenarea fonturilor. */
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
87
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
// tabloul care conine litera E, 2 octei X 12 rnduri
GLubyte litera_E[24] = {
0xff, 0xc0, 0xff, 0xc0, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xff, 0xc0, 0xff, 0xc0};
void CALLBACK display(void)
{
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glClearColor (1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 0.0, 0.0);
glRasterPos2i (-2.0, 0.0);
//poziia curent pentru primul bitmap

// dat n uniti logice (sunt 10 uniti pe axa x n intervalul(-5, 5))


glBitmap (10, 12, 0.0, 0.0, 20.0, 0.0, litera_E);
// deplasarea poziiei curente este dat n pixeli - 20 de pixeli pe axa x
glBitmap (10, 12, 0.0, 0.0, 20.0, 0.0, litera_E);
glBitmap (10, 12, 0.0, 0.0, 20.0, 0.0, litera_E);
glBitmap (10, 12, 0.0, 0.0, 20.0, 0.0, litera_E);
glFlush();
}
// proiecie ortogonal
//se mapeaz 10 uniti pe fiecare ax, o unitate are 20 pixeli
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
if (!h) return;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
else
glOrtho (-5.0*(GLfloat)w/(GLfloat)h,
5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGB);
auxInitPosition (0, 0, 200, 200);
auxInitWindow ("Bitmap_E");
auxReshapeFunc (myReshape);
88
auxMainLoop(display);
return(0);
}
Avem mai multe funcii pentru manevrarea listelor de display folosite pentru fonturile
bitmap:
-

Void glNewList (Glunit list, Glenum mode);


Void glEndList(void);
Glunit glGenLists (Glsizei range);
Void glListbase (Gluint base);
Void glCallLists (Glsizei n, Glenum type, const Glvoid *lists);
Void glDeleteLists (Gluint list, Glsizei range);

Un font este un ir de caractere, fiecare avnd asociat un numr de identificare,


folosind-use codul ASCII. Fiecare caracter are si o anumit form grafic, care este coninut
in bitmap-ul asociat caracterului respectiv. Caracterul A are codul ASCII 65 (41H),

caracterul B are codul ASCII 66 (42H), caracterul C avand codul ASCII 67 (43H), etc.
Pentru afiarea irului ABC se vor executa listele de display care au identificatorii 65,66,67,
iar pentru aceasta apelm funcia glCallLists(3, GL_UNSIGNED_BYTE, ABC).
Totui codurile ASCII nu mai reprezint o soluie convenabila, innd cont de
varietatea fonturilor, avnd corupuri diferite, iar soluia ar fi ca pentru fiecare font sa se
adauge un offset, fa de care se stabilesc identificatorii fiecrei liste de display. Pentru c
numrul maxim al carcaterelor nu depete 255, un offset de 1000 este o soluie
convenabil. Pentru stabilirea offset-ului putem folosi comanda glListBase().
Dac dorim s folosim un font cu toate cele 255 de caractere, vom apela
glGenLists(255).
Fiierele de imagini sunt interpretate diferit in OpenGL, care nu
nelege
formatele de imagini, cum ar fi JPEG, PNG, sau GIF-uri. Pentru ca OpenGL
s poat
utiliza informaiile din acest tip de fiiere, acestea trebuie s fie citite i
decodificate pentru a obine informaia de culoare i plecnd de la aceste
informaii OpenGL poate rasteriza valorile culorilor.
Fluxul de procesare al pixelilor

BIBLIOGRAFIE

1. Dave Astle, Kevin Hawkins Beginning OpenGL Game Programming


,
Premier Press, Boston, 2004;
2. Paul Martz,OpenGL(R) Distilled (OpenGL), Addison Wesley
Professional,
2006;
3. Richard S. Wright Jr., Michael R. Sweet ,OpenGL Super Bible, Waite
Group
Press. ,2007;
4. Rodica Baciu , Programarea Aplicaiilor Grafice 3D cu OpenGL,
Editura
Albastr, Cluj-Napoca 2005;
5. The Red Book of OpenGL
6. http://www.opengl.org
7. http://www.sgi.com/software/opengl
8. http://www.cs.utah.edu/~narobins/opengl.html
9. www.mesa3d.org/