Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка СМ 2011.doc
Скачиваний:
3
Добавлен:
14.11.2019
Размер:
108.54 Кб
Скачать

Отсечение, прозрачность и смешение цветов

  1. Цель работы

Изучение работы с отсечением, смешением цветов и прозрачностью в OpenGL.

2. Теоретические положения

После того как вершины обработаны и собраны в примитивы, последние поступают на этап растеризации и обработки фрагментов. Растеризация – это процесс, при котором примитивы преобразуются в двумерный образ. Каждая точка этого образа содержит такую информацию, как цвет, глубина и данные текстуры. Все вместе – точка и ассоциированная с ней информация называется фрагментом. Рассмотрим, как обрабатываются фрагменты.

Принадлежность пикселей контексту воспроизведения

Этот тест выполняется без участия пользователя и служит для определения того факта, что пиксели фрагмента принадлежат контексту воспроизведения. В случае положительного результата тестирования фрагмент направляется на следующий тест для проверки. Если результат тестирования отрицательный, то фрагмент отбрасывается. Основное предназначение этого теста заключается в том, чтобы позволить операционной системе отслеживать поведение OpenGL, например, не проводить дальнейшей обработки, если окно OpenGL не видимо в текущий момент времени.

Отсечение

Этот тест позволяет определять, лежит ли фрагмент внутри прямоугольника отсечения, задаваемого командой

Void glScissor(

Glint x,

Glint y,

Glsizei width,

Glsizei heigft)

которая определяет прямоугольник, в оконных координатах, называемый прямоугольником отсечения. Параметры x и y задают левый нижний угол этого прямоугольника, исходное значение (0,0), а width и heigft – его ширину и высоту. Когда контекст воспроизведения OpenGL первый раз присоединяется к этому окну, эти параметры устанавливаются по размеру окна.

Проведение теста отсечения разрешается или блокируется командами glEnable и glDisable с аргументом GL_SCISSOR_TEST. Если проведение этого теста разрешено, то модифицированы командами рисования могут быть только пиксели, которые лежат внутри этого прямоугольника. Координаты окна имеют целочисленные значения, так что вызов glScissor(0, 0, 1, 1) разрешает модифицировать только левый нижний пиксель в окне, а glScissor(0, 0, 0, 0) запрещает изменение всех пикселей. Когда этот тест заблокирован, в прямоугольник отсечения включаются все компоненты окна.

Void glShedeModel(Glenum mode) - параметр mode определяет символическое значение, представляющее способ закрашивания. Доступны значения GL_FLAT и GL_SMOOTH.

Примитивы OpenGL могут быть закрашены двумя способами: однотонным и с плавным переходом цветов. Закрашивание с плавным переходом цветов (установлено по умолчанию) заставляет библиотеку рассчитывать цвета вершин, интерполируя их в зависимости от результатов растеризации, присваивая, обычно, различные цвета каждому результирующему фрагменту. При однотонном закрашивании используется цвет одной вершины, который присваивается всем фрагментам, сформированным растеризацией единственного примитива. Оба типа закрашивания неразличимы для точек.

Цвет примитива при однотонном закрашивании определяет единственная вершина. Будем считать, что нумерация вершин начинается с единицы. Для линии цвет каждого i-го отрезка распределяется до i+1-го. Для многоугольников цвет закрашивания определяется цветом вершины в соответствии с таблицей.

К дальнейшей обработке допускаются только те фрагменты, для которых результат теста положительный. По умолчанию это тест заблокирован.

Тип многоугольного примитива

Номер вершины

Многоугольник

1 - всегда

Треугольники, имеющие общую грань

i+2

Связанные треугольники

i+2

Независимые треугольники

3i

Связанные четырехугольники

2i+2

Независимые четырехугольники

4i

Прозрачность

Рассматриваемый тест действует только в режиме RGBA, то есть при явном указании значений компонентов цвета. В режиме индексации цвета считается, что фрагмент успешно прошел этот тест. Необходимо сказать о четвертом параметре цвета – альфа или прозрачность. Этот компонент определяет степень прозрачности фрагмента: значение альфа, равное 0.0, подразумевает полную прозрачность, а значение 1.0 – полную непрозрачность соответствующего элемента.

