ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1686
Скачиваний: 4
11
поверхностей
,
удаление
невидимых
фрагментов
изображений
,
работа
с
изображениями
на
уровне
пикселей
и
т
.
д
.
1.2.
Интерфейс
OpenGL
OpenGL
состоит
из
набора
библиотек
.
Все
базовые
функции
хранятся
в
основной
библиотеке
,
для
обозначения
которой
в
дальнейшем
мы
будем
использовать
аббревиатуру
GL.
Помимо
основной
, OpenGL
включает
в
себя
несколько
дополнительных
библиотек
.
Первая
из
них
–
библиотека
утилит
GL
(
GLU – GL Utility
).
Все
функции
этой
библиотеки
определены
через
базовые
функции
GL.
В
состав
GLU
вошла
реализация
более
сложных
функций
,
таких
как
набор
популярных
геометрических
примитивов
(
куб
,
шар
,
цилиндр
,
диск
),
функции
построения
сплайнов
,
реализация
дополнительных
операций
над
матрицами
и
т
.
п
.
OpenGL
не
включает
в
себя
никаких
специальных
команд
для
работы
с
окнами
или
ввода
информации
от
пользователя
.
Поэтому
были
созданы
специальные
переносимые
библиотеки
для
обеспечения
часто
используемых
функций
взаимодействия
с
пользователем
и
для
отображения
информации
с
помощью
оконной
подсистемы
.
Наиболее
популярной
является
библиотека
GLUT (GL Utility Toolkit).
Формально
GLUT
не
входит
в
OpenGL,
но
de facto
включается
почти
во
все
его
дистрибутивы
и
имеет
реализации
для
различных
платформ
. GLUT
предоставляет
только
минимально
необходимый
набор
функций
для
создания
OpenGL-
приложения
.
Функционально
аналогичная
Рис
. 1
Организация
библиотеки
OpenGL
Прикладная
программа
GLU
GL
GLUT
GLX
Win32 API
Буфер
кадра
12
библиотека
GLX
менее
популярна
.
В
дальнейшем
в
этом
пособии
в
качестве
основной
будет
рассматриваться
GLUT.
Кроме
того
,
функции
,
специфичные
для
конкретной
оконной
подсистемы
,
обычно
входят
в
ее
прикладной
программный
интерфейс
.
Так
,
функции
,
поддерживающие
выполнение
OpenGL,
есть
в
составе
Win32 API
и
X Window.
На
рисунке
схематически
представлена
организация
системы
библиотек
в
версии
,
работающей
под
управлением
системы
Windows.
Аналогичная
организация
используется
и
в
других
версиях
OpenGL.
1.3.
Архитектура
OpenGL
Функции
OpenGL
реализованы
в
модели
клиент
-
сервер
.
Приложение
выступает
в
роли
клиента
–
оно
вырабатывает
команды
,
а
сервер
OpenGL
интерпретирует
и
выполняет
их
.
Сам
сервер
может
находиться
как
на
том
же
компьютере
,
на
котором
находится
клиент
(
например
,
в
виде
динамически
загружаемой
библиотеки
– DLL),
так
и
на
другом
(
при
этом
может
быть
использован
специальный
протокол
передачи
данных
между
машинами
).
GL
обрабатывает
и
рисует
в
буфере
кадра
графические
примитивы
с
учетом
некоторого
числа
выбранных
режимов
.
Каждый
примитив
–
это
точка
,
отрезок
,
многоугольник
и
т
.
д
.
Каждый
режим
может
быть
изменен
независимо
от
других
.
Определение
примитивов
,
выбор
режимов
и
другие
операции
описываются
с
помощью
команд
в
форме
вызовов
функций
прикладной
библиотеки
.
Примитивы
определяются
набором
из
одной
или
более
вершин
(vertex).
Вершина
определяет
точку
,
конец
отрезка
или
угол
многоугольника
.
С
каждой
вершиной
ассоциируются
некоторые
данные
(
координаты
,
цвет
,
нормаль
,
текстурные
координаты
и
т
.
д
.),
называемые
атрибутами
.
В
подавляющем
большинстве
случаев
каждая
вершина
обрабатывается
независимо
от
других
.
С
точки
зрения
архитектуры
графическая
система
OpenGL
является
конвейером
,
состоящим
из
нескольких
последовательных
этапов
обработки
графических
данных
.
Команды
OpenGL
всегда
обрабатываются
в
том
порядке
,
в
котором
они
поступают
,
хотя
могут
происходить
задержки
перед
тем
,
как
проявится
эффект
от
их
выполнения
.
В
большинстве
случаев
OpenGL
предоставляет
непосредственный
интерфейс
,
т
.
е
.
определение
объекта
вызывает
его
визуализацию
в
буфере
кадра
.
13
С
точки
зрения
разработчиков
, OpenGL –
это
набор
команд
,
которые
управляют
использованием
графической
аппаратуры
.
Если
аппаратура
состоит
только
из
адресуемого
буфера
кадра
,
тогда
OpenGL
должен
быть
реализован
полностью
с
использованием
ресурсов
центрального
процессора
.
Обычно
графическая
аппаратура
предоставляет
различные
уровни
ускорения
:
от
аппаратной
реализации
вывода
линий
и
многоугольников
до
изощренных
графических
процессоров
с
поддержкой
различных
операций
над
геометрическими
данными
.
OpenGL
является
прослойкой
между
аппаратурой
и
пользовательским
уровнем
,
что
позволяет
предоставлять
единый
интерфейс
на
разных
платформах
,
используя
возможности
аппаратной
поддержки
.
Кроме
того
, OpenGL
можно
рассматривать
как
конечный
автомат
,
состояние
которого
определяется
множеством
значений
специальных
переменных
и
значениями
текущей
нормали
,
цвета
,
координат
Рис
. 2.
Функционирование
конвейера
OpenGL
Аппроксимация
кривых
и
поверхностей
Обработка
вершин
и
сборка
примитивов
Растеризация
и
обработка
фрагментов
Операции
над
пикселями
Передача
данных
в
буфер
кадра
Текстуры
Атрибуты
вершин
Источники
света
14
текстуры
и
других
атрибутов
и
признаков
.
Вся
эта
информация
будет
использована
при
поступлении
в
графическую
систему
координат
вершины
для
построения
фигуры
,
в
которую
она
входит
.
Смена
состояний
происходит
с
помощью
команд
,
которые
оформляются
как
вызовы
функций
.
1.4.
Синтаксис
команд
Определения
команд
GL
находятся
в
файле
gl.h,
для
включения
которого
нужно
написать
#include <gl/gl.h>
Для
работы
с
библиотекой
GLU
нужно
аналогично
включить
файл
glu.h.
Версии
этих
библиотек
,
как
правило
,
включаются
в
дистрибутивы
систем
программирования
,
например
Microsoft Visual C++
или
Borland
C++ 5.02.
В
отличие
от
стандартных
библиотек
,
пакет
GLUT
нужно
инсталлировать
и
подключать
отдельно
.
Подробная
информация
о
настройке
сред
программирования
для
работы
с
OpenGL
дана
в
Приложении
С
.
Все
команды
(
процедуры
и
функции
)
библиотеки
GL
начинаются
с
префикса
gl,
все
константы
–
с
префикса
GL_.
Соответствующие
команды
и
константы
библиотек
GLU
и
GLUT
аналогично
имеют
префиксы
glu (GLU_)
и
glut (GLUT_)
Кроме
того
,
в
имена
команд
входят
суффиксы
,
несущие
информацию
о
числе
и
типе
передаваемых
параметров
.
В
OpenGL
полное
имя
команды
имеет
вид
:
type
glCommand_name[1 2 3 4][b s i f d ub us ui][v]
(type1
arg1
,…,typeN
argN
)
Имя
состоит
из
нескольких
частей
:
gl
имя
библиотеки
,
в
которой
описана
эта
функция
:
для
базовых
функций
OpenGL,
функций
из
библиотек
GL, GLU, GLUT,
GLAUX
это
gl, glu, glut, aux
соответственно
.
Command_name
имя
команды
(
процедуры
или
функции
)
15
[1 2 3 4]
число
аргументов
команды
[b s i f d ub us ui]
тип
аргумента
:
символ
b – GLbyte (
аналог
char
в
С
\
С
++),
символ
i – GLint (
аналог
int),
символ
f – GLfloat (
аналог
float)
и
так
далее
.
Полный
список
типов
и
их
описание
можно
посмотреть
в
файле
gl.h
[v]
наличие
этого
символа
показывает
,
что
в
качестве
параметров
функции
используется
указатель
на
массив
значений
Символы
в
квадратных
скобках
в
некоторых
названиях
не
используются
.
Например
,
команда
glVertex2i()
описана
в
библиотеке
GL,
и
использует
в
качестве
параметров
два
целых
числа
,
а
команда
glColor3fv()
использует
в
качестве
параметра
указатель
на
массив
из
трех
вещественных
чисел
.
Использования
нескольких
вариантов
каждой
команды
можно
частично
избежать
,
применяя
перегрузку
функций
языка
C++.
Но
интерфейс
OpenGL
не
рассчитан
на
конкретный
язык
программирования
,
и
,
следовательно
,
должен
быть
максимально
универсален
.
1.5.
Пример
приложения
Типичная
программа
,
использующая
OpenGL,
начинается
с
определения
окна
,
в
котором
будет
происходить
отображение
.
Затем
создается
контекст
(
клиент
) OpenGL
и
ассоциируется
с
этим
окном
.
Далее
программист
может
свободно
использовать
команды
и
операции
OpenGL API.
Ниже
приведен
текст
небольшой
программы
,
написанной
с
использованием
библиотеки
GLUT –
своеобразный
аналог
классического
примера
“Hello, World!”.
Все
,
что
делает
эта
программа
–
рисует
в
центре
окна
красный
квадрат
.
Тем
не
менее
,
даже
на
этом
простом
примере
можно
понять
принципы
программирования
с
помощью
OpenGL.
#include <stdlib.h>
/*
подключаем
библиотеку
GLUT */
#include <gl/glut.h>
/*
начальная
ширина
и
высота
окна
*/