Opengl функции. Иллюстрированный самоучитель по Visual Studio.NET. Э. Ангел - Интерактивная компьютерная графика - купить

Opengl функции. Иллюстрированный самоучитель по Visual Studio.NET. Э. Ангел - Интерактивная компьютерная графика - купить

19.03.2019

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

Например, тип GLint соответствует стандартному int:

typedef int GLint;

аналогично:

typedef unsigned int GLuint; typedef float GLfloat; typedef double GLdouble; typedef void GLvoid;

Эти типы объявлены в GL.h. Имена всех этих типов начинаются с GL. Рекомендуется с функциями OpenGL использовать эти типы.

Функции OpenGL

Многие функции OpenGL - вариации друг друга, различаясь только типами данных и их аргументами. Конечно же, этого не было бы, если бы OpenGL изначально был сделан для языков, поддерживающих перегрузку функций, таких как C++.

Чтобы не было путаницы в именах функций, ввели несколько договорённостей (правил), по которым строится имя функции OpenGL.

Во-первых, все имена функций OpenGL начинаются с приставки gl. Например,

GlBegin();
glEng();

Во-вторых, если набор функций имеют одинаковый смысл и различаются только количеством и типами параметров, то имя таких функций записывают в виде:

GlОбщая_часть_имени_функции[n],

где n - количество параметров, type - тип параметров.

Например:

glVertex2d(1 .0 , 0 .5 ) ; // 2d означает: 2 параметра типа GLdouble glVertex3f(1 .0 f, 0 .5 f, 0 .0 f) ; // 3f означает: 3 параметра типа GLfloat glColor3ub(127 , 0 , 255 ) ; // 3ub означает: 3 параметра типа GLubyte

Ниже в таблице приведены значения сокращений для type:

i GLint
ui GLuint
f GLfloat
d GLdouble
s GLshort
us GLushort
b GLbyte
ub GLubyte
v массив

В различных документациях по OpenGL, чтобы не перечислять все функции одного семейства, принято записывать только имя общей части всех функций семейства и в конце ставить звёздочку "*". Например, функции, задающие координаты вершин записывают так:

GlVertex*

Дополнительные сведения об OpenGL

Команды OpenGL интерпретируются моделью client/server.

Код приложения (client) выдаёт команды, которые интерпретируются и обрабатываются.

OpenGL (server) может оперировать или не оперировать на компьютере как клиент. Сервер может содержать несколько контекстов OpenGL. Клиент может подключаться к любому из этих контекстов.

Оконная система выделяет буфер кадра (frame buffer). Она определяет, какая часть буфера кадра модели может быть доступна в данное время для OpenGL, и уведомляет OpenGL, как эти порции структурированы. Поэтому OpenGL не имеет команд, конфигурирующих буфер кадра или инициализирующие OpenGL.

Дополнительные библиотеки

Помимо функций OpenGL и функций, предоставляемых операционной системой, часто для работы с OpenGL используют дополнительные библиотеки.

Библиотеки не вносят каких-либо новых возможностей в сам OpenGL. Их назначение, это упрощение кода. Библиотеки избавляют от написания программистами часто встречаемых функций.

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

Наиболее известные библиотеки:

OpenGL Utility Library (glu)

Утилитная библиотека glu предоставляет функции, работающие с матрицами, с координатными системами, с кривыми и поверхностями NURBS и т.п.

Эта библиотека поставляется почти со всеми реализациями OpenGL, в частности с MS Visual C++.

Для того чтобы её использовать, нужно в исходном файле включить заголовочный файл glu.h:

#include

и включить для линковки статическую библиотеку glu32.lib в ваш проект.

Имена функций в этой утилитной библиотеки начинаются на glu, например,

GluPerspective();

OpenGL Auxiliary Library (glaux)

Вспомогательная библиотека glaux содержит функции, создающие простые трёхмерные геометрические объекты, такие как сфера, куб, параллелепипед, цилиндр, конус и пр., функции, загружающие изображения из файлов, функции, работающие с окном вывода графики и т.д.

Эта библиотека используется реже, и описание функций не включено в MSDN. Файлы для работы с библиотекой также поставляются с MS Visual C++.

Для того чтобы её использовать, нужно в исходном файле включить заголовочный файл glaux.h:

#include

и включить для линковки статическую библиотеку glaux.lib в ваш проект.

Имена функций в этой утилитной библиотеки начинаются на aux, например,

AuxSolidCube();

OpenGL Utility Toolkit (GLUT)

Независимый от оконной операционной системы инструмент для создания OpenGL программ. Предоставляет простую реализацию оконного интерфейса. Эта библиотека освобождает от инициализационных подготовок приложения, может генерировать геометрические объекты и пр.

Для того чтобы её использовать, нужно в исходном файле включить заголовочный файл glut.h и включить для линковки статическую библиотеку glut32.lib в ваш проект.

Кроме того, у вас должна быть динамически подключаемая библиотека glut32.dll.

Лабораторная работа № 2.

1. Введение

OpenGL – Open Graphics Library, открытая графическая библиотека. Термин "открытый" – означает независимый от производителей. Имеется спецификация (стандарт) на OpenGL, где все четко задокументировано и описано. Библиотеку OpenGL может производить кто угодно. Главное, чтобы библиотека удовлетворяла спецификации OpenGL и ряду тестов. Как следствие, в библиотеке нет никаких темных мест, секретов, недокументированных возможностей и т. п, те кто программировал под MS Windows или MS DOS понимают о чем я говорю. Библиотеку выпускают такие корпорации, как Microsoft, Silicon Graphics, а также просто группы программистов. Одним из таких примеров служит реализация Mesa. Эту библиотеку написали целый ряд программистов, главным автором является Brian Paul. Библиотека Mesa распространяется в исходных текстах на языке Си и собирается почти для любой операционной системы. Стандарт OpenGL развивается с 1992 года. Он разрабатывается фирмой Silicon Graphics. С тех пор библиотека завоевала огромную популярность и была интегрирована с множеством языков и систем разработки приложений. Вы можете писать программу с использованием OpenGL на Си, С++, Pascal, Java и многих других языках. Основное предназначение OpenGL программирование трехмерной графики.

Библиотека OpenGL представляет собой интерфейс программирования трехмерной графики. Единицей информации является вершина, из них состоят более сложные объекты. Программист создает вершины, указывает, как их соединять (линиями или многоугольниками), устанавливает координаты и параметры камеры и ламп, а библиотека OpenGL берет на себя работу создания изображения на экране. OpenGL идеально подходит для программистов, которым необходимо создать небольшую трехмерную сцену и не задумываться о деталях реализации алгоритмов трехмерной графики. Для профессионалов, занимающихся программированием трехмерной графики, библиотека тоже будет полезной, т. к. она представляет основные механизмы и выполняет определенную автоматизацию. Используя OpenGL можно с легкостью создать трехмерные поверхности, наложить на них текстуры, осветить источниками света, сделать эффект тумана, прозрачности, смешивания цветов, а также наложить трафарет, передвигать объекты сцены, лампы и камеры по заданным траекториям, сделав тем самым анимацию. OpenGL непосредственно не поддерживает работу с устройствами ввода, такими как мышь или клавиатура, т. к. эта библиотека является платформенно независимой. Но можно задействовать функции конкретной операционной системы, под которую вы пишите свою программу или воспользоваться надстройками над OpenGL, такими как библиотеки GLUT или GLAUX.

