vizualizare calculator

OpenGL permite vizualizarea grafica raster primitivelor sunt de două tipuri: bitmap (matrice de biți) și o imagine (imagine raster). De asemenea, OpenGL oferă un tip special de obiecte raster - textura. Bitmapuri și imagini bitmap sunt afișate în planul port de ieșire. Textura este formată în mod special și întinsă în poligoane.

bitmapuri

Bitmap este o matrice dreptunghiulară de valori 0 și 1. Aceste pixeli, care au o valoare de 1 care urmează să fie afișată culoarea curentă, și pixelii cu valoarea 0 nu va afecta imaginea existentă. Bitmap folosit pentru a afișa caracterele de text și diverse marcaje pe grafice, diagrame scatter, etc.

Pentru a afișa o matrice de biți sunt utilizate două funcții. glRasterPos Function * () este folosit pentru a seta poziția colțul din stânga jos al ecranului raster și glBitmap () - direct unul pentru a desena bitmap.

void glBitmap (latime GLsizei, inaltime GLsizei, GLfloat XBO, GLfloat YBO, GLfloat XBi, GLfloat ybi, GLubyte const * bitmap);

Originea este plasat în poziția raster curentă. Dacă la început se află în afara portului de ieșire, bitmap nu este afișată. Primele două argumente specifica lățimea și înălțimea în pixeli. Lățimea poate fi orice, dar în timpul depozitării trebuie să fie completată cu o valoare a unui multiplu de 8. Argumentele XBO YBO și determinarea originii matrice raster, care este aliniat cu poziția curentă a rastrului. Argumentv XBi ybi și de a determina cantitatea de părtinire poziția raster curentă după bitmap de afișare. Acest lucru este foarte util atunci când sunt afișate caractere de text, atunci când începerea retragerii caracterul următor poate fi plasat imediat după cea anterioară. Ultimul argument este o referință la un bitmap.

Atunci când se lucrează cu bitmapuri este important să se informeze cu privire la modul în care biblioteca este stocat în memorie. Acest lucru se poate face folosind funcția glPixelStore. care are ca prim argument specifică parametrului personalizat constant, și un al doilea argument specifică valoarea sa.

Atunci când se lucrează cu următoarele necesită bitmapuri setări:

  1. Pentru Byte (GL_UNPACK_SWAP_BYTES) implicit FALSE. Acest lucru înseamnă că este necesară octetii în ordinea corectă și despachetarea.
  2. Modul de aliniere (GL_UNPACK_ALIGNMENT) poate lua valorile 1, 2, 4, 8, și are o valoare implicită 4. În multe platforme operațiunile sunt efectuate cu matrice mult mai eficient în cazul în care acestea sunt aliniate într-un anumit fel de memorie. De exemplu, pentru sistemele pe 32 de biți pentru a lucra cu datele mai eficient, care este un multiplu de dimensiunea de 32 de biți. Prin urmare, atunci când se lucrează cu date încearcă adesea să se alinieze datele la 32 de biți, 0 completarea acestora.

// Mark o centrare
GLubyte bitmap_mark [] =
0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10
>;

// Proprietăți dezambalare
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

// culoarea etichetei
glColor3d (1, 0., 0.);

// Poziție ieșire raster
glRasterPos2d (25., 25.);

// Afișați un bitmap
glBitmap (7,7,4,3,0,0, bitmap_mark);

bitmapuri

imagine Raster, spre deosebire de biți, conține informația de culoare pentru fiecare pixel. Lucrul cu imagini este foarte similar cu lucrul cu bitmap-uri. O imagine raster poate fi generată în program prin calcule derivate dintr-un fișier într-un format grafic (OpenGL caracteristici, cum nu oferă), copiate din orice zonă a ecranului prin intermediul OpenGL.

OpenGL predostayalyaet trei funcții de bază pentru lucrul cu imagini rastrovmi:

Funcția pentru a afișa bitmap are următorul prototip:

glDrawPixels nule (lățime GLsizei, înălțime GLsizei, format GLenum, tip GLenum, const GLvoid pixeli *);

lățimea și înălțimea defini dimensiunea matrice de afișare bitmap. Colțul din stânga jos al matrice va fi localizat la poziția raster curentă.

Valoarea formatului variabilei

Ultimul argument pentru această funcție este un pointer la elementul zero al matrice de afișare.

Un prototip are o funcție similară pentru stocarea zonei dreptunghiulare a ecranului în memorie:

glReadPixels void (licărire x, y licărire, cu o lățime GLsizei, înălțime GLsizei, format GLenum, tip GLenum, pixeli * GLvoid);

pentru a copia funcția de bloc de pixeli are următorul prototip:

Atunci când se lucrează cu imagini bitmap, trebuie amintit că în cazul în care poziția curentă a rastrului va fi în afara portului de ieșire, apoi, dacă nu să ia măsuri speciale, imaginea raster nu va fi afișată. Dar întotdeauna doar o parte a imaginii raster. Trebuie să utilizați din nou glPixelStore. care va permite să specifice biblioteca OpenGL corectă, care o parte din bitmap care urmează să fie afișat în portul de ieșire. Constante GL_UNPACK_SKIP_ROWS, GL_UNPACK_SKIP_PIXELS GL_UNPACK_ROW_LENGTH și determină numărul de linii și de pixeli, care urmează să fie omisă, iar lungimea liniei, respectiv.

glPixelStorei (GL_UNPACK_ROW_LENGTH, 100); // lungime string
glPixelStorei (GL_UNPACK_SKIP_ROWS, 10); // câte rânduri pentru a sări peste?
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 10); // cât de mulți pixeli pentru a sări în fiecare rând?

În procesul de conversie a imaginilor raster de matrice în buffer-cadru poate fi realizată pe baza datelor și a altor operațiuni. De exemplu, după efectuarea calculelor este intervalul de luminozitate a pixelilor în intervalul -10.0-10.0 în loc de 0.0 la 1.0, așa cum este cerut de glDrawPixels funcției. Deci, înainte de a apela funcțiile necesare pentru a converti gama glDrawPixels de valori de luminozitate folosind glPixelTransfer () funcția, după cum urmează:

glPixelTransferf (GL_RED_BIAS, -10.f);
glPixelTransferf (GL_GREEN_BIAS, -10.f);
glPixelTransferf (GL_BLUE_BIAS, -10.f);
glPixelTransferf (GL_RED_SCALE, 0,05);
glPixelTransferf (GL_GREEN_SCALE, 0,05);
glPixelTransferf (GL_BLUE_SCALE, 0,05);

În plus, atunci când afișează imaginea de pixeli raster pot fi redimensionate. Funcția pentru scalarea pixel are următorul prototip:

nule glPixelZoom (GLfloat zoomx, GLfloat zoomy);

Valorile implicite zoomx și zoomy egal cu 1, iar acest lucru înseamnă că dimensiunea un pixel al imaginii raster este un pixel de pe ecran. Dacă zoomx și zoomy mai mare decât 1, dimensiunea de un pixel al imaginii va fi mai mare decât pixelul ecranului în numărul predeterminat de ori. Dacă zoomx și zoomy mentshe 1, dimensiunea de un pixel al imaginii va fi mai mică decât pixelul ecran la un număr predeterminat de ori. zoomx zoomy și poate fi setat negativ. Acest lucru va duce la un bitmap revoluție.

const int checkImageWidth = 256;
const int checkImageHeight = 256;
GLubyte checkImage [checkImageHeight] [checkImageWidth];

x_pos int statice, y_pos, x_0, y_0;
pavilion bool static;

void Init (void)
<
glClearColor (0.0, 0.0, 0.0, 0.0);

// raster Formarea cu un gradient de umplere
pentru (int i = 0; i pentru (int j = 0; j checkImage [i] [j] = (i + j) / 2.;
>
>
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

void Modelarea (int w, int h)
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D (-w / 2 w / 2 -h / 2 h / 2 ....);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
>

anula mouse-ul (int, stare int, int x, int y)
dacă (butonul == GLUT_LEFT_BUTTON)
în cazul în care (stat == GLUT_DOWN)
pavilion = true;
x_0 = x;
y_0 = y;
>
altfel
flag = false;
>
>
>

void Draw (void)
glClear (GL_COLOR_BUFFER_BIT);

// Amintiți-vă atribut
glPushAttrib (GL_CURRENT_BIT);

// Se calculează poziția de pre-start ieșire bitmap
x duble, y, z;

// matrice Specii
GLdouble modelMatrix [16];
glGetDoublev (GL_MODELVIEW_MATRIX modelMatrix.);
// matrice de proiecție
GLdouble projMatrix [16];
glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
// Coordonate zona de ieșire
Licărire viewport [4];
glGetIntegerv (GL_VIEWPORT, viewport);

gluUnProject (fereastra [0] +1, viewport [1] +1, 0, modelMatrix, projMatrix, viewport, x, y, z);

int dx, dy;
dx = dy = 0;

int xp, yp;
xp = x_pos;
= y_pos; YP

// Setați poziția de start a bitmap de ieșire
glRasterPos2f (xp, yp);
// Setați ieșirea atributele pixeli
glPixelStorei (GL_UNPACK_ROW_LENGTH, checkImageWidth); // lungime string
glPixelStorei (GL_UNPACK_SKIP_ROWS, dy); // câte rânduri pentru a sări peste?
glPixelStorei (GL_UNPACK_SKIP_PIXELS, dx); // cât de mulți pixeli pentru a sări în fiecare rând?
// Afișează pixelii de pe ecran
glDrawPixels (checkImageWidth-dx, checkImageHeight-dy, GL_LUMINANCE, GL_UNSIGNED_BYTE, checkImage);

// returneaza valorile implicite atributului O
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);

// returneaza atributul
glPopAttrib ();

int main (int argc, char ** argv)
glutInit (argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (512, 512);
glutInitWindowPosition (100, 100);
glutCreateWindow ( "Raster Test");
Init ();
glutDisplayFunc (Egal);
glutReshapeFunc (Modelarea);
glutMotionFunc (Motion);
glutMouseFunc (Mouse);
glutMainLoop ();
return 0;
>