Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Основные шаги для построения минимальной программы



Прежде всего, необходимо научиться самому основному - это созданию окна, в котором можно будет рисовать с помощью 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. Размер точки можно устанавливать с помощью функции:

void glPointSize(GLfloat size)

Последнюю функцию - 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

Далее приведен исходный текст с комментариями для наглядной демонстрации.





Дата публикования: 2015-10-09; Прочитано: 393 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...