2. Первая программа

Самым простым объектом, с помощью которого можно увидеть всю мощь OpenGL, является сфера. Можно попытаться ее изобразить. Для этого надо создать новый проект в VisualC++, выполнив следующие действия:

— запустить Visual C++;

— выполнить команду File | New…;

— в открывшемся диалоговом окне выбрать тип проекта Win32 Application, в поле Project Name указать имя проекта, а в поле Location – папку в которой будет находиться проект;

— нажать кнопку OK. Затем, ничего не изменяя, – кнопку Finish и еще раз OK;

— скопировать в папку проекта два файла Sample. cpp и Sample. h (выдаются преподавателем);

— подключить эти два файла к проекту выполнив команду Project | Add To Project | Files…;

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

GlColor3d(1,0,0);

AuxSolidSphere(1);

— создать exe-модуль (F7).

Поясним назначение вставленных двух функций. Функция glColor3d устанавливает текущий цвет, которым будут рисоваться фигуры. Тут нужно пояснить, как устанавливается цвет и общую философию в названии функций OpenGL. Цвет устанавливается четырьмя параметрами: красный, синий, зеленый и прозрачность. Эти параметры варьируются в диапазоне от нуля до единицы. Четвертый параметр нам пока не нужен, поэтому мы вызвали glColor с тремя параметрами. В этом случае, значение четвертого параметра, прозрачности, по умолчанию считается равным единице, т. е. абсолютно непрозрачным, ноль – будет абсолютно прозрачным. Применяется следующий синтаксис вызова функций – FuncionName[тип параметров].

Доступны следующие типы:

B – GLbyte байт;

S – GLshort короткое целое;

I – GLint целое;

F – GLfloat дробное;

D – GLdouble дробное с двойной точностью;

Ub – GLubyte беззнаковый байт;

Us – GLushort беззнаковое короткое целое;

Ui – GLuint беззнаковое целое;

V – массив из n параметров указанного типа;

В нашем случае – glColor3d – означает, что в функцию передается три параметра типа GLdouble. Также можно было вызвать glColor3i, т. е. три параметра типа GLint. Если тип параметров короткое целое, целое, байт или длинное, то компонента цвета приводится к диапазону . Приведение к этому диапазону осуществляется по следующим правилам. В случае беззнакового типа возможное наибольшее значение приводится к единице, ноль к нулю. В случае знакового максимальное значение приводится к единице или к минус единице, а минус единица будет приведена к единице. На практике обычно пользуются одним из трех случаев, рассмотренных в качестве примера ниже. Например, для беззнакового байта приведение будет осуществлено по следующей формуле: значение_переменной_хранимой_в_байте/255, т. к. 255 максимальное число, хранимое в одном байте. Функция glColor3dv означает, что в качестве параметров передается массив из трех элементов типа GLdouble. Например:

Double array = {0.5, 0.75, 0.3};

GlColor3dv(array);

GlColor3ub(200,100,0); // приводится к

// 200/256, 100/256, 0,256

GlColor3d(0.25,0.25,0); // темно-желтый

GlColot3ub(0,100,0); // темно-зеленый

GlColor3ub(0,0,255); // синий

3. Простые объекты. Общие положения

Точки, линии, треугольники, четырехугольники, многоугольники –простые объекты, из которых состоят любые сложные фигуры. OpenGL непосредственно не поддерживает функций для создания таких сложных объектов как сфера, цилиндр тор и др., т. е. таких функций нет в opengl32.dll. Эти функции есть в библиотеки утилит glu32.dll, и устроены они следующим образом. Для того чтобы нарисовать сферу функция auxSolidSphere использует функции из библиотеки glu32.dll, а те в свою очередь, используют базовую библиотеку opengl32.dll и из линий или многоугольников строят сферу. Примитивы создаются следующим образом:

GlBegin(mode); // указываем, что будем рисовать

glVertex(…); // первая вершина

… // тут остальные вершины

glVertex(…); // последняя

//вершина

GlEnd(); // закончили рисовать примитив

Сначала необходимо указать начало рисования – glBegin с соответствующим параметром.

Возможные значения mode перечислены ниже в таблице. Далее указываются вершины, определяющие объекты указанного типа. Обычно вершину задают одним из четырех способов.

GlVertex2d(x, y); // две переменных типа double

GlVertex3d(x, y,z); // три переменных типа double

GlVertex2dv(array); // массив из двух переменных типа

GlVertex3d(array); // массив из трех переменных типа

Void glEnd(void);

Указывает на конец рисования объектов типа, указанного в glBegin. Далее подробно разберем создание всех примитивов.

Таблица 1.

Возможные значения mode

Значение

Описание

Каждый вызов glVertex задает отдельную точку.

Каждая пара вершин задает отрезок.

Рисуется ломанная.

Рисуется ломанная, причем ее последняя точка соединяется с первой.

Каждые три вызова glVertex задают треугольник.

GL_TRIANGLE_STRIP

Рисуются треугольники с общей стороной.

То же самое, но по другому правилу соединяются вершины.

Каждые четыре вызова glVertex задают четырехугольник.

Четырехугольники с общей стороной.

Многоугольник.

3.1. Точки

Можно нарисовать сколько угодно точек, вызывая glVertex3d, и тем самым, устанавливая новую точку. При создании точек можно изменять следующие параметры. Можно вызывать glColor3d внутри glBegin/glEnd. Размер точки можно устанавливать с помощью функции:

Void glPointSize(GLfloat size);

Режим сглаживания можно устанавливать вызовом функции

GlEnable(GL_POINT_SMOOTH);

Отключается соответственно вызовом glDisable(GL_POINT_SMOOTH). Последние функции – glPointSize и glEnable/glDisable надо вызывать вне glBegin/glEnd, иначе они будут проигнорированы. Функции glEnable/glDisable включают/выключают множество опций, но следует учитывать, что некоторые опции влекут за собой большие вычисления и, следовательно, изрядно затормаживают приложение, поэтому без надобности не стоит их включать.

// рисуем точки

GlBegin(GL_POINTS);

glColor3d(1,0,0);

glVertex3d(-4.5,4,0); // первая точка

glColor3d(0,1,0);

glVertex3d(-4,4,0); // вторая точка

glColor3d(0,0,1);