Выполняется этот тест или нет, определяется командами glEnable и glDisable с аргументом GL_ALPHA_TEST. Если тест не выполняется, то считается, что он прошел успешно. Управляется этот тест командой:

Void glAlphaFunc(

Glenum func,

Glclampf ref)

где параметр ref задает значение ссылки, с которым сравнивается поступающее значение альфа. Это значение приводится к диапазону [0, 1]: 0 – представляет самое маленькое, а 1 – самое большое возможное значение. По умолчанию ссылка равна 0. Параметр func задает функцию сравнения значений альфа. Допустимы следующие символические константы:

GL_NEVER – никогда,

GL_LESS – если поступающее значение меньше, чем ссылочное,

GL_EQUAL – если поступающее значение равно ссылочному,

GL_LEQUAL - поступающее значение меньше или равно ссылочному,

GL_GREATER - поступающее значение больше, чем ссылочное,

GL_NOTEQUAL - поступающее значение не равно ссылочному,

GL_GEQUAL - поступающее значение больше или равно ссылочному,

GL_ALWAYS – всегда, установлена по умолчанию.

Альфа-тест обрабатывает фрагменты в зависимости от результата сравнения между поступающим значением альфа фрагмента и постоянным значением ссылки. Эта команда определяет ссылку и функцию сравнения. Если результат сравнения положительный – поступающий фрагмент рисуется (в зависимости от условий следующих тестов – трафарета и буфера глубины). Если результат отрицательный, то в буфер кадра на месте расположения пикселя не происходит никаких изменений. Команда действует на все записываемые пиксели, включая те, которые получаются в результате сканирования точек, линий, многоугольников и битовых массивов, а также операций рисования и копирования пикселей, и не влияет на операции по очистке экрана.

Смешение цветов

При смешении цветов поступающие значения красного, зеленого, синего и альфа компонентов цвета комбинируются с соответствующими значениями, хранящимися в буфере кадра. Причем результат смешения зависит только от значений прозрачности, а то, каким образом цвета комбинируются, задается командой

Void glBlendFunc(

Glenum sfactor,

Glenum dfactor)

Эта команда задает метод, используемый при смешении поступающих (источник) значений RGBA с уже хранящимися в буфере кадра (приемник). Параметр sfactor определяет способ расчета красного, зеленого, синего и альфа компонентов источника смешения и может принимать одно из девяти значений, заданных символическими константами: GL_ZERO, GL_ONE,GL_SRC_ALPHA, GL_DST_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR,

GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA,

GL_SRC_ALPHA_SATURATE. Аналогично для параметров буфера кадра. Для него допустимы восемь различных значений: GL_ZERO, GL_ONE,

GL_SRC_COLOR, GL_SRC_ALPHA, GL_DST_ALPHA,

GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA,

GL_ONE_MINUS_DST_ALPHA.

Прозрачность лучше реализовывать , используя команду

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) с примитивами, отсортированными по глубине от наиболее к наименее отдаленным. Такой способ расчета прозрачности не требует наличия битовых плоскостей альфа в буфере кадра. Такой же вызов команды можно использовать при устранении ступенчатости точек и линий. Чтобы оптимизировать устранение ступенчатости многоугольников, используют команду

glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE), отсортировав их предварительно от наиболее близкого до наиболее удаленного. Результат храниться в битовых плоскостях альфа приемника, которые должны быть представлены для этой команды смешения, чтобы получить корректный результат.

Если для рисования доступен более чем один буфер цвета, в каждом из них смешение осуществляется раздельно. По умолчанию смешение заблокировано. Для его включения и выключения используют команды glEnable и glDisable с аргументом GL_BLEND.

3. Задание на работу

Построить заданные примитивы.

Написать программу, выполняющую смешение цветов.

Написать программу, позволяющую вырезать в окружности прямоугольное окно, чтобы открыть доступ к находящемуся за ней изображению..

4. Порядок выполнения работы

4.1. Ознакомиться с теоретическими положениями,

4.2. Выполнить предложенный вариант задания.

5. Оформление отчета

Отчет должен содержать: цель работы, задание на работу, результаты работы.

Лабораторная работа № 4.