Студопедия — ВВЕДЕНИЕ В КОМПЬЮТЕРНУЮ ГРАФИКУ И OpenGL
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

ВВЕДЕНИЕ В КОМПЬЮТЕРНУЮ ГРАФИКУ И OpenGL

ВВЕДЕНИЕ В КОМПЬЮТЕРНУЮ ГРАФИКУ И OpenGL

В настоящее время графика используется в той или иной степени практически во всех компьютерных технологиях (киноиндустрия, производство компьютерных игр, книгоиздательство, управление технологическими процессами, моделирование систем, автоматизированное проектирование и т.д.). При этом под термином «компьютерная графика» понимают как изображения (картинки), созданные компьютером, так и инструментальные средства, используемые для создания таких изображений. Существуют как аппаратные, так и программные средства компьютерной графики. Аппаратные средства включают в себя видеомониторы, видеоадаптеры, принтеры, плоттеры, сканеры, мышь и т.д. Кроме того, сам компьютер в целом можно считать аппаратным средством компьютерной графики. Программные инструментальные средства состоят из стандартного программного обеспечения (операционная система, система программирования и т.д.) и специфических программных инструментов для создания самих изображений, к которым можно отнести, например DirectX и OpenGL. Более широко под компьютерной графикой понимают всю область науки, которая включает в себя как изображения, так и методы и средства их создания.

Широкое применение компьютерной графики привело к тому, что соответствующая дисциплина включена в учебный план подготовки бакалавров по направлениям «Информатика и вычислительная техника» и «Информационные системы». На кафедре автоматизированных систем обработки информации и управления факультета технической кибернетики и информатики КГТУ им. А.Н. Туполева дисциплины «Компьютерная графика» и «Компьютерная геометрия и графика» читаются уже несколько лет. Первоначально эти курсы строились как теоретические без плотной привязки к какому-либо языку программирования графики. Интерес студентов к этим дисциплинам существенно повысился, когда весь материал по названным дисциплинам стал подкрепляться графическими функциями библиотеки OpenGL. Библиотека OpenGL была выбрана в качестве базового программного средства компьютерной графике по той причине, что в ней реализованы практически все вопросы, которые возникают в теории компьютерной графики, а ее функции в максимальной степени приближены к теоретическим представлениям задач компьютерной графики.

Все функции OpenGL можно разделить на пять категорий:

- функции описания примитивов, которые определяют объекты нижнего уровня иерархии (примитивы) графической подсистемы – точки, линии, многоугольники и т.д.;

- функции описания источников света, которые служат для описания положения и параметров источников света, расположенных в трехмерной сцене;

- функции задания атрибутов – цвет, характеристики материала и текстуры, параметры освещения;

- функции визуализации задания положения наблюдателя в виртуальном пространстве и параметры объектива камеры;

- функции геометрических преобразований – поворот, перенос, масштабирование.

- функции для реализации дополнительных операций, таких как использование сплайнов для построения линий и поверхностей, удаление невидимых фрагментов изображений, работа с изображениями на уровне пикселей и т.д.

Хотя для простоты говорят о библиотеке OpenGL, на самом деле это набор библиотек. Все базовые функции хранятся в основной библиотеке GL. Кроме этого, OpenGL включает в себя несколько дополнительных библиотек:

- библиотека утилит GLU, в которой реализованы функции формирования популярных геометрических примитивов (куб, шар, цилиндр, диск), построения сплайнов, дополнительных операций над матрицами и т.п.;

- библиотека функций взаимодействия с пользователем и оконных функций GLUT;

- библиотека GLX, которая функционально аналогична GLUT, но менее популярна.

Взаимодействие OpenGL, прикладной программы и программных средств вычислительной системы показано на рис. 1.1.

 
 

 

 


В OpenGL геометрический объект создается в терминах мировой системы координат (МСК), в которой программист мыслит при создании геометрического объекта. В МСК координатные оси могут носить любой физический смысл, а единица по координатной оси может принимать любое значение – мм, см, м, км, мсек, сек, час, годы и т.д. В МСК программист выделяет прямоугольное окно – мировое окно, содержимое которого и будет отображаться в порт просмотра (viewport) на экране видеомонитора (ВМ). При этом мировое окно в МСК (прямоугольная область (rl)´(tb)) отображается с сохранением подобия в порт просмотра (viewport) размерами w ´ h в экранном окне (window). В отличие от мирового окна размеры порта просмотра w и h всегда задаются как целое число пикселей. На рис. 1.2 показана схема отображения мирового окна в порт просмотра.