glVertex3d(-3.5,4,0); // третья

GlBegin(GL_POINTS);

glColor3d(1,0,0);

glVertex3d(-2,4,0); // первая точка

glColor3d(0,1,0);

glVertex3d(-1,4,0); // вторая точка

glColor3d(0,0,1);

glVertex3d(0,4,0); // третья

GlPointSize(10);

GlEnable(GL_POINT_SMOOTH);

GlBegin(GL_POINTS);

glColor3d(1,0,0);

glVertex3d(2,4,0); // первая точка

glColor3d(0,1,0);

glVertex3d(3,4,0); // вторая точка

glColor3d(0,0,1);

glVertex3d(4,4,0); // третья

GlDisable(GL_POINT_SMOOTH);

3.2. Линии

Для линий также можно изменять ширину, цвет, размер сглаживание. Если вы зададите разные цвета для начала и конца линии, то ее цвет будет переливающимся. OpenGL по умолчанию делает интерполяцию. Так же можно рисовать прерывистые линии, делается это путем наложения маски при помощи, следующей функции:

Void glLineStipple(GLint factor, GLushort pattern);

Второй параметр задает саму маску. Например, если его значение равно 255(0x00FF), то чтобы вычислить задаваемую маску воспользуемся калькулятором. В двоичном виде это число выглядит так: 0000000011111111, т. е. всего 16 бит. Старшие восемь установлены в ноль, значит, тут линии не будет. Младшие установлены в единицу, тут будет рисоваться линия. Первый параметр определяет, сколько раз повторяется каждый бит. Скажем, если его установить равным 2, то накладываемая маска будет выглядеть так:

GlLineWidth(1); // ширину линии

// устанавливаем 1

GlBegin(GL_LINES);

glColor3d(1,0,0); // красный цвет

glVertex3d(-4.5,3,0); // первая линия

glVertex3d(-3,3,0);

glColor3d(0,1,0); // зеленый

glVertex3d(-3,3.3,0); // вторая линия

glVertex3d(-4,3.4,0);

GlLineWidth(3); // ширина 3

GlBegin(GL_LINE_STRIP); // см. ниже

glColor3d(1,0,0);

glVertex3d(-2.7,3,0);

glVertex3d(-1,3,0);

glColor3d(0,1,0);

glVertex3d(-1.5,3.3,0);

glColor3d(0,0,1);

glVertex3d(-1,3.5,0);

GlEnable(GL_LINE_SMOOTH);

GlEnable(GL_LINE_STIPPLE); // разрешаем рисовать

// прерывистую линию

GlLineStipple(2,58360); // устанавливаем маску

// пояснения см. ниже

GlBegin(GL_LINE_LOOP);

glColor3d(1,0,0);

glVertex3d(1,3,0);

glVertex3d(4,3,0);

glColor3d(0,1,0);

glVertex3d(3,2.7,0);

glColor3d(0,0,1);

glVertex3d(2.5,3.7,0);

GlDisable(GL_LINE_SMOOTH);

GlDisable(GL_LINE_STIPPLE);

3.3. Треугольники

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

Void glPolygonMode(

Она устанавливает опции для прорисовки многоугольника. Возможные значения параметров функции приведены в таблице 2.

Таблица 2.

Значения параметров функции glPolygonMode

Первый параметр указывает, для каких сторон применяется опция, заданная вторым параметром. Треугольники можно рисовать, передав GL_TRIANGLE_STRIP или GL_TRIANGLE_FAN в glBegin. В первом случае первая, вторая и третья вершины задают первый треугольник. Вторая, третья и четвертая вершина — второй треугольник. Третья, четвертая и пятая вершина — третий треугольник и т. д. Вершины n, n+1 и n+2 определят n-ый треугольник. Во втором случае первая, вторая и третья вершина задают первый треугольник. Первая, третья и четвертая вершины задают второй треугольник и т. д. Вершины 1, n+1, n+2 определяют n-ый треугольник. Далее следует пример с комментариями.

GlPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // см. выше

GlBegin(GL_TRIANGLES);

glColor3d(1,0,0); // рисуем треугольник

glVertex3d(-4,2,0);

glVertex3d(-3,2.9,0);

glVertex3d(-2,2,0);

//рисуем проволочные треугольники

GlBegin(GL_TRIANGLE_STRIP); // обратите внимание на

// порядок вершин

glColor3d(0,1,0);

glVertex3d(1,2,0);

glVertex3d(0,2.9,0);

glVertex3d(-1,2,0);

glVertex3d(0,1.1,0);

GlEnable(GL_LINE_STIPPLE);

GlPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

GlBegin(GL_TRIANGLE_FAN);

glColor3d(0,0,1);

glVertex3d(4,2,0);

glVertex3d(2.6,2.8,0);

glVertex3d(2,2,0);

glVertex3d(3,1.1,0);

GlDisable(GL_LINE_STIPPLE);

3.4. Четырехугольники и многоугольники

Четырехугольники рисуются вызовом функции glBegin с параметром GL_QUADS или GL_QUAD_STRIP. Для первого случая каждые четыре вершины определяют свой четырехугольник. Во втором случае рисуются связанные четырехугольники. Первая, вторая, третья и четвертая вершина определяют первый четырехугольник. Третья, четвертая, пятая и шестая вершина — второй четырехугольник и т. д. (2n-1), 2n, (2n+1) и (2n+2) вершины задают n-ый четырехугольник. Многоугольники задаются вызовом glBegin с параметром GL_POLYGON. Все вершины определяют один многоугольник. Для многоугольников можно задавать стили при помощи выше описанной функции glPolygonMode, толщину линии, толщину точек и цвет.

4. Переход к новым координатам

В предыдущем разделе вы научились рисовать примитивные трехмерные объекты. Но проблема в том, что они рисуются только в начале координат, т. е. в точке (0,0,0). Для того чтобы изобразить объект в точке (x0,y0,z0), надо переместить начало координат в эту точку, т. е. надо перейти к новым координатам. Эта процедура довольно распространенная при программировании графики и анимации. Часто, бывает очень удобно, сместить координаты в новую точку и повернуть их на требуемый угол, и ваши расчеты резко упростятся. Для перехода к новым координатам в OpenGL есть две функции:

Void glTranslated(Dx, Dy, Dz);

Void glRotated(j, x0,y0,z0);

Первая функция сдвигает начало системы координат на (Dx, Dy, Dz). Вторая — поворачивает на угол j против часовой стрелки вокруг вектора (x0,y0,z0). Теперь, стоит сказать еще о двух очень важных функциях:

Void glPushMatrix();

Void glPopMatrix();

Они предназначены для сохранения и восстановления текущих координат. Часто бывает неудобно переходить от одной системы координат к другой и помнить все переходы. Гораздо удобнее с помощью glPushMatrix() сохранить текущие координаты, потом сдвигаться, вертеться, как угодно, а после, вызовом glPopMatrix вернуться к старым координатам. Теперь можно поэкспериментировать. Рассмотрим сдвиг координат. Вставьте в функцию display следующий код:

GlTranslated(1.4,0,0);// сдвигаемся по оси Х на 1.4

GlColor3d(0,1,0);

AuxSolidSphere(0.5); // рисуем сферу в (1.4,0,0)

// в абсолютных координатах

GlTranslated(1,0,0); // еще раз сдвигаемся

GlColor3d(0,0,1);

AuxSolidSphere(0.3);

GlPopMatrix(); // возвращаемся к старой системе

// координат

GlColor3d(1,0,0);

AuxSolidSphere(0.75); // рисуем сферу в точке (0,0,0)

// в абсолютных координатах

5. Поворот координат

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

GlColor3d(1,0,0);

AuxSolidCone(1, 2); // рисуем конус в центре координат

GlPushMatrix(); // сохраняем текущие координаты

glTranslated(1,0,0); // сдвигаемся в точку (1,0,0)

glRotated(75,1,0,0); // поворачиваем систему

// координат на 75 градусов

glColor3d(0,1,0);

auxSolidCone(1, 2); // рисуем конус

GlPopMatrix(); // возвращаемся к старым координатам

Как видите, конус повернулся в абсолютных координатах. Так что, для того, чтобы нарисовать фигуру не в начале координат, надо:

· сдвинуть(glTranslated), повернуть(glRotated);

· нарисовать то, что хотели;

· вернуться к старым координатам.

Вызовы glPushMatrix/PopMatrix могут быть вложенными, т. е.:

Естественно число вызовов glPopMatrix должно соответствовать числу вызовов glPushMatrix, иначе сцена улетит в неизвестном направление. Максимально допустимая глубина вложенности glPushMatrix/glPopMatrix определяется следующим образом:

GlGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &n);

