Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
90• буфер маски. Группа буферов цвета включает буфер кадра, но таких буферов может быть несколько. При использовании двойной буферизации говорят о рабочем (front) и фоновом (back) буферах. Как правило, в фоновом буфере программа создает изображение, которое затем разом копируется в рабочий буфер. На экране может появиться информация только из буферов цвета. Буфер глубины используется для удаления невидимых поверхностей и прямая работа с ним требуется крайне редко. Буфер-накопитель можно применять для различных операций. Более подробно работа с ним описана в разделе 7.2. Буфер маски используется для формирования пиксельных масок (трафаретов), служащих для вырезания из общего массива тех пикселей, которые следует вывести на экран. Буфер маски и работа с ним более подробно рассмотрены в разделах 7.3, 8.2 и 8.3. 7.1. Смешивание изображений и прозрачность Разнообразные прозрачные объекты — стекла, прозрачная посуда и т.д. часто встречаются в реальности, поэтому важно уметь создавать такие объекты в интерактивной графике. OpenGL предоставляет программисту механизм работы с полупрозрачными объектами, который и будет кратко описан в этом разделе. Прозрачность реализуется с помощью специального режима смешивания цветов (blending). Алгоритм смешивания комбинирует цвета так называемых входящих пикселей (т.е. «кандидатов» на помещение в буфер кадра) с цветами соответствующих пикселей, уже хранящихся в буфере. Для смешивания используется четвертая компонента цвета — альфа-компонента, 7.1. Смешивание изображений и прозрачность 91 поэтому этот режим называют еще альфа-смешиванием. Программа может управлять интенсивностью альфа-компоненты точно так же, как и интенсивностью основных цветов, т.е. задавать значение интенсивности для каждого пикселя или каждой вершины примитива. Режим включается с помощью команды glEnable(GL_BLEND). Определить параметры смешивания можно с помощью команды: void glBlendFunc (enum src ,enum dst) Параметр src определяет как получить коэффициент к\ исходного цвета пикселя, a dst задает способ получения коэффициента &2 для цвета в буфере кадра. Для получения результирующего цвета используется следующая формула: res = csrc * к\ + Cdst * &2, где csrc — цвет исходного пикселя, Cdst — цвет пикселя в буфере кадра (res, к\, к\, csrc, Cdst четырехкомпонентные RGB А-векторы). Приведем наиболее часто используемые значения агрументов src и dst. GL_SRC_ALPHA к = (AS,AS,AS,AS) GLSRCONEMINUSALPHA к = (1,1,1,1) — (As, As, As, As) GL_DST_COLOR k = (Rd,Gd,Bd) GLONEMINUSDSTCOLOR к = (1,1,1,1)-(Rd,Gd,Bd,d) GL_DST_ALPHA к = (Ad, A-d,A-d, Ad) GLDSTONEMINUSALPHA к = (1,1,1,1)-(Aa, Aa, Aa, Aa) 92 Глава 7. Операции с пикселями GL_SRC_COLOR k = (Rs,Gs,Bs) GLONEMINUSSRCCOLOR к = (1,1,1,1)-(R8,G8,B8,A8) Пример: предположим, мы хотим реализовать вывод прозрачных объектов. Коэффициент прозрачности задается альфа-компонентой цвета. Пусть 1 — непрозрачный объект; 0 — абсолютно прозрачный, т.е. невидимый. Для реализации служит следующий код: glEnable (GL_BLEND) ; glBlendFunc (GL_SRC_ALPHA, GL_ONE_MNUS_SRC_ALPHA); Например, полупрозрачный треугольник можно задать следующим образом: glColor3f(1.0, 0.0, 0.0, 0.5); glBegin (GLJTRIANGLES); glVertex3f (0.0 , 0.0, 0.0); glVertex3f (1.0 , 0.0, 0.0); glVertex3f (1.0 , 1.0, 0.0); glEnd(); Если в сцене есть несколько прозрачных объектов, которые могут перекрывать друг друга, корректный вывод можно гарантировать только в случае выполнения следующих условий: все прозрачные объекты выводятся после непрозрачных; при выводе объекты с прозрачностью должны быть упорядочены по уменьшению глубины, т.е. выводиться, начиная с наиболее отдаленных от наблюдателя. В OpenGL команды обрабатываются в порядке их поступления, поэтому для реализации перечисленных требований достаточно расставить в соответствующем порядке вызовы команд glVertex, но и это в общем случае нетривиально. 7.2. Буфер-накопитель 93 7.2. Буфер-накопитель Буфер-накопитель (accumulation buffer) —это один из дополнительных буферов OpenGL. В нем можно сохранять визуализированное изображение, применяя при этом попиксельно специальные операции. Буфер-накопитель широко используется для создания различных спецэффектов. Изображение берется из буфера, выбранного на чтение командой void glReadBuffer (enum buf) Аргумент buf определяет буфер для чтения. Значения buf, равные GL_BACK, GL_FRONT, определяют соответствующие буферы цвета для чтения. GL_BACK задает в качестве источника пикселей внеэкранный буфер; GL_FRONT — текущее содержимое окна вывода. Команда имеет значение, если используется дублирующая буферизация. В противном случае используется только один буфер, соответствующий окну вывода (строго говоря, OpenGL имеет набор дополнительных буферов, используемых, в частности, для работы со стереоизображениями, но здесь мы их рассматривать не будем). Буфер-накопитель является дополнительным буфером цвета. Он не используется непосредственно для вывода образов, но они добавляются в него после вывода в один из буферов цвета. Применяя различные операции, описанные ниже, можно понемногу «накапливать» изображение в буфере. Затем полученное изображение переносится из буфера-накопителя в один из буферов цвета, выбранный на запись командой void glDrawBuffer (enum buf) Значение buf аналогично значению соответствующего аргумента в команде glReadBuffer. Все операции с буфером-накопителем контролируются командой 94 Глава 7. Операции с пикселями void glAccum (enum op,GLfloat value) Аргумент op задает операцию над пикселями и может принимать следующие значения: GL LOAD —пиксель берется из буфера, выбранного на чтение, его значение умножается на value и заносится в буфер-накопитель; GL AC CUM —аналогично предыдущему, но полученное после умножения значение складывается с уже имеющимся в буфере; GL MULT —эта операция умножает значение каждого пикселя в буфере накопления на value; GL ADD — аналогично предыдущему, только вместо умножения используется сложение; GL_RETURN —Изображение переносится из буфера накопителя в буфер, выбранный для записи. Перед этим значение каждого пикселя умножается на value. Следует отметить, что для использования буфера-накопителя нет необходимости вызывать какие-либо команды glEnable. Достаточно инициализировать только сам буфер. Пример использования буфера-накопителя для устранения погрешностей растеризации (ступенчатости) приведен в разделе 8.1. 7.3. Буфер маски При выводе пикселей в буфер кадра иногда возникает необходимость выводить не все пиксели, а только некоторое подмножество, т.е. наложить трафарет (маску) на изображение. Для этого OpenGL предоставляет так называемый буфер маски (stencil 7.3. Буфер маски 95 buffer). Кроме наложения маски, этот буфер предоставляет еще несколько интересных возможностей. Прежде чем поместить пиксель в буфер кадра, механизм визуализации OpenGL позволяет выполнить сравнение (тест) между заданным значением и значением в буфере маски. Если тест проходит, пиксель рисуется в буфере кадра. Механизм сравнения весьма гибок и контролируется следующими командами: void glStencilFunc (enum func , int ref , uint mask) void glStencilOp (enum sfail , enum dpfail , enum dppass) Аргумент ref команды glStencilFunc задает значение для сравнения. Он должен принимать значение от 0 до 2s — 1, где s — число бит на точку в буфере маски. С помощью аргумента func задается функция сравнения. Он может принимать следующие значения: GL NEVER —тест никогда не проходит, т.е. всегда возвращает false; GL_ALWAYS — тест проходит всегда; GLLESS, GLLEQUAL, GLEQUAL GLGEQUAL, GLGREATE, GLNOTEQUAL -тест проходит в случае, если ref соответственно меньше значения в буфере маски, меньше либо равен, равен, больше, больше либо равен, или не равен. Аргумент mask задает маску для значений. Т.е. в итоге для этого теста получаем следующую формулу: ((ref AND mask) op (svaluc AND mask)). Команда glStencilOp предназначена для определения действий над пикселем буфера маски в случае положительного или отрицательного результата теста. |