Рис. 1.2. Схема отображения мирового окна в порт просмотра (viewport): l – левая граница мирового окна в МСК; r – правая граница мирового окна в МСК; t – верхняя граница мирового окна в МСК; b – нижняя граница мирового окна в МСК; w, h – размеры порта просмотра viewport; width, height – размеры экранного окна window; x, y – положение viewport в системе координат window; a, b – положение window в системе координат screen

Следующие функции реализуют схему, показанную на рис. 1.2:

void gluOrtho2D(GLdouble l, GLdouble r, GLdouble b, GLdouble t) – установка мирового окна;

void glutInitWindowSize(int width, int height) – установка размеров window;

void glutInitWindowPosition(int a, int b) – установка положения window;

void glViewport(GLint x, GLint y, GLsizei w, GLsizei h) – установка viewport.

Точки в OpenGL используются для задания отрезка, ломаной линии или многоугольника. Поэтому точки часто будем называть вершинами.

Пример задания вершины glVertex2i(10, 20). Это один пример из большого количества модификаций задания вершины. Здесь вершина задается двумя параметрами (координатами) целого типа. В общем случае вершина задается функцией:

 

Таблица 1.1

Типы и спецификаторы для их задания в командах OpenGL

Суффикс, задающий тип аргумента Описание типа Имя типа в OpenGL
b 8 – бит, целое GLbyte
s 16 – бит, целое GLshort
i 32 – бит, целое GLint, GLsizei
f 32 – бит, вещественное GLfloat, GLclampf
d 64 – бит, вещественное GLdouble, GLclampd
ub 8 – бит, целое, без знака GLubyte, GLboolean
us 16 – бит, целое, без знака GLushort
ui 32 – бит, целое, без знака GLuint, GLenum, GLbitfield
 

Примеры задания точек:

glVertex2s(2, 3) – точка с координатами x = 2, y = 3, z = 0, w = 1;

glVertex3d(0.0, 0.0, 3.14) – точка с координатами x = 0.0, y = 0.0, z = 3.14, w = 1.0;

glVertex4f(2.3, 1.0, –2.2, 2.0) – точка с координатами x = 2.3, y = 1.0, z = –2.2, w = 2.0;

GLdouble dvect[3] = {5.0, 9.0, 1992.0};

glVertex3dv(dvect) – точка с координатами x = 5.0, y = 9.0, z = 1992.0, w = 1.0.

Последовательность вершин, имеющих самостоятельный смысл, назовем примитивом. Примитивы или группы подобных примитивов задаются между функциями glBegin и glEnd. Пример для 2D (в этом примере * означает, что в это место должен быть подставлен какой-либо из спецификаторов типа):

glBegin(mode);

glVertex2*(x1, y1);

glVertex2*(x2, y2);

................

glVertex2*(xN, yN);

glEnd();

Прототипы функций glBegin и glEnd:

void glBegin(GLenum mode);

void glEnd(void).

Параметр mode может принимать одно из значений, приведенных в табл. 1.2. В ней же описано, как при этом обрабатываются последовательность вершин, определенных между glBegin и glEnd.

Таблица 1.2

Значения и функциональный смысл параметра mode

Значение Смысл
GL_POINTS Обрабатывает каждую вершину как отдельную точку. Вершина n определяет точку n.
GL_LINES Обрабатывает каждую пару вершин как независимый линейный сегмент. Вершины 2 n- 1 и 2 n определяют прямую n. Рисуется N/ 2 прямых.
GL_LINE_STRIP Рисует связанную группу линейных сегментов от первой вершины до последней. Вершины n и n+ 1 определяют прямую n. Рисуется N– 1 прямых.
GL_LINE_LOOP Рисует связанную группу линейных сегментов от первой вершины до последней, а затем назад к первой. Вершины n и n+ 1 определяют прямую n. Последняя прямая определена вершинами 1 и N. Рисуется N прямых.
GL_TRIANGLES Обрабатывает тройку вершин как независимый треугольник. Вершины 3 n– 2, 3 n– 1и 3 n определяют треугольник n. Рисуется N /3 треугольников.
GL_TRIANGLE_STRIP
 

