![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Прежде всего, необходимо научиться самому основному - это созданию окна, в котором можно будет рисовать с помощью OpenGL. Минимальная программа, которая создает окно и что-нибудь рисует в этом окне, состоит из следующих шагов:
1. Установка параметров окна.
2. Создание окна.
3. Установка функций, отвечающих за рисование в окне и изменении формы окна.
4. Вход в главный цикл GLAUX.
Рассмотрим все 4 пункта подробнее:
1. Установка параметров окна содержит в себе несколько этапов. Прежде всего, необходимо указать положение создаваемого окна относительно верхнего левого угла экрана. Делается это командой:
void auxInitWindowPosition(int x, int y, int x1, int y1,);
Необходимо также установить для окна режим отображения информации, т.е. установить для окна такие параметры как используемая цветовая модель, количество различных буферов, и т.д. Для этого в GLAUX существует команда:
void auxInitDisplayMode(unsigned int mode);
У команды имеется единственный параметр, который может быть представлен одной из следующих констант или комбинацией этих констант с помощью побитового ИЛИ.
Константа | Значение |
AUX_RGB | Для отображения графической информации используются 3 компоненты цвета RGB. |
AUX_RGBA | То же что и RGB, но используется также 4 компонента ALPHA (прозрачность). |
AUX_INDEX | Цвет задается не с помощью RGB компонентов, а с помощью палитры. Используется для старых дисплеев, где количество цветов например 256. |
AUX_SINGLE | Вывод в окно осуществляется с использованием 1 буфера. Обычно используется для статического вывода информации. |
AUX_DOUBLE | Вывод в окно осуществляется с использованием 2 буферов. Применяется для анимации, чтобы исключить эффект мерцания. |
AUX_ACCUM | Использовать также буфер накопления (Accumulation Buffer). Этот буфер применяется для создания специальных эффектов, например отражения и тени. |
AUX_ALPHA | Использовать буфер ALPHA. Этот буфер, как уже говорилось используется для задания 4-го компонента цвета - ALPHA. Обычно применяется для таких эффектов как прозрачность объектов и антиалиасинг. |
AUX_DEPTH | Создать буфер глубины. Этот буфер используется для отсечения невидимых линий в 3D пространстве при выводе на плоский экран монитора. |
AUX_STENCIL | Буфер трафарета используется для таких эффектов как вырезание части фигуры, делая этот кусок прозрачным. Например, наложив прямоугольный трафарет на стену дома, вы получите окно, через которое можно увидеть что находится внутри дома. |
AUX_STEREO | Этот флаг используется для создания стереоизображений. Используется редко, так как для просмотра такого изображения нужна специальная аппаратура. |
Вот пример использования этой команды: void auxInitDisplayMode(AUX_RGB | AUX_DOUBLE);
2. Создание окна. После того как установлены параметры окна, необходимо его создать.
int auxInitWindow(const char *title);
Эта команда создаёт окно с заголовком, который вы укажете в качестве параметра и возвращает HANDLER окна в виде числа int. Этот HANDLER обычно используется для последующих операций над этим окном, таких как изменение параметров окна и закрытие окна.
3. Установка функций, отвечающих за рисование в окне и изменение формы окна.
После того, как окно, в которое будет выводиться графическая информация, подготовлено и создано, необходимо связать с ним процедуры, которые будут отвечать за вывод графической информации, следить за размерами окна, следить за нажатиями на клавиши и т.д. Самая первая и самая необходимая функция, которую мы рассмотрим, отвечает за рисование. Именно она всегда будет вызываться операционной системой, чтобы нарисовать (перерисовать) содержимое окна. Итак, задаётся эта функция командой:
void auxIdleFunc(void (*func)(void));
Единственный параметр этой функции - это указатель на функцию, которая будет отвечать за рисование в окне. Например, чтобы функция void Display(void), определенная в программе, отвечала за рисование в окне, надо присоединить ее к GLAUX следующим образом: auxIdleFunc(Display);
И ещё одна функция, которая является важной - это функция, которая отслеживает изменения окна. Как только у окна изменились размеры, необходимо перестроить вывод графической информации уже в новое окно с другими размерами. Если этого не сделать, то, например, увеличив размеры окна, вывод информации будет производиться в старую область окна, с меньшими размерами. Определить функцию, отвечающую за изменение размеров окна нужно следующей командой:
void auxReshapeFunc(void (*func)(int width, int height));
Единственный параметр - это указатель на функцию, отвечающую за изменение размеров окна, которая должна принимать два параметра width и height, соответственно ширина и высота нового (измененного) окна.
4. Вход в главный цикл GLAUX.
Последнее, что необходимо сделать, чтобы запустить программу - это войти в так называемый главный цикл GLAUX. Этот цикл запускает на выполнение так называемое сердце GLAUX, которое обеспечивает взаимосвязь между операционной системой и теми функциями, которые отвечают за окно, получают информацию от устройств ввода/вывода. Для того, чтобы перейти в главный цикл GLAUX, надо выполнить единственную команду:
void auxMainLoop(void);
Отображение примитивов
Точки, линии, треугольники, четырехугольники, многоугольники - простые объекты, из которых состоят любые сложные фигуры. OpenGL непосредственно не поддерживает функций для создания сложных трехмерных объектов, т.е. таких функций нет в opengl32.dll. Эти функции есть в библиотеке утилит glu32.dll, и устроены они следующим образом. Для того чтобы нарисовать сферу функция auxSolidSphere использует функции из библиотеки glu32.dll, а те в свою очередь, используют базовую библиотеку opengl32.dll и из линий или многоугольников строят сферу.
Примитивы создаются следующим образом:
glBegin(GLenum mode); // указываем, что будем рисовать glVertex[2 3 4][s i f d](...); // первая вершина... // остальные вершины glVertex[2 3 4][s i f d](...); // последняя вершина glEnd(); // закончили рисовать примитивСначала с помощью функции glBegin с соответствующим параметром указывают, что будут рисовать. Возможные значения mode перечислены ниже в таблице. Далее указываются вершины, определяющие объекты указанного типа. Обычно вершину задается одним из четырех способов.
glVertex2d(x,y); // две переменных типа double glVertex3d(x,y,z); // три переменных типа double glVertex2dv(array); // массив из двух переменных типа double glVertex3dv(array); // массив из трех переменных типа double И, наконец, вызывается glEnd, чтобы указать, что прорисовка объекта типа, указанного в glBegin окончена. Далее мы подробно разберем создание всех примитивов.Значение mode | Описание |
GL_POINTS | Каждый вызов glVertex задает отдельную точку. |
GL_LINES | Каждая пара вершин задает отрезок. |
GL_LINE_STRIP | Рисуется ломаная. |
GL_LINE_LOOP | Рисуется ломаная, причем ее последняя точка соединяется с первой. |
GL_TRIANGLES | Каждые три вызова glVertex задают треугольник. |
GL_TRIANGLE_STRIP | Рисуются треугольники с общей стороной. |
GL_TRIANGLE_FAN | Тоже самое, но по другому правилу соединяются вершины, вряд ли понадобится. |
GL_QUADS | Каждые четыре вызова glVertex задают четырехугольник. |
GL_QUAD_STRIP | Четырехугольники с общей стороной. |
GL_POLYGON | Многоугольник. |
Точки
Вы можете нарисовать столько точек, сколько вам нужно. Вызывая glVertex3d, вы устанавливает новую точку. При создании точек вы можете изменять следующие параметры. Вы можете вызывать glColor3d внутри glBegin/glEnd. Размер точки можно устанавливать с помощью функции:
Последнюю функцию - glPointSize надо вызывать вне glBegin/glEnd, иначе она будет проигнорирована.
// рисуем точки glPointSize(2); 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); glEnd(); glPointSize(5); 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); glEnd(); glPointSize(10); 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); glEnd();Линии
Для линий также можно изменять ширину, цвет, размер сглаживание. Если вы зададите разные цвета для начала и конца линии, то ее цвет будет переливающимся. OpenGL по умолчанию делает интерполяцию. Так же можно рисовать прерывистые линии, делается это путем наложения маски при помощи следующей функции:
void glLineStipple(GLint factor, GLushort pattern);Второй параметр задает саму маску. Например, если его значение равно 255(0x00FF), то чтобы вычислить задаваемую маску воспользуемся калькулятором. В двоичном виде это число выглядит так: 0000000011111111, т.е. всего 16 бит. Старшие восемь установлены в ноль, значит, тут линии не будет. Младшие установлены в единицу, тут будет рисоваться линия. Первый параметр определяет, сколько раз повторяется каждый бит. Скажем, если его установить равным 2, то накладываемая маска будет выглядеть так:
00000000000000001111111111111111Далее приведен исходный текст с комментариями для наглядной демонстрации.
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); glEnd(); 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); glEnd(); glLineWidth(5); 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); glEnd(); glDisable(GL_LINE_SMOOTH); glDisable(GL_LINE_STIPPLE);Дата публикования: 2015-10-09; Прочитано: 447 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!