Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

722

.pdf
Скачиваний:
5
Добавлен:
15.11.2022
Размер:
450.3 Кб
Скачать

помощи поразрядной операции ИЛИ следующих значений:

----------------------------------------------------------------

Параметр mask Очищаемый буфер

----------------------------------------------------------------

GL_COLOR_BUFFER_BIT

Буферы, доступные для записи цвета

GL_DEPTH_BUFFER_BIT

Буфер глубины

GL_ACCUM_BUFFER_BIT

Буфер аккумулятора

GL_STENCIL_BUFFER_BIT

Буфер трафарета

Эта команда устанавливает битовые плоскости области окна в значения, предварительно определенные функциями glClearColor, glClearIndex, glClearDepth, glClearStencil и glClearAccum. Одновременно можно очистить несколько буферов цветов, предварительно выбрав их при помощи функции glDrawBuffer.

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

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

void

glСоlог[3

4][b

s

i

f

d] (GLtype

components)

void

glСоlог[3

4][b

s

i

f

d]v(GLtype

components)

которые устанавливают новое четырехкомпонентное значение цвета. Они представлены в двух основных вариантах: glColor3 и glColor4 Во втором варианте явным образом задаются все четыре составляющие цвета, а в варианте трех аргументов устанавливаются красный, зеленый и синий компоненты цвета. Параметр альфа, который определяет "степень прозрачности" цвета, устанавливается в 1.0. Независимо от типа задаваемых параметров в OpenGL все они хранятся в формате с плавающей точкой и ограничены диапазоном [0.0, 1.0]. При целочисленных значениях аргументов происходит линейное отображение в указанный диапазон. Однако следует иметь в виду, что отображение в указанный диапазон осуществляется только непосредственно перед записью в буфер цвета а все промежуточные вычисления производятся во входном формате.

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

Теперь - непосредственно рисование. Для этого мы вызываем свою функцию DrawScene.

Библиотека OpenGL реализована по модели клиент-сервер, приложение выступает в роли клиента - вырабатывает команды, а OpenGL (сервер) интерпретирует и обрабатывает их. При этом сервер может располагаться как на том же компьютере, что и клиент, так и на другом. Сервер может поддерживать несколько контекстов OpenGL, каждый из которых инкапсулирует состояние OpenGL. Клиент может подключиться к любому из них. По этой причине желательно гарантировать, что выполнение всех вызванных команд завершится либо за определенное, либо за конечное время. Для обеспечения этого в OpenGL реализованы две команды:

void glFinish()

блокирует дальнейшее выполнение программы, пока не будут завершены все вызванные перед ней команды OpenGL, включая изменения сос-

тояния и содержимого буфера кадра.

void glFlush()

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

Если при установке формата пикселей был определен флаг PFD_DOUBLEBUFFER, для paботы в режиме двойной буферизации, необходимо обеспечить перезапись содержимого экранного буфера в основной. Сделать это можно при помощи команды

BOOL SwapBuffer(HDC hdc)

Параметр hdc определяет дескриптор контекста устройства.

OpenGL поддерживает режим устранения ступенчатости для всех своих примитивов, в том числе и для точек. Включение этого режима осуществляется универсальной командой glEnable, а выключение - командой glDisable, вызываемыми с аргументом GL_PОINT_SMOOTH.

С помощью этих двух команд осуществляется управление всеми возможными эффектами.

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

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

ПРИНАДЛЕЖНОСТЬ ПИКСЕЛОВ КОНТЕКСТУ ВОСПРОИЗВЕДЕНИЯ

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

ОТСЕЧЕНИЕ

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

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height)

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

51

дения OpenGL первый раз присоединяется к окну, эти параметры устанавливаются по размерам окна.

Проведение теста отсечения разрешается или блокируется ко-

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

ПРОЗРАЧНОСТЬ

В OpenGL цвет можно задавать двумя способами: при помощи тройки (четверки) - красный, зеленый, синий (и альфа), или посредством указания индекса в соответствующей палитре. Такое вступление здесь необходимо, потому что рассматриваемый тест действует только в режиме 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

Всегда. Установлена по умолчанию

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

буфере кадра на месте расположения пикселя не происходит никаких изменений.

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

Обычно прозрачность используется для управления смешением цветов.

СМЕШЕНИЕ ЦВЕТОВ

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

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_MI-

NUS_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.

ТРАФАРЕТ

Наложение трафарета, подобно z-буферизации, разрешает или блокирует рисование на пиксельном уровне. При этом рисование осуществляется в плоскости трафарета, для чего применяются примитивы, после чего воспроизведение образов осуществляется с использованием буфера трафарета, чтобы замаскировать часть экрана. Наложение трафарета обычно используется для реализации cпецэффектов, таких как отбеливание, оконтуривание и др.

Тест трафарета позволяет отбросить фрагмент, базируясь на результатах сравнения значения в буфере трафарета с задаваемым ссылочным значением. Как обычно, выполнение теста разрешается и блокируется командами glEnable/glDisable с аргументом GL_STENCIL_TEST. Для проведения этого тестирования в OpenGL предусмотрены две команды, одна из которых отвечает за сравнение - glStencilFunc, а вторая определяет действия, осуществляемые в результа-

те проверки - glStencilOp.