Рисует связанную группу треугольников. Для нечетного значения n вершины n, n+ 1 и n+ 2 определяют треугольник n. Для четного значения n вершины n+ 1, n и n+ 2 определяют треугольник n. Рисуется N– 2 треугольников.
GL_TRIANGLE_FAN Рисует связанную группу треугольников. Вершины 1, n+ 1 и n+ 2 определяют треугольник n. Рисуется N– 2 треугольников.
GL_QUADS Обрабатывает каждую группу из четырех вершин в качестве независимого четырехугольника. Вершины 4 n– 3, 4 n –2, 4 n– 1 и 4 n определяют четырехугольник n. Рисуется N /4 четырехугольников.
GL_QUAD_STRIP Рисует связанную группу четырехугольников. Вершины 2 n– 1, 2 n, 2 n +2 и 2 n+ 1 определяют четырехугольник n. Рисуется N/ 2–1 четырехугольников.
GL_POLYGON Рисует отдельный выпуклый многоугольник. Вершины от 1 до N определяют этот многоугольник.

 

 

Листинг 1.1. Пример программы OpenGL.

#include <GL/glut.h>

void init();

void draw();

void main(int argc, char **argv) //Главная функция

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(640, 480);

glutInitWindowPosition(50, 50);

glutCreateWindow("Myprog");

init();

glutDisplayFunc(draw);

glutMainLoop();

}

void init() //Функция инициализации

{

glClearColor(1.0, 1.0, 0.0, 0.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,2.0,0.0,1.0);

}

void draw() //Функция рисования

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 0.0, 0.0);

glViewport(10, 10, 600, 400);

glBegin(GL_LINE_LOOP);

glVertex2f(0.0, 0.0);

glVertex2f(0.0, 1.0);

glVertex2f(2.0, 1.0);

glVertex2f(2.0, 0.0);

glEnd();

glColor3f(0.0, 1.0, 0.0);

glBegin(GL_LINE_STRIP);

glVertex2f(1.0, 0.5);

glVertex2f(1.1, 0.5);

glVertex2f(1.1, 0.6);

glVertex2f(1.2, 0.6);

glEnd();

glColor3f(0.0, 0.0, 1.0);

glPointSize(4);

glBegin(GL_POINTS);

glVertex2f(0.2, 0.5);

glVertex2f(1.8, 0.5);

glVertex2f(1.0, 0.1);

glVertex2f(1.0, 0.9);

glEnd ();

glFlush();

}

Дадим краткое пояснение функциям, встречающимся в программе.

glutInit(&argc, argv) – инициализация библиотеки GLUT;

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) – устанавливается режим дисплея: использовать один буфер для кадра; цвета представлять как смесь RGB;

glutInitWindowSize(640, 480) – устанавливается размер экранного окна window;

glutInitWindowPosition(50, 50) – устанавливается положение (позиция) экранного окна window.

glutCreateWindow("Myprog") – инициализируется открытие экранного окна window;

glutDisplayFunc(draw) – функция draw() регистрируется как функция обратного вызова для события открытия или обновления экранного окна;

glutMainLoop() – переводит программу в бесконечный цикл ожидания события;

glClearColor(1.0, 1.0, 0.0, 0.0) – назначает то значение буфера цвета экранного окна, которое будет установлено при его сбросе (очистке) функцией glClear(GL_COLOR_BUFFER_BIT). По существу это назначение цвета фона;

glMatrixMode(GL_PROJECTION) – в качестве текущей устанавливается матрица проецирования;

glLoadIdentity() – текущая матрица устанавливается в единицу;

gluOrtho2D(0.0, 2.0, 0.0, 1.0) – устанавливается мировое окно;

glColor3f(1.0, 0.0, 0.0) – устанавливается цвет рисования;

glViewport(10, 10, 600, 400) – устанавливается положение и размеры порта просмотра;

glFlush() – принудительное выполнение накопленных команд OpenGL. Различные реализации OpenGL буферизируют команды в нескольких различных местах. Команда glFlush() освобождает все эти буферы, заставляя все вызванные команды выполниться.

Приводимы далее текст можно принять как простейший шаблон OpenGL программы для 2D, который в дальнейшем может пополняться и усложняться.

Листинг 1.2. Шаблон простейшей программы OpenGL:

#include <GL/glut.h>

void init();

void draw();

void main(int argc, char **argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(640, 480);

glutInitWindowPosition(50, 50);

glutCreateWindow("My program");

init();

glutDisplayFunc(draw);

glutMainLoop();

}

