Главная страница
Навигация по странице:

  • GL_SRC_ALPHA

  • GL MULT

  • (enum

  • GL NEVER

  • GLLESS, GLLEQUAL, GLEQUAL

  • Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


    Скачать 0.66 Mb.
    НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
    Дата21.10.2022
    Размер0.66 Mb.
    Формат файлаdocx
    Имя файла221937-83556.docx
    ТипРуководство
    #747097
    страница12 из 30
    1   ...   8   9   10   11   12   13   14   15   ...   30

    90

    Глава 7. Операции с пикселями

    буфер маски.

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

    1   ...   8   9   10   11   12   13   14   15   ...   30


    написать администратору сайта