void glStencilFunc(

GLenum func,

// Функция сравнения

Glint ref,

// Значение ссылки для тестирования

GLuint mask

// Маска

)

 

52

-----------------------------------------------------------------

Константа Тест завершается положительно...

-----------------------------------------------------------------

GL_NEVER

Никогда

GL_LESS

Если (ref & mask) < (stencil & mask)

GL_EQUAL

Если (геf & mask) = (stencil & mask)

GL_LEQUAL

Если (геf & mask) <= (stencil & mask)

GL_GREATER

Если {ref & mask) > (stencil & mask)

GL_NOTEQUAL

Если (ref & mask) != (stencil & mask)

GL_GEQUAL

Если (ref & mask) >= (stencil & mask)

GL_ALWAYS

Всегда

Параметр ref задает значение ссылки для тестирования трафарета и может принимать любые значения из диапазона [0, 2^n - 1], где n - число битовых плоскостей в соответствующем буфере. Параметр mask задает маску, которая поразрядно умножается (логическое И) на значение ссылки и на хранящееся значение трафарета.

Изначально тест трафарета заблокирован. Если буфера трафарета нет, то модификация трафарета не может произойти и это трактуется как положительный результат теста трафарета.

void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass);

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

Параметр fail задает действие, которое будет выполняться, если тест трафарета дал отрицательный результат. Два других параметра определяют действия, которые будут предприняты в случае положительного результата выполнения теста трафарета: zfail - в случае отрицательного, и zpass - в случае положительного завершения теста глубины.

При успешном завершении теста трафарета фрагмент направляется на следующую проверку.

ГЛУБИНА

Глубина, или координата z - основной параметр для получения трехмерных изображений. Дополнительную информацию о глубине можно получить путем отсечения по оси z. Воспроизводимый объект пересекается плоскостью, отсекающей его удаленную часть. Если при этом динамически изменять положение задней отсекающей плоскости, то можно получить больше информации о глубине.

Исходно тест заблокирован, как и все остальные, и "включается/выключается" знакомыми командами glEnable/glDisable с аргументом GL_DEPTH_TEST. Функция сравнения, используемая в тесте, задается командой

void glDepthFunc(GLenum func)

Вызов этой команды позволяет определить ту функцию, которая будет использоваться для сравнения каждого поступающего z-значения с тем, которое хранится в буфере глубины. Функцию, используемую для сравнения глубин, определяет параметр func. По умолчанию используется константа GL_LESS. Если буфера глубины нет, то считается,

что тест всегда завершается положительно.

ТУМАН

Наложение тумана - это один из способов визуализации глубины изображения.

Аргумент GL_FOG команд glEnable/glDisable используется для включения и отключения этого режима. Этот этап обработки идет вслед за наложением текстуры на объект.

Цвет фрагмента смешивается с цветом тумана (fog), с использованием специального коэффициента f, который определяет способ учета расстояния от объекта до наблюдателя (экспоненциальный, квадратичный экспоненциальный и линейный). Параметры тумана задаются командой

void glFog[f i][v]( GLenum pname, GLfloat param[s])

pname определяет либо единственное значение параметра тумана, либо указатель на массив значений(я). Допускается использование следующих символических констант:

-----------------------------------------------------------------

Константа Примечание

-----------------------------------------------------------------

GL_FOG_MODE

Параметр

param

-

единственное

целое

или

 

вещественное значение,

определяющее уравне-

 

ние, которое будет использоваться при расче-

 

те коэффициента нечеткости изображения.

До-

 

пустимы три символические константы: GL_LI-

 

NEAR,

GL_EXP и GL_EXP2.

По умолчанию уста-

 

новлен режим GL_EXP

 

 

 

 

GL_FOG_DENSITY

Параметр

param - единственное

целое

или

 

вещественное значение,

которое

определяет

 

плотность тумана. Это значение используется

 

в обоих экспоненциальных уравнениях и

может

 

быть

только неотрицательным.

По умолчанию

 

1.0

 

 

 

 

 

 

 

GL_FOG_START

Параметр

param -

единственное

целое

или

 

вещественное значение,

которое

определяет

 

"начало" - ближнее расстояние,

используемое

 

в линейном уравнении - s. По умолчанию 0.0

GL_FOG_END

Параметр

раram

-

единственное целое

или

 

вещественное значение,

которое

определяет

 

"конец" - дальнее расстояние, используемое в

 

линейном уравнении. По умолчанию 1.0

 

GL_FOG_INDEX

Параметр

раram

-

единственное целое

или

 

вещественное значение,

которое

определяет

 

индекс цвета тумана. По умолчанию 0.0

 

Для векторной версии команды можно использовать также значение

GL_FOG_COLOR Параметр params содержит четыре целых или вещественных значения, которые определяют цвет тумана. Целые значения предварительно линейно приводятся к диапазону [-1.0, 1.0] таким образом, что наибольшее положительное значение отображается в 1.0, а наибольшее отрицательное - в

53

-1.0. После преобразования все компоненты цвета приводятся к диапазону [0, 1]. По умолчанию цвет тумана установлен в (0, 0, 0, 0)

Параметр param задает единственное, а params несколько значений, которые должны быть установлены для pname. Для GL_FOG_COLOR требуется массив из четырех значений, а для всех остальных массив содержит единственное значение.

54

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]