В этом шаблоне функции init() и draw() могут наполняться содержимым в зависимости от решаемой задачи, а функция main() сохраняться.

В функции glVertex*() параметры можно задавать выражением. Между glBegin и glEnd последовательность вершин можно задавать циклом.

Возможны такие конструкции:

 

void draw() { … glBegin(GL_LINE_STRIP); for(…) { x=<выражение1>; y=<выражение2>; glVertex2*(x, y); } glEnd(); … } void draw() { … glBegin(GL_LINE_STRIP); for(…) { glVertex2*(<выражение1>, <выражение2>); } glEnd(); … }  
В window возможно создать несколько (много) портов просмотра. Приводимый далее код покрывает окно window размером 600´480 портами просмотра размером 60´60. Фигура из мирового окна отображается в цикле в каждый из портов просмотра. В результате на экране мозаика.

Листинг 1.3. Пример построения мозаики.

void draw()

{

GLfloat l = –100, r = 100, b = –100, t = 100;

GLint x = 0, y = 0, w = 60, h = 60;

glClear(GL_COLOR_BUFFER_BIT);

gluOrtho2D(l, r, b, t);

for(x = 0; x <= 600; x += w)

for(y = 0; y <= 480; y += h)

{

glViewport(x, y, w, h);

glColor3f(1.0, 0.0, 0.0);

glBegin(GL_LINES);

<Рисуется любая фигура>

glEnd();

}

glFlush();

}

Листинг 1.4. Пример построения графика функции (рис. 1.3)

#define w 0.05

#define t 0.005

#define k 480.0

void draw(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glViewport(0.0, 0.0, 640.0, 480.0);

glColor3f(1.0, 0.0, 0.0);

glBegin(GL_LINE_STRIP);

GLfloat x, y;

for(x = 0; x <= 640; x++)

{

y = k + k * sin(w * x) * exp(-t * x);

glVertex2f(x, y);

}

glEnd();

glFlush();

}

 
 

 


Автоматическое сохранение форматных соотношений мирового окна
в порту просмотра можно добиться следующим образом.

Листинг 1.5. Автоматическое сохранение форматных соотношений.

float R = 5; // – форматное соотношение для мирового окна

void myInit()

{

}

void myReshape(int W, int H)

{

if (R>W/H) glViewport(0, 0, W, W/R);

else glViewport(0, 0, H*R, H);

}

void myDisplay()

{

// Устанавливаем параметры мирового окна с форматным

// соотношением R=5

gluOrtho2D(–5.0, 5.0, –0.5, 1.5);

}

void main(int argc, char* argv[])

{

glutDisplayFunc(myDisplay);

glutReshapeFunc(myReshape);

}

 

Рис. 1.4 показывает, что при всех изменениях размера экранного окна window размеры порта viewport сохраняют форматное соотношение R = 5 такое же, как это установлено для мирового окна. Пропорции фигуры, рисуемой в мировом окне при отображении в viewport, при этом всегда сохраняются.

 




<== предыдущая лекция | следующая лекция ==>
В соответствии с ФЗ Об оценочной деятельности в РФ, основанием для проведения оценки является | В результате изучения модуля 1 ученик должен

Дата добавления: 2015-10-19; просмотров: 541. Нарушение авторских прав; Мы поможем в написании вашей работы!



Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Дезинфекция предметов ухода, инструментов однократного и многократного использования   Дезинфекция изделий медицинского назначения проводится с целью уничтожения патогенных и условно-патогенных микроорганизмов - вирусов (в т...

Машины и механизмы для нарезки овощей В зависимости от назначения овощерезательные машины подразделяются на две группы: машины для нарезки сырых и вареных овощей...

Классификация и основные элементы конструкций теплового оборудования Многообразие способов тепловой обработки продуктов предопределяет широкую номенклатуру тепловых аппаратов...

Шов первичный, первично отсроченный, вторичный (показания) В зависимости от времени и условий наложения выделяют швы: 1) первичные...

Предпосылки, условия и движущие силы психического развития Предпосылки –это факторы. Факторы психического развития –это ведущие детерминанты развития чел. К ним относят: среду...

Анализ микросреды предприятия Анализ микросреды направлен на анализ состояния тех со­ставляющих внешней среды, с которыми предприятие нахо­дится в непосредственном взаимодействии...

Studopedia.info - Студопедия - 2014-2024 год . (0.015 сек.) русская версия | украинская версия