Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OpenGL. Компьютерная графика. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
863 Кб
Скачать

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