- •ВВЕДЕНИЕ
- •1. ИНТЕРФЕЙС OPENGL
- •3. СИНТАКСИС КОМАНД
- •4. ПРОЦЕСС РЕГЕНЕРАЦИИ ИЗОБРАЖЕНИЯ
- •5. ВЫВОД ГЕОМЕТРИЧЕСКИХ ПРИМИТИВОВ
- •5.1. Задание цветовых атрибутов геометрическим объектам
- •5.2. Типовые графические примитивы
- •5.5. Грани плоских многоугольников
- •5.6. Заполнение полигонов шаблонами
- •5.3. Управление размерами точки
- •5.4. Управление толщиной и шаблоном линии
- •5.7. Воспроизведение битовых массивов
- •5.8. Отсечение областью экрана
- •5.9. Отсечение объектов плоскостями
- •5.10. Логические операции при выводе объекта
- •6. РИСОВАНИЕ ГОТОВЫХ 3D-ОБЪЕКТОВ
- •7. РАБОТА С МАССИВАМИ ВЕРШИН И ИХ АТРИБУТОВ
- •8. РАБОТА СО СПИСКАМИ ИЗОБРАЖЕНИЙ
- •9. ВЫВОД ТЕКСТА
- •10. ПРЕОБРАЗОВАНИЕ КООРДИНАТ
- •10.1. Матричные операции
- •10.2. Модельно-видовые преобразования
- •10.3. Область вывода
- •11. ПРОЕКЦИИ
- •11.1. Ортографическая проекция
- •11.2. Перспективная проекция
- •12. ОБРАТНЫЕ ПРЕОБРАЗОВАНИЯ ОКОННЫХ КООРДИНАТ В ОБЪЕКТНЫЕ
- •13. ПОСТРОЕНИЕ РЕАЛИСТИЧЕСКИХ ИЗОБРАЖЕНИЙ
- •13.1. Текстуры
- •13.2. Работа со светом
- •13.3. Моделирование тумана
- •13.4. Прозрачность
- •14. РАБОТА С БУФЕРАМИ
- •14.1. Буфер трафарета
- •14.2. Буферы накопления
- •14.3. Буфер аккумулятора
- •14.4. Буфер глубины
- •14.5. Буфер изображения
- •15. ГРУППЫ АТРИБУТОВ
- •16. УПРАВЛЕНИЕ ЭФФЕКТИВНОСТЬЮ РАБОТЫ АЛГОРИТМА РАСТЕРИЗАЦИИ
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
14.2.Буферы накопления
ВOpenGL возможно существование специально отведенных внутренних буферов (передний – GL_FRONT , задний – GL_BACK , левый –
GL_LEFT, правый – GL_RIGHT , передний левый – GL_FRONT_LEFT ,
передний правый – GL_FRONT_RIGHT , задний левый –
GL_BACK_LEFT , задний правый – GL_BACK_RIGHT и вспомогательные – GL_AUX0, GL_AUX1, GL_AUX2, GL_AUX3) для временного хра-
нения визуальных изображений. Конкретное наличие того или иного буфера зависит от конфигурирования системы. На практике используют GL_FRONT и GL_BACK. При этом возможен процесс накапливания значений пикселей изображений и процесс считывания этих данных.
Выбор буфера для записи изображения, например, для работы команды glDrawPixels(), выполняется командой
void glDrawBuffer (GLenum mode)
Параметр mode определяет буфер для записи. Этой командой можно выбрать сразу несколько буферов и записывать изображение сразу в несколько буферов По умолчанию mode равно GL_FRONT для режима с однократной буферизацией и GL_BACK для режима с двойной буферизацией.
Для выбора цветового буфера, который будет служить в качестве источника для чтения пикселей, например, при вызове команд glReadPixels(),
glCopyPixels(), glCopyTexImage*(), существует команда
void glReadBuffer (GLenum mode)
Параметр mode определяет буфер для чтения. Буферы для glReadBuffers() те же самые, что и для команды glDrawBuffers(). По умол-
чанию mode равно GL_FRONT для режима с однократной буферизацией и GL_BACK для режима с двойной буферизацией.
14.3.Буфер аккумулятора
ВOpenGL существует специально отведенный внутренний буфер для временного хранения визуальных изображений. При этом возможен процесс накапливания значений пикселей изображений. Кроме этого, имеется возможность попиксельных операций над этими изображениями. На практике подобные буферы используют для получения эффектов нерезкости, сглаживания, "мягких" теней и т.п.
Операции с буфером накопления осуществляются командой
void glAccum (GLenum op, GLfloat value)
Параметр op задает операцию над пикселями и может принимать следующие значения:
70
Константа |
Операция над пикселями |
GL_LOAD Пиксели берутся из буфера, выбранного на чтение командой glReadBuffer(), их значения умножаются на value и заносятся в буфер-аккумулятор
GL_ ACCUM Аналогично GL_LOAD, только результат не просто записывается в буфер-аккумулятор, а складывается с уже имеющимся в буфере
GL_MULT Пиксели в буфере аккумулятора умножаются на значение переменной value
GL_ ADD Пиксели в буфере аккумулятора складываются со значением переменной value
GL_ RETURN Изображение переносится из буфера аккумулятора в буфер, выбранный для записи. Перед этим значение каждого пикселя умножается на value
Например, чтобы "смазать" изображение, в буфере аккумулятора одна и та же сцена рисуется несколько раз. Каждый раз с немного измененными значениями координат расположения камеры.
Буфер аккумулятор можно "очищать" определенными значениями составляющих цвета R, G, B и A. Для этого используется команда:
void glClearAccum (GLfloat R, GLfloat G, GLfloat B, GLfloat alpha)
14.4. Буфер глубины
Работая с трехмерной графикой, нам приходится постоянно сталкиваться с глубиной сцены. На основании глубины работает алгоритм, использующий Z-буфер, для удаления невидимых граней. Каждое поступающее значение глубины фрагмента сравнивается с уже имеющимся в буфере глубины и выводится на экран (или нет) в зависимости от результатов выполнения этого теста.
По умолчанию тест глубины заблокирован. Для его включения/выключения используется команда glEnable/glDisable с аргументом GL_DEPTH_TEST. Функция сравнения, используемая в тесте глубины, задается командой
void glDepthFunc (GLenum func)
Данная команда определяет функцию сравнения для поступающего z-значения с тем, которое было в буфере глубины. Функция сравнения задается параметром func, которое может принимать следующие символьные значения:
71
Константа |
Тест завершается положительно… |
|
|
GL_NEVER |
Никогда |
|
|
GL_LESS |
Если поступающее z-значение меньше, чем храня- |
|
щееся в буфере глубины |
|
|
GL_EQUAL |
Если поступающее z-значение равно хранящемуся в |
|
буфере глубины |
|
|
GL_LEQUAL |
Если поступающее z-значение меньше или равно, |
|
чем хранящееся в буфере глубины |
|
|
GL_GREATER |
Если поступающее z-значение больше, чем храня- |
|
щееся в буфере глубины |
|
|
GL_NOTEQUEL |
Если поступающее z-значение не равно храняще- |
|
муся в буфере глубины |
|
|
GL_GEQUAL |
Если поступающее z-значение больше или равно, |
|
чем хранящееся в буфере глубины |
|
|
GL_ALWAYS |
Всегда |
|
|
По умолчанию функция сравнения задана как GL_ LESS.
14.5. Буфер изображения
Для копирования цветного изображения из буфера изображения в обычную оперативную память используется команда:
void glReadPixels (GLint x, GLint y,
GLsizei width, GLsizei height,
GLenum format, GLenum type, GLvoid *pixels)
Параметры x и y задают левый нижний угол копируемого изображения, ширина которого width и высота height. Параметром format можно указать, что именно от пикселя необходимо копировать. Для этого предусмотрены следующие символьные константы: GL_RED, GL_GREEN,
GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_COLOR_INDEX,
GL_STENCIL_INDEX, GL_LUMINANCE, GL_DEPTH_COMPONENT
и т.д. (см. MSDN). Параметр type задает тип записываемых значений и может принимать следующие значения: GL_UNSIGNED_BYTE, GL_BYTE,
GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_FLOAT, GL_INT
и GL_UNSIGNED_INT. Место для размещения изображения в оперативной памяти указывается параметром pixels.
Для записи изображения из оперативной памяти в буфер изображения используется команда
void glDrawPixels (GLsizei width, GLsizei height,
GLenum format, GLenum type,GLvoid *pixels)
72
После отработки данной команды изображение должно появиться, начиная с текущей позиции растра. Позицию можно задать, например ко-
мандой glRasterPos().
Для копирования цветного изображения из одного участка буфера в другой участок, минуя оперативную память, используется команда
void glCopyPixels (GLint x, GLint y,
GLsizei width, GLsizei height, GLenum format)
Параметры x и y задают левый нижний угол копируемого изображения, ширина которого width и высота height. Параметром format можно указать, что именно от пикселя необходимо копировать (см. команду glReadPixels()). Позицию для размещения фрагмента изображения можно задать, например командой glRasterPos().
15. ГРУППЫ АТРИБУТОВ
Работая с OpenGL, разработчик вынужден постоянно изменять некоторые параметры примитивов графической библиотеки. Для того чтобы изменение параметров не влияло на состояние других примитивов существуют команды для сохранения и восстановления текущих параметров примитивов.
void glPushAttrib (GLbitfield mask)
void glPopAttrib ()
Первая команда сохраняет в стеке все атрибуты, указанные битами в параметре mask. glPopAttrib() восстанавливает значения тех переменных состояния, которые были сохранены командой glPushAttrib(). Возможные значения параметра mask:
mask |
Сохраняемые атрибуты |
|
|
GL_ACCUM_BUFFER_BIT |
Для буфера накопления (аккумулятора). |
|
Аккумулятор очищается |
|
|
GL_ALL_ATTRIB_BITS |
Все доступные (!) |
|
|
GL_COLOR_BUFFER_BIT |
GL_ALPHA_TEST, GL_DRAW_BUFFER, |
|
GL_BLEND, GL_DITHER, GL_LOGIC_OP |
|
|
GL_CURRENT_BIT |
Текущие значения. Текущий RGBA цвет, |
|
текущий индекс цвета, вектора-нормали, |
|
текущие координаты текстуры, теку- |
|
щая позиция растра, флаг доступно- |
|
сти текущей позиции растра – |
|
GL_CURRENT_RASTER_POSITION_VALID |
|
|
73
|
Продолжение табл. |
|
|
mask |
Сохраняемые атрибуты |
|
|
GL_DEPTH_BUFFER_BIT |
Биты тестирования буфера глубины – |
|
GL_DEPTH_TEST, маска записи глуби- |
|
ны – GL_DEPTH_WRITEMASK, тести- |
|
руемая функция глубины. Буфер глу- |
|
бины очищается |
|
|
GL_ENABLE_BIT |
Все включенные атрибуты |
|
|
GL_EVAL_BIT |
Все вычислители |
|
|
GL_FOG_BIT |
Атрибуты тумана |
|
|
GL_HINT_BIT |
Параметры контролируемых задач |
|
(см. glHint) |
|
|
GL_LIGHTING_BIT |
Атрибуты освещения |
|
|
GL_LINE_BIT |
Атрибуты линии |
|
|
GL_LIST_BIT |
Стартовое смещение имен списков |
|
|
GL_PIXEL_MODE_BIT |
Атрибуты пиксель |
|
|
GL_POINT_BIT |
Атрибуты точки. Флаг |
|
GL_POINT_SMOOTH и размер точки |
|
|
GL_POLYGON_BIT |
Атрибуты полигонов |
|
|
GL_POLYGON_STIPPLE_BIT |
Атрибуты шаблона полигона |
|
|
GL_SCISSOR_BIT |
Атрибуты отсечения. Флаг |
|
GL_SCISSOR_TEST и поле отсечения |
|
|
GL_STENCIL_BUFFER_BIT |
Атрибуты для буфера трафаретов |
|
|
GL_TEXTURE_BIT |
Атрибуты текстуры |
|
|
GL_TRANSFORM_BIT |
Атрибуты преобразований |
|
|
GL_VIEWPORT_BIT |
Атрибуты просмотра |
|
|
Более подробная информация параметров команд сохранения атрибутов находится в справочной системе (MSDN).
Для сохранения нескольких атрибутов необходимо для каждого атрибута выполнить команду сохранения glPushAttrib() (для восстановления атрибутов не забудьте исполнить столько же раз команду glPopAttrib() в обратном порядке).
74