Printf("n=%d ",n);

Спецификация на OpenGL гарантирует, что глубина стека не может быть меньше 32.

6. Построение поверхностей

Существует набор функций для построения сфер, цилиндров и дисков. Эти функции представляют очень мощный контроль за построением трехмерных объектов. Для рисования поверхностей используются следующие функции:

GLUquadricObj * qobj,

GLdouble radius,

Void gluCylinder(

GLUquadricObj *qobj,

GLdouble baseRadius,

GLdouble topRadius,

GLdouble height,

GLUquadricObj *qobj,

GLdouble innerRadius,

GLdouble outerRadius,

Void gluPartialDisk(

GLUquadricObj *qobj,

GLdouble innerRadius,

GLdouble outerRadius,

GLdouble startAngle,

GLdouble sweepAngle

В начале занятия вы научились строить трехмерные объекты с помощью функций из библиотеки Auxilary Library. Функции auxSphere, auxCylinder и auxCone просто вызывают gluSphere и gluCylinder. В auxCylinder и auxCone фирмы Microsoft имеются баги. Здесь будет подробно рассмотрено построение сфер и цилиндров, так что потребность в auxCylinder и auxCone отпадет.

Первым параметром для gluSphere, gluCylinder, gluDisk и gluPartialDisk является указатель на объект типа GLUquadricObj. Далее следуют параметры непосредственно создаваемой фигуры. Для сферы – это радиус; для цилиндра – радиус нижнего основания, радиус верхнего основания и высота; для диска – внутренний радиус, внешний радиус и для частичного диска – внутренний радиус, внешний радиус, угол, с которого начинать рисовать, длина дуги в градусах, которую рисовать. Последние два параметра у всех этих функций одинаковы. Это число разбиений вокруг оси Z и число разбиений вдоль оси Z. Как известно, все сложные объекты состоят из простых: точек, линий и многоугольников. Понятно, что нарисовать (создать) идеально гладкую сферу или цилиндр невозможно. Поэтому строится приближение из плоскостей. Для этого и нужно указать количество разбиений. Чем больше разбиение, тем лучше будет выглядеть ваш объект. Однако, задавать здесь число с шестью нулями не стоит. Это лишено всякого смысла. Оптимальным является число от 10 до 20. Чем больше объект, тем больше нужно разбиений. Число разбиений (вдоль и поперек) лучше выставлять одинаковыми.

Сначала необходимо создать объект типа GLUquadricObj с помощью функции

GLUquadricObj * gluNewQuadric(void);

Затем нужно установить свойства с помощью функции

Void gluQuadricDrawStyle(

GLUquadricObj *qobj,

Glenum drawStyle

Доступны стили:

GLU_FILL – рисуется сплошной объект;

GLU_LINE – проволочный объект;

GLU_POINT – рисуются только точки.

Удалить созданный объект можно, воспользовавшись функцией

Void gluDeleteQuadric(GLUquadricObj * state);

Теперь можно поэкспериментировать. Измените функцию display следующим образом.

Void display(void)

GLUquadricObj * quadObj;

// создаем новый объект для создания сфер и цилиндров

quadObj = gluNewQuadric();

glColor3d(1,0,0);

// устанавливаем стиль: сплошной

gluQuadricDrawStyle(quadObj, GLU_FILL);

// рисуем сферу радиусом 0.5

gluSphere(quadObj, 0.5, 10, 10);

glTranslated(-2,0,0); // сдвигаемся влево

glRotated(45, 1,0,0); // поворачиваем

glColor3d(0,1,0);

// устанавливаем стиль: проволочный

gluQuadricDrawStyle(quadObj, GLU_LINE);

gluCylinder(quadObj, 0.5, 0.75, 1, 15, 15);

gluDeleteQuadric(quadObj);

auxSwapBuffers();

7. Плоскости отсечения

Если требуется нарисовать сферу или любой другой объект урезанным, то это можно сделать с помощью плоскости отсечения. Плоскостей отсечения может быть шесть. По умолчанию они все запрещены. Плоскость отсечения включается командой glEnable(GL_CLIP_PLANE0). Ноль на конце GL_CLIP_PLANE означает нулевую плоскость; можно указать один, два, три и т. д. Сама плоскость устанавливается функцией

Void glClipPlane(

const GLdouble *equation

Первый аргумент этой функции – это плоскость, второй – это массив из четырех элементов, в котором хранятся коэффициенты (A, B, C, D) уравнения плоскости: A*x + B*y + C*z + D = 0. Измените функцию display, как показано ниже.

Void display(void)

GLdouble equation = {-1,-0.25,0,2};

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_CLIP_PLANE0);

glClipPlane(GL_CLIP_PLANE0, equation);

glColor3d(1,0,0);

auxSolidSphere(3);

glDisable(GL_CLIP_PLANE0);

auxSwapBuffers();

8. Задания

1. Нарисовать куб представляющий собой пространство RGB. Вершины куба имеют цвета: R – красный, G – зеленый, B – синий, C – голубой, M – пурпурный, Y – желтый, W – белый, K – черный. Цвет каждого ребра плавно изменяется от цвета одной вершины до цвета другой.

После того, как куб нарисован, осуществить сдвиг его так, чтобы начало координат совпало с центром куба, а затем поворот вокруг оси OX на угол 30° и вокруг оси OZ на угол -20°.

2. Нарисовать сцену, в которой в начале координат изображается сфера радиуса r. На расстоянии R1 от первой сферы в некоторой точке (x1, y1, 0) изображается сфера с радиусом r1. От нее на расстоянии R2 в некоторой точке (x2, y2, 0) изображается сфера радиуса r2.

После того как сцена нарисована необходимо ее «оживить», т. е. заставить вращаться сферу r1 вокруг сферы r, а сферу r2 вокруг r1. Для этого необходимо объявить глобальные переменные f1 и f2 – углы поворота соответственно r1 вокруг r и r2 вокруг r1. Затем перед каждым выводом инкрементировать f1f2 на постоянные величины и вычислять x1, y1, x2, y2 по следующим формулам.

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

хорошую работу на сайт">

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

OpenGL - это программный интерфейс к графической аппаратуре. Этот интерфейс состоит приблизительно из 250 отдельных команд (около 200 команд в самой OpenGL и еще 50 в библиотеке утилит), которые используются для указания объектов и операций, которые необходимо выполнить, чтобы получить интерактивное приложение, работающее с трехмерной графикой. оpengl программный интерфейс графический

Библиотека OpenGL разработана как обобщенный, независимый интерфейс, который может быть реализован для различного аппаратного обеспечения. По этой причине сама OpenGL не включает функций для создания окон или для захвата пользовательского ввода; для этих операций вы должны использовать средства той операционной системы, в которой вы работаете. По тем же причинам в OpenGL нет высокоуровневых функций для описания моделей трехмерных объектов. Такие команды позволили бы вам описывать относительно сложные фигуры, такие как автомобили, части человеческого тела или молекулы. При использовании библиотеки OpenGL вы должны строить необходимые модели при помощи небольшого набора геометрических примитивов - точек, линий и многоугольников (полигонов).

Тем не менее, библиотека, предоставляющая описанные возможности может быть построена поверх OpenGL. Библиотека утилит OpenGL (OpenGL Utility Library -- GLU) предоставляет множество средств для моделирования, например, квадрические поверхности, кривые и поверхности типа NURBS. GLU - стандартная часть любой реализации OpenGL. Существуют также и более высокоуровневые библиотеки, например, Fahrenheit Scene Graph (FSG), которые построены с использованием OpenGL и распространяются отдельно для многих ее реализаций.

В следующем списке коротко описаны основные графические операции, которые выполняет OpenGL для вывода изображения на экран.

1. Конструирует фигуры из геометрических примитивов, создавая математическое описание объектов (примитивами в OpenGL считаются точки, линии, полигоны, битовые карты и изображения).

2. Позиционирует объекты в трехмерном пространстве и выбирает точку наблюдения для осмотра полученной композиции.

3. Вычисляет цвета для всех объектов. Цвета могут быть определены приложением, получены из расчета условий освещенности, вычислены при помощи текстур, наложенных на объекты или из любой комбинации этих факторов.

4. Преобразует математическое описание объектов и ассоциированной с ними цветовой информации в пиксели на экране. Этот процесс называется растеризацией (или растровой разверткой).

В течение всех этих этапов OpenGL может производить и другие операции, например, удаление частей объектов, скрытых другими объектами. В дополнение к этому, после того, как сцена растеризована, но до того, как она выводится на экран, вы можете производить некоторые операции с пиксельными данными, если это необходимо.

Общий порядок работы с библиотекой OpenGl таков:

1. Инициализировать окно (получить область для вывода изображения)

2. Установить камеру

3. Включить свет (если это необходимо)

4. В цикле начать выводить примитивы (точки, линии, полигоны), предварительно очищая окно от предыдущего рисунка.

Инициализация окна.

Если вы работаете в Visual C++, то окно, создается при помощи функций

auxInitDisplayMode

Основной цикл рисования кадра создается в функции Draw и регистрируется при помощи функции

auxMainLoop(Draw);

static void CALLBACK Draw(void) // создается пользователем

// расположение окна OpenGL на экране

auxInitPosition(100, 100, windowW, windowH);

// установка основных параметров работы OpenGL

// цветовой режим RGB | включение Z-буфера для сортировки по глубине

// |Двойная буферизация

auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

// инициализация окна OpenGL с заголовком Title

if(auxInitWindow("Example1") ==GL_FALSE) auxQuit();

// регистрация функции, которая вызывается при перерисовке

// и запуск цикла обработки событий

// Draw() - функция пользователя

auxMainLoop(Draw);

Если вы работаете в Borland C++ Builder, то для инициализации окна, надо получить Handle (уникальный идентификатор окна Windows) того окна, на котором вы будите рисовать. Handle имеется у всех окон-приложений верхнего уровня и у большинства дочерних окон. В наших примерах мы будем рисовать на дочернем окне StaticText.

Далее мы должны создать Контекст рисования (device context) и установить его формат. Для этого инициализируется структуру PIXELFORMATDESCRIPTOR (формат описания пикселей). В этой структуре описывается, требуется ли нам поддержка буфера глубины, двойной буферизации и проч.).

Затем следуют функции:

ChoosePixelFormat

Создается контекст рисования OpenGL:

wglCreateContext(hdc);

А потом связываются контексты OpenGL и Windows:

wglMakeCurrent(hdc, hrc)

void __fastcall TFormMain::FormCreate(TObject *Sender)

// возьмем ХЕНДЛ окошка StaticText

static HWND Handle=a->Handle;

// создадим Хендл места рисования для окна StaticText

hdc = GetDC (Handle) ;

// устанавливаем соответствующие настройки контекста устройства

PIXELFORMATDESCRIPTOR pfd = {

sizeof(PIXELFORMATDESCRIPTOR),

PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,

// выбрать соответствующий формат

PixelFormat = ChoosePixelFormat(hdc, &pfd);

SetPixelFormat(hdc, PixelFormat, &pfd);

// создадим контекст устройства для OpenGL

// используя Хендл места рисования

hrc = wglCreateContext(hdc);

ShowMessage(":-)~ hrc == NULL");

if(wglMakeCurrent(hdc, hrc) == false)

ShowMessage("Could not MakeCurrent");

Установка камеры

По умолчанию камера расположена в начале координат (0, 0, 0), направлена вдоль отрицательного направления оси z, и вектором верхнего направления имеет (0, 1, 0).

Для установки камеры удобно использовать функцию gluLookAt(). Хотя она имеет 9 параметров, в них легко разобраться. Они делятся по три параметра, соответственно для трех точек: Eye (Глаз), Center, Up.

Глаз определяет точку откуда смотрим, Центр - куда смотрим, а вектор верха определяет, где у нас должен быть верх (представьте себе пилота в самолете летящего головой вниз). Вектора удобно заключать в классы с переопределенными операциями.

gluLookAt(e.x,e.y,e.z, c.x,c.y,c.z, u.x,u.y,u.z);

Основной цикл включает в себя следующие этапы рисования кадра:

1. Очистку буферов от рисования предыдущей картинки

2. Функции рисования примитивов

3. Функции завершения рисования и ожидания ответа видеокарты

4. Функции копирования изображения из памяти на экран

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

Если вы работаете в Visual C, то это осуществляется при помощи функций, прототипы которых описаны в файле glaux.h:

auxReshapeFunc()

Если вы работаете в Borland C, то обработка событий осуществляется традиционным для созданных этой программной средой образом: вы просто выбираете компонент(например, Button1), создаете обработчик (например нажатие клавиши) и внутри описываете тело функции.

Рисование примитивов

Рисование примитивов осуществляется командами glBegin() и glEnd().

Константа переданная функции glBegin определяет тип примитива, который будет рисоваться

Координаты точек задаются трехмерным пространственным вектором вектором. Цвета задаются тремя (RGB) или четырьмя (RGBA) параметрами. В нашем примере значение цветовой составляющей каждого цвета можно варьировать от 0 до 1. Если вы привыкли к значению цветовой составляющей от 0 до 255(MsPaint), то используется функция glColor3ub(255,0,0). Суффикс ub означает unsigned byte.

Освещение в Компьютерной графике имеет 3 составляющие

Фоновое излучение - это свет, который настолько распределен средой (предметами, стенами и так далее), что его направление определить невозможно - кажется, что он исходит отовсюду. Лампа дневного света имеет большой фоновый компонент, поскольку большая часть света, достигающего вашего глаза, сначала отражается от множества поверхностей. Уличный фонарь имеет маленький фоновый компонент: большая часть его света идет в одном направлении, кроме того, поскольку он находится на улице, очень небольшая часть света попадает вам в глаз после того, как отразится от других объектов. Когда фоновый свет падает на поверхность, он одинаково распределяется во всех направлениях.

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

Зеркальный свет исходит из определенного направления и отражается от поверхности в определенном направлении. При отражении хорошо сфокусированного лазерного луча от качественного зеркала происходит почти 100 процентное зеркальное отражение. Блестящий метал или пластик имеет высокий зеркальный компонент, а кусок ковра или плюшевая игрушка - нет. Вы можете думать о зеркальности как о том, насколько блестящим выглядит материал.

Помимо фонового, диффузного и зеркального цветов, материалы могут также иметь исходящий цвет, имитирующий свет, исходящий от самого объекта. В модели освещения OpenGLисходящий свет поверхности добавляет объекту интенсивности, но на него не влияют никакие источники света, и он не производит дополнительного света для сцены в целом.

Хотя источник света излучает единое распределение частот, фоновый, диффузный и зеркальный компоненты могут быть различны. Например, если в вашей комнате красные стены и белый свет, то этот свет, отражаясь от стен будет скорее красным, чем белым (несмотря на то, что падающий на стену свет -- белый). OpenGL позволяет устанавливать значения красного, зеленого и синего независимо для каждого компонента света.

Команды, используемые для установления материала таковы:

// экземпляры для источника света и материала

// Включим свет источник номер ноль

glEnable(GL_LIGHT0);

// устанавливаем положение и цветовые составляющие источника света

glLightfv(GL_LIGHT0, GL_POSITION, LL.pos);

glLightfv(GL_LIGHT0, GL_AMBIENT, LL.amb);

glLightfv(GL_LIGHT0, GL_DIFFUSE, LL.dif);

glLightfv(GL_LIGHT0, GL_SPECULAR, LL.spec);

// включим режим затениения/освещения

glEnable(GL_LIGHTING);

// устанавливаем параметры материала обьекта

// на лицевых гранях --- GL_FRONT для задних GL_BACK для обоих - GL_FRONT_AND_BACK

// второй параметр - какая составляющая материала

// можно GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_SHININESS

// соотв РАССЕЯННЫЙ, ОТРАЖЕННЫЙ, ЗЕРКАЛЬНЫЙ, САМОИЗЛУЧЕНИЯ, показатель зеркального блика

glMaterialfv(GL_FRONT,GL_AMBIENT,MM.amb);

glMaterialfv(GL_FRONT,GL_DIFFUSE,MM.dif);

glMaterialfv(GL_FRONT,GL_SPECULAR,MM.spec);

glMaterialf(GL_FRONT,GL_SHININESS,MM.pos);

glNormal3f(0,0,1);

glBegin(GL_QUADS);

for(i=-10; i<20;i++)

for(j=-10;j<20;j++)

glVertex3f(i,j,0);

glVertex3f(i+1,j,0);

glVertex3f(i+1,j+1,0);

glVertex3f(i,j+1,0);

Заключение

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

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

Размещено на Allbest.ru

Подобные документы

    Программный код OpenGL. Синтаксис команд OpenGL. OpenGL как конечный автомат. Конвейер визуализации OpenGL. Библиотеки, относящиеся к OpenGL. Библиотека OpenGL. Подключаемые файлы. GLUT, инструментарий утилит библиотеки OpenGL.

    курсовая работа , добавлен 01.06.2004

    Программирование приложения с использованием библиотеки OpenGL и функции для рисования геометрических объектов. Разработка процедуры визуализации трехмерной сцены и интерфейса пользователя. Логическая структура и функциональная декомпозиция проекта.

    курсовая работа , добавлен 23.06.2011

    Ознакомление с интерфейсом, основными возможностями и преимуществами использования программы OpenGL - популярной библиотекой для работы с 2D и 3D графикой. Рассмотрение назначения, базовых компонент и правил инициализации программного движка DirectX.

    презентация , добавлен 14.08.2013

    Создание программы на языке C++ с использованием графических библиотек OpenGL в среде Microsoft Visual Studio. Построение динамического изображения трехмерной модели объекта "Нефтяная платформа". Логическая структура и функциональная декомпозиция проекта.

    курсовая работа , добавлен 23.06.2011

    Суть программирования с использованием библиотеки OpenGL, его назначение, архитектура, преимущества и базовые возможности. Разработка приложения для построения динамического изображения трехмерной модели объекта "Компьютер", руководство пользователя.

    курсовая работа , добавлен 22.06.2011

    Работа с цветом с помощью графической библиотеки OpenGL. Программа, отображающая квадрат, с меняющимся цветом, в зависимости от изменения градиентов (R,G,B), треугольник, вершины которого имеют различные цвета, прямоугольную полосу в виде спектра.

    контрольная работа , добавлен 21.01.2011

    Назначение и стандарты реализации OpenGL для Windows, порядок подключения графической библиотеки. Основные функции и синтаксис команд. Рисование примитивов, видовые и аффинные преобразования. Моделирование двумерных графических объектов и анимации.

    лабораторная работа , добавлен 04.07.2009

    Основы программирования с использованием библиотеки OpenGL. Приложение для построения динамического изображения модели объекта "Батискаф": разработка процедуры визуализации трехмерной схемы, интерфейса пользователя и подсистемы управления событиями.

    курсовая работа , добавлен 26.06.2011

    Поняття та сфери використання тривимірної графіки. Описання та характеристика можливостей бібліотеки OpenGL. Загальний опис інтерфейсу мови програмування Borland C++, лістинг програми, що демонструє її можливості. Розрахунок витрат на виконання проекту.

    дипломная работа , добавлен 24.06.2015

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

Обычно область, в которой необходимо определить наличие объектов (область выбора объектов), определяется как фрагмент проекции сцены. Например, пользователь на изображении проекции выделяет с помощью манипулятора (например, указателя типа "мышь") прямоугольную область или просто щелкает кнопкой "мыши", определяя, таким образом, область выбора.

Так как в этих случаях область выбора определяется на проекции трехмерной сцены, то необходимо определить соответствующую ей область трехмерной сцены (сцена выбора). Сцена выбора будет зависеть от нескольких факторов: используемой проекции, размеров сцены и области вывода.

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

В библиотеке OpenTK функции библиотеки GLUT находятся в классе Glu в пространстве имен Tao .OpenGL (C#). В Object Pascal все функции и процедуры библиотеки GLUT имеют префикс "glu" , что позволяет их отличать от процедур и функций OpenGL .

Для формирования матрицы проекции на основе выбранного фрагмента проекции сцены можно использовать команду PickMatrix библиотеки GLUT :

C#: void gluPickMatrix(double x, double y, double width, double height, int viewport); Object Pascal: procedure gluPickMatrix(x,y,width,height: GLdouble; viewport: PGLint);

Команда PickMatrix библиотеки GLUT изменяет текущую матрицу таким образом, чтобы размер области сцены соответствовал области выбора, определённой в координатах проекции этой сцены. Команды имеет следующие параметры:

  • x, y – горизонтальная и вертикальная координаты области выбора в координатах окна, в котором отображается проекция трехмерной сцены.
  • width, height – ширина и высота выбранной прямоугольной области проекции трехмерной сцены в координатах окна.
  • viewport – массив четырех целочисленных элементов. В C# передается непосредственно массив в качестве параметра, в Object Pascal в качестве параметра передаётся указатель на массив. Массив определяет область вывода проекции трехмерной сцены. Значения массива должны соответствовать координатам области вывода, определённым с помощью команды ViewPort . Элементы этого массива должны иметь следующие значения: 1й и 2й элементы – координаты x и у левого верхнего угла выделенной области в координатах экрана, 3 и 4 элементы – ширина и высота этой области.

Команда должна быть выполнена перед выполнением команд Ortho или Frushtum , с помощью которых формируется матрица проекции.

Перевод библиотеки OpenGL в режим выбора

Для перевода библиотеки в режим выбора используется команда RenderMode :

C#: int RenderMode(RenderingMode mode); Object Pascal: function glRenderMode(mode: GLenum): GLint;

Параметр mode определяет режим работы библиотеки OpenGL и может принимать одно из трех значений:

Таблица 10.1. Возможные значения параметра mode команды RenderMode
Описание Значение
Библиотека OpenTK, C# Object Pascal
Режим выбора, данное значение используется для перевода библиотеки в режим выбора. RenderingMode.Select GL_SELECT
Режим формирования изображения сцены. Этот режим используется по умолчанию после инициализации библиотеки OpenGL. Именно в этом режиме выполняется формирование изображения библиотекой OpenGL. RenderingMode.Render GL_RENDER
Режим обратной связи. RenderingMode.Feedback GL_FEEDBACK

После переключения в режим выбора библиотека OpenGL не формирует изображение до тех пор, пока режим не будет изменен на режим формирования изображения сцены с помощью команды RenderMode со значением параметра RenderingMode.Render на C# и GL_RENDER на Object Pascal.

Именование и формирование объектов сцены

Как уже обсуждалось выше, в режиме выбора изображение не формируется. Команды формирования изображения в этом режиме используются для определения объектов, попадающих в область выбора.

Так как объекты, с которыми работает пользователь, обычно формируются из множества различных примитивов, то для определения выбранного объекта используется стек имен. Имена представляют собой целочисленные значения. Перед началом вывода очередного объекта в стек имен помещается имя (номер) этого объекта. Если при формировании объекта библиотека обнаруживает, что примитивы этого объекта попадают в область выбора, то содержание стека имен копируется в буфер выбора (вместе с некоторой дополнительной информацией), инициализированного с помощью команды SelectBuffer . При попадании в область сцены примитивов другого именованного объекта, содержание стека имен так же будет скопировано в буфер выбора. Таким образом, могут быть получены имена (номера) объектов, которые полностью или частично попали в область выбора. Необходимо учитывать, что для корректного определения выбранных объектов необходимо, чтобы координатные преобразования объектов, совпадали с теми, которые выполнялись при формировании изображения сцены.

Для работы со стеком имен используются несколько команд. Очистка стека имён выполняется с помощью команды InitNames :

C#: void InitNames(); Object Pascal: procedure glInitNames;

Помещение имени в стек выполняется с помощью команды PushName :

C#: void PushName(uint name); Object Pascal: procedure glPushName(name: GLuint);

Имя передается в качестве параметра команды.

Перед использованием стека имен он должен быть инициализирован с помощью команды InitNames . Затем в стек необходимо поместить один элемент с помощью команды PushName . Перед формированием каждого из объектов единственный элемент стека имен будет заменяться на имя формируемого объекта с помощью команды LoadName . Процедура заменяет последний элемент в стеке имен на заданный в качестве параметра. Таким образом, инициализация и использование стека имен схематически можно представить следующим образом:

InitNames; PushName(0); … LoadName(1); //формирование объекта № 1 LoadName(2); //формирование объекта № 2 LoadName(3); //формирование объекта № 3 //и т.д. Листинг 10.7. Схема использования стека имен для выбора объектов

Вы читаете мой первый урок по OpenGL!

Прежде чем начинать изучать сам OpenGL, мне кажется, лучше рассказать вам как компилировать код, запускать его и самое главное - как экспериментировать с исходными кодами, приведенными в этих уроках.

Что нужно знать

Данные уроки ориентируются на читателя без особых познаний в программировании. Конечно, знание какого-либо языка программирования(C, Java, Lisp, JavaSript) будет огромным плюсом, но это не обязательно, просто вам придется изучать два предмета одновременно – 3д графику и программирование.

Весь код в данных уроках написан на C++ в максимально простом стиле. Никаких шаблонов, классов и арифметики с указателями. Поэтому глядя на код вы сможете понять что он делает, даже если знакомы лишь с JavaSript.

Забудьте все, что знали про OpenGL 1/2

Данные уроки предполагают, что вы ничего не знаете про 3д графику. Но если вы читали уроки по OpenGL и встречали что-то наподобие glBegin(),то забудьте это. Тут мы будем изучать OpenGL 3 и 4, а то, что вы читали относиться к OpenGL 1 или 2. Поэтому рекомендую вам забыть все, что вы знали раньше, иначе ваши мозги начнут плавиться от нестыковок.

Сборка проекта

Код из данных уроков можно скомпилировать под Windows, Linux. Чтобы начать компилировать код под любую из платформ, нужно сделать следующее:

  1. Обновите драйвера на вашу видеокарту!! Я вас предупредил:)
  2. Скачайте компилятор, если у вас его еще нет.
  3. Установите CMake
  4. Скачайте готовые исходники уроков.
  5. Сгенерируйте проект с помощью CMake
  6. Соберите проект.
  7. Поэкспериментируйте с кодом для лучшего понимания, что там происходит.

Ниже я привел более детализированное описание сборки проектов под каждую из платформ. Но в зависимости от версии ОС скриншоты могут слегка отличатся от того, что будет у вас на экране, но в целом, все должно быть приблизительно таким.

Сборка под Windows


Сборка под Linux

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

  1. Установите последние драйвера на вашу видеокарту. Очень рекомендую не опенсорсные драйвера. Они не входят в состав GNU, но они часто работают гораздо лучше. Если ваша сборка линукса не предоставляет автоматического инсталлятора, попробуйте почитать Ubuntu"s guide.
  2. Поставьте компилятор со всеми необходимыми библиотеками и инструментами. Вот список того, что вам нужно: cmake make g++ libx11-dev libgl1-mesa-dev libglu1-mesa-dev libxrandr-dev libxext-dev. Используйте sudo apt-get install ***** или su /yum install ******
  3. Скачайте исходники примеров и разархивируйте их в папку, например, ~/Projects/OpenGLTutorials/
  4. Зайдите в папку ~/Projects /OpenGLTutorials / и введите следующие команды:
  • mkdir build
  • cd build
  • cmake ..
  1. Если предыдущие команды были выполнены успешно, то в папке build/ будет создан makefile
  2. введите «make all» и после этого будут скомпилированы все примеры и их зависимости. Если не будет никаких ошибок, то готовые исполняемые файлы будут помещены в папку ~/Projects/OpenGLTutorials/

Мне очень нравится использовать IDE QtCreator. Данная IDE умеет из коробки работать с CMake и предоставляет кучу других плюшек, таких как отладка автодополнение итд.

Инструкция по сборке проекта в QtCreator:

1. В QtCreator нажмите File->Tools->Options->Compile&Execute->CMake

2. Укажите путь к CMake. Скорее всего, это будет /usr/bin/cmake

3. File->Open Project ивыберите tutorials/CMakeLists.txt

4. Укажите build папку, папка желательно должна быть вне папки tutorials.

5. Опционально установите –DCMAKE_BUILD_TYPE=Debug в поле параметры.

6. Щелкните на молоток внизу. После этого примеры можно будет запустить из папки tutorials/

7. Чтобы запустить примеры из QtCreator выберите Projects ->Execution parameters ->Working Directory , и выберите каталог где лежат шэйдеры текстуры и модели. Для урока 2 это будет ~/opengl -tutorial /tutorial02_red_triangle/

Запуск примеров

После того, как проект будет скомпилирован, приложения можно будет запускать прямо из каталога.
Если нужно запускать примеры прямо из-под IDE, воспользуйтесь инструкцией приведенной выше, чтобы правильно установить рабочий каталог.

Как проходить эти уроки

Каждый урок идет вместе с исходным кодом и данными. Все эти файлы можно найти в соответствующем каталоге tutorialXX/.

Но я рекомендую вам не менять в этих файлах ничего, они лишь для справки. Лучше играйтесь в playground/playground.cpp и изменяйте там все что захотите. Если вы что-то сломали и не можете восстановить назад, то можно вернуть этот файл просто скопировав его из любого другого урока.

Пока вы будете читать эти уроки, вам везде будут попадаться кусочки кода. Не стесняйтесь и копируйте их в playground.cpp чтобы пощупать их в действии – эксперименты, это всегда хорошо. Повторю еще раз, не просто читайте готовый код, а пробуйте его запустить. Просто читая исходники, вы не научитесь многому. Даже с простым копипастингом вы получите свой ковш проблем, решая которые, приобретете необходимый опыт.

Открываем окно

Наконец-то! OpenGL!

Хотя, придется еще немного подождать. Во всех уроках 3д операции будут выполнятся на очень низком уровне, поэтому там не будет для вас никакой магии. Однако работа с окнами и сообщениями системы не интересная и скучная, поэтому мы позволим библиотеке GLFW сделать всю грязную работу за нас. Если вам конечно очень сильно хочется, вы можете использовать Win32 Api для Windows или X11 API для Linux, или использовать что-нибудь другое, типа SFML, FreeGLUT, SDL, … почитайте страничку ссылки.

Ладно, давайте уже начнем. Начнем с того, что нам нужно подключить зависимости. Так как нам необходимо выводить сообщения на консоль, мы напишем следующее:

// Подключаем стандартные заголовки

#include

#include

Потом подключаем GLEW

// Нужно не забывать, что GLEW обязательно необходимо подключать перед gl . h или glfw . h

#include

Потом подключаем GLFW. Эта библиотека будет делать всю магию управления окнами.

#include

На данном этапе нам не нужна эта библиотека, но она содержит математические функции и вскоре нам понадобится. Никакой магии в GLM нет, и если вам сильно хочется, вы можете использовать любую другую библиотеку по работе с матрицами и векторами. Мы подключаем «using namespace» для того, чтобы писать «vec3», а не «glm::vec3»

#include

using namespace glm;

Если вы скопируете эти куски кода в playground.cpp, то компилятор начнет возмущаться, что нет функции main(). Поэтому давайте добавим:

int main(){

Сначала лучше бы инициализировать GLFW:

// Инициализируем GLFW

if(!glfwInit())

{

fprintf(stderr, "Failed to initialize GLFW\n");

return -1;

}

А теперь создадим наше OpenGL окошко:

glfwOpenWindowHint ( GLFW _ FSAA _ SAMPLES , 4); // 4 x сглаживание

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // нам нужен OpenGL 3.3

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // нам не нужен старый OpenGL

// Откроем окно и создадим контекст

if(!glfwOpenWindow(1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW))

{

fprintf(stderr, "Failed to open GLFW window\n");



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows