компютърна визуализация
OpenGL позволява визуализация на растерни графики примитиви са два типа: растерни (битов масив) и изображение (растерни изображения). Също така, OpenGL предвижда специален тип растерни обекти - текстура. Bitmaps и растерни изображения се показват в изходен порт равнина. Texture е специално оформена и се протегна в полигони.
растерни изображения
Bitmap е правоъгълен масив от стойности 0 и 1. Тези пиксели, които имат стойност 1, за да се покаже текущия цвят и пиксели със стойност 0 няма да се отрази на съществуващото изображение. Bitmap се използва за показване на текстови знаци и различни маркери на графиките, разпръсна класациите и т.н.
За да се покаже набор от битове се използват две функции. Функционални glRasterPos * () се използват за определяне на позицията на долния ляв ъгъл на дисплея на растерни и glBitmap () - директно едно да се направи растерна графика.
нищожен glBitmap (GLsizei ширина, височина GLsizei, GLfloat xbo, GLfloat YBO, GLfloat XBi, GLfloat YBI, Конст GLubyte * растерна графика);
Произходът се поставя в текущата позиция растер. Ако в началото е извън изходен порт растерна графика не се показва. Първите две аргументи определят ширината и височината в пиксели. Ширината може да бъде всеки, но по време на съхранение трябва да бъде допълнен до стойност, която е кратна на 8. YBO аргументите xbo и се определя произхода на масива на растер, което е приведено в съответствие с текущото състояние на растера. Argumentv YBI XBi и определяне на размера на пристрастия текущата позиция растер след растерна графика на дисплея. Това е много полезно при показване на текстови знаци, когато в началото на оттеглянето на следващия знак може да се постави веднага след предишната. Последният аргумент е препратка към растерна графика.
При работа с растерни изображения, че е важно да се информират библиотеката за това как тя се съхранява в паметта. Това може да стане с помощта на функцията glPixelStore. който взема като първи аргумент идентифицира персонализираната постоянен параметър, и втори аргумент определя стойността му.
При работа с растерни изображения изискват следните настройки:
- Байт поръчка (GL_UNPACK_SWAP_BYTES) подразбиране FALSE. Това означава, че се изисква байта в правилния ред и разопаковане.
- режим Подравняване (GL_UNPACK_ALIGNMENT) могат да се стойностите 1, 2, 4, 8, и има стойност по подразбиране 4. В много платформи операции се извършват с масиви много по-ефективно, ако те са подредени по определен начин памет. Например за 32-битови системи, които да работят с данните най-ефективно, което е кратно на размера на 32-битова. Ето защо, когато се работи с данни често се опитват да приведат данните към 32-битова, 0 съчетаването им.
// Mark напречно
GLubyte bitmap_mark [] =
0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10
>;
// имоти разопаковане
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
// цветен етикет
glColor3d (1, 0, 0);
// Позиция изход растер
glRasterPos2d (25., 25.);
// Показване на растерна графика
glBitmap (7,7,4,3,0,0, bitmap_mark);
растерни изображения
Растер на изображението, за разлика от повода, съдържа информация за цвета за всеки пиксел. Работа с изображения е много подобен на работа с растерни изображения. Растерни изображения могат да бъдат генерирани в програмата чрез изчисления, получени от даден файл в графичен формат (OpenGL функции, като не предоставя), копирани от всяка област на екрана с помощта на OpenGL.
OpenGL predostayalyaet три основни функции за работа с изображения rastrovmi:
Функция за показване на растерна графика има следния прототип:
невалидни glDrawPixels (GLsizei ширина, височина GLsizei, GLenum формат, тип GLenum, Конст GLvoid * пиксела);
ширина и височина се определят от размера на дисплея на растерна графика масив. В долния ляв ъгъл на масива ще се намира в текущата позиция растер.
Стойността на променливата формат
Последният аргумент на тази функция е указател към нула елемент на масива на дисплея.
Подобен прототип има функция за съхранение на правоъгълна област от екрана в паметта:
невалидни glReadPixels (блясък х, у блясък, GLsizei ширина, GLsizei височина, GLenum формат, тип GLenum, GLvoid * пиксела);
да копирате пиксел блок функция има следния прототип:
При работа с растерни изображения, трябва да се помни, че ако текущата позиция на растера ще бъде извън изходен порт, а след това, ако не и да се вземат специални мерки, няма да се показва в растерното изображение. Но винаги само част от изображението на растер. Трябва да използвате glPixelStore отново. което ще позволи да се уточни правилната OpenGL библиотеката, коя част на растерна графика, за да бъдат показани в изходен порт. Константи GL_UNPACK_SKIP_ROWS, GL_UNPACK_SKIP_PIXELS GL_UNPACK_ROW_LENGTH и определя броя на линиите и пиксели, които трябва да се отстраняват, и дължината на линия съответно.
glPixelStorei (GL_UNPACK_ROW_LENGTH, 100); // дължина низ
glPixelStorei (GL_UNPACK_SKIP_ROWS, 10); // колко реда да пропуснете?
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 10); // колко пиксела за прескачане на всеки ред?
В процеса на превръщане на растерни изображение на масива в буфера за кадри може да се извърши на данните и други операции. Например, след извършване на изчисленията е от порядъка на яркост на пиксела в диапазона от -10.0 до 10.0 вместо 0.0 до 1.0, както се изисква от glDrawPixels функцията. Така че, преди да се обадите на функциите, необходими за конвертиране glDrawPixels гама от яркост стойностите, като използвате glPixelTransfer () функция, както следва:
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);
В допълнение, при показване на изображението в пиксели растер може да се преоразмерява. Функция за мащабиране на пиксела има следния прототип:
анулира glPixelZoom (GLfloat zoomx, GLfloat zoomy);
Стойности по подразбиране zoomx и zoomy равен на 1, а това означава, че размерът на един пиксел на изображението на растерни е един пиксел на екрана. Ако zoomx и zoomy по-големи от 1, размерът на един пиксел от изображението, ще бъде по-голям от пиксел на екрана в предварително определен брой пъти. Ако zoomx и zoomy mentshe 1, размерът на един пиксел от изображението, ще бъде по-малък от пиксел на екрана с предварително определен брой пъти. zoomx zoomy и може да се настрои негативно. Това ще доведе до революция на растерна графика.
конст Int checkImageWidth = 256;
конст Int checkImageHeight = 256;
GLubyte checkImage [checkImageHeight] [checkImageWidth];
статични INT x_pos, y_pos, x_0, y_0;
статично булев флаг;
нищожен Init (свободен)
<
glClearColor (0.0, 0.0, 0.0, 0.0);
// Получаване растер с запълване градиент
за (INT I = 0; и
>
>
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
невалидни преработи (междинно w, Int з)
glViewport (0, 0, (GLsizei) w, (GLsizei) з);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D (-w / 2 w / 2 -h / 2 ч / 2 ....);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
>
анулира Mouse (бутон вътр, вътр състояние, вътр х, вътр Y)
ако (бутон == GLUT_LEFT_BUTTON)
ако (състояние == GLUT_DOWN)
флаг = вярно;
x_0 = х;
y_0 = Y;
>
още
флаг = неверни;
>
>
>
нищожен Draw (свободен)
glClear (GL_COLOR_BUFFER_BIT);
// Не забравяйте атрибут
glPushAttrib (GL_CURRENT_BIT);
// изчисли положението на изхода растерното изображение предварително старт
двойни X, Y, Z;
// видове матрица
GLdouble modelMatrix [16];
glGetDoublev (GL_MODELVIEW_MATRIX modelMatrix.);
// проекция матрица
GLdouble projMatrix [16];
glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
// изходна площ Координати
Блясък Прозорецът [4];
glGetIntegerv (GL_VIEWPORT, Прозорецът);
gluUnProject (Прозорецът [0] 1, Прозорецът [1] 1, 0, modelMatrix, projMatrix, Прозорецът, х, у, щ);
Int DX, ди;
DX = Dy = 0;
Int XP, YP;
XP = x_pos;
YP = y_pos;
// Задаване на началната позиция на изход растерна графика
glRasterPos2f (XP, YP);
// Определете изхода атрибути пиксела
glPixelStorei (GL_UNPACK_ROW_LENGTH, checkImageWidth); // дължина низ
glPixelStorei (GL_UNPACK_SKIP_ROWS, Dy); // колко реда да пропуснете?
glPixelStorei (GL_UNPACK_SKIP_PIXELS, DX); // колко пиксела за прескачане на всеки ред?
// Показване на пикселите на екрана
glDrawPixels (checkImageWidth-DX, checkImageHeight-ди, GL_LUMINANCE, GL_UNSIGNED_BYTE, checkImage);
// възстановите стойностите по подразбиране приписват О
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
// Връща атрибут
glPopAttrib ();
Int основна (междинно argc, овъгляване ** argv)
glutInit (argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (512, 512);
glutInitWindowPosition (100, 100);
glutCreateWindow ( "растерни тест");
Init ();
glutDisplayFunc (Draw);
glutReshapeFunc (реформиране);
glutMotionFunc (Предложение);
glutMouseFunc (мишка);
glutMainLoop ();
връщане 0;
>