Название: Компьютерная графика(Е.Н. Павенко)

Жанр: Информатика

Просмотров: 1428


1. работа с изображением

Существует множество графических форматов – bmp, pcx, gif, jpeg и прочие. OpenGL напрямую не поддерживает ни один из них. В OpenGL нет функций чтения/записи графических файлов, но поддерживается работа с массивами пикселей. Вы загружаете графический файл, используя библиотеки других фирм, в память и работаете с ними средствами OpenGL. В массиве данные о пикселах могут располагаться разными способами: RGB, BGR, RGBA; могут присутствовать не все компоненты; каждый элемент массива может занимать один байт, два, четыре или восемь; выравнивание может быть по байту, слову или двойному слову. В общем, форматов расположения данных о графическом изображении в памяти очень много.

Наиболее часто применяется формат, в котором информация о каждом пикселе хранится в формате RGB и занимает три байта, выравнивание по байту. В Auxiliary Library есть функция auxDIBImageLoad(LPCSTR), которая загружает в память bmp-файл и возвращает указатель на структуру:

 typedef struct _AUX_RGBImageRec {

   GLint sizeX, sizeY;

   unsigned char *data;

} AUX_RGBImageRec;  

В OpenGL имеются функции для вывода массива пикселей на экран(glDrawPixels), копирования(glCopyPixels), масштабирования(gluScaleImage). Здесь мы рассмотрим только glDrawPixels. Все остальные функции работы с изображениями устроены похожим образом. Для того чтобы отобразить графический файл в окне OpenGL, вы должны загрузить его в память, указать выравнивание, установить точку, с которой начинается вывод изображения, и вывести его на экран. Создайте новый проект. Объявите глобальную переменную –

AUX_RGBImageRec *image

Перед вызовом функции glutMainLoop() в функции main вставьте строку:

image = auxDIBImageLoad(«photo.bmp»);

Выравнивание устанавливается вызывом функции glPixelStorei с параметром GL_UNPACK_ALIGNMENT и вторым параметром – целым числом, которое указывает выравнивание.

void glPixelStore{if}(GLenum pname, TYPEparam);

Функция установки способа хранения пикселов для выполнения следующих функций: glDrawPixels(), glReadPixels(), glBitmap(), glPolygonStipple(), glTexImage1D(), glTexImage2D(), glTexSubImage1D(), glTexSubImage2D(), and glGetTexImage().

Изображения выводятся прямо на экран. Поэтому все происходит в двухмерных координатах. Позиция, с которой начинается вывод изображения, указывается при помощи функции glRasterPos2d(x,y).

void glRasterPos{234}{sifd}(TYPE x, TYPE y, TYPE z, TYPE w);

void glRasterPos{234}{sifd}v(TYPE *coords);

Функция установки текущей позиции растра: x, y, z, w – однородные координаты, определяющие позицию растра. Если используется функция glRasterPos2*(), то z подразумевается равным 0, а w равным 1.

Также Вы можете установить размер пикселя, вызвав функцию glPixelZoom. Первый параметр этой функции – ширина, второй – высота пикселя. Вызов этой функции с аргументами (1,1), что соответствует нормальному пикселю. Замените (1,1) на (3,2) и Вы увидите, как картинка растянется в три раза по горизонтали и в два раза по вертикали. Это случилось потому, что теперь каждый пиксель изображения соответствует прямоугольнику 3х2 в окне.

void glPixelZoom(GLfloat zoomx, GLfloat zoomy);

Функция устанавливает фактор увеличения/уменьшения при выполнении операции записи пикселя в буфер кадра (glDrawPixels() или glCopyPixels()) по x и y координатам. По умолчанию  zoomx и zoomy равны  1.0. Если оба значения равны 2, то каждый пиксель исходного изображения выводится в виде 4 пикселей в буфере кадра. Отрицательное значение фактора выполняет зеркальное отображение изображения относительно текущей позиции растра.

И, наконец, вывод осуществляет функция glDrawPixels. Первые два параметра – это ширина и высота. Далее, вы указываете формат, в котором хранится информация в памяти, и тип элементов массива. Последним указывается массив данных.

void glDrawPixels(GLsizei width, GLsizei height, GLenum format,

GLenum type, const GLvoid *pixels);

Функция выводит изображение прямоугольного массива пикселей размером width на height. Прямоугольник выводится, начиная с левого нижнего угла изображения в текущей позиции растра, format и type параметры могут принимать одно из значений, приведенных в Руководстве программиста по OpenGL. Массив pixels содержит данные о пикселях, которые должны быть выведены.

В функцию display вставьте следующий код:

glRasterPos2d(-4.5,-3);                    // нижний левый угол

glPixelZoom(1,1);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);         // выравнивание

glDrawPixels(image->sizeX, image->sizeY, // ширина и высота

                GL_RGB, GL_UNSIGNED_BYTE,      // формат и тип

                          image->data);     // сами данные

Также в OpenGL имеется функция glBitmap для отображения битовых массивов. Битовый массив – это последовательность байт, которые кодируют картинку из двух цветов.