Главная » Просмотр файлов » Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)

Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366), страница 10

Файл №1124366 Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)) 10 страницаЮ.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366) страница 102019-05-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 10)

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

96

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

Аргумент sfail задает действие в случае отрицательного ре­зультата теста, и может принимать следующие значения:

GLKEEP, GLZERO, GLREPLACE, GLINCR

GL_DECR, GL_INVERT —соответственно сохраняет зна­чение в буфере маски, обнуляет его, заменяет на заданное значение (ref), увеличивает, уменьшает или побитово ин­вертирует.

Аргументы dpfail определяют действия в случае отрицатель­ного результата теста на глубину в z-буфере, a dppass задает действие в случае положительного результата этого теста. Ар­гументы принимают те же значения, что и аргумент sfail. По умолчанию все три параметра установлены на GL_KEEP.

Для включения маскирования необходимо выполнить коман­ду glEnable(GL_STENCIL_TEST);

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

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

7.4. Управление растеризацией

Способ выполнения растеризации примитивов можно частич­но регулировать командой glffint (target, mode), где target —вид контролируемых действий, принимающий одно из следующих значений:

GL FOG HINT —точность вычислений при наложении ту­мана. Вычисления могут выполняться по пикселям (наи­большая точность) или только в вершинах. Если реализа­ция OpenGL не поддерживает попиксельного вычисления, то выполняется только вычисление по вершинам;

7.4- Управление растеризацией 97

GL_LINE_SMOOTH_HINT —управление качеством пря­мых. При значении mode, равным GL_NICEST, уменьша­ется ступенчатость прямых за счет большего числа пиксе­лей в прямых;

GLPERSPECTIVECORRECTIONHINT - точность интерполяции координат при вычислении цветов и наложе­нии текстуры. Если реализация OpenGL не поддерживает режим GL_NICEST, то осуществляется линейная интер­поляция координат;

GL_POINT_SMOOTH_HINT — управление качеством то­чек. При значении параметра mode, равном GL_NICEST, точки рисуются как окружности;

GLPOLYGONSMOOTHHINT -управление каче­ством вывода сторон многоугольника.

Параметр mode интерпретируется следующим образом:

GL FASTEST —используется наиболее быстрый алгоритм;

GL NICEST —используется алгоритм, обеспечивающий луч­шее качество;

GL_DONT_CARE —выбор алгоритма зависит от реализа­ции.

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

Обратите внимание, что glffintQ нельзя вызывать между опе­раторными скобками glBeginQ/glEndQ.

98

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

7.5. Контрольные вопросы

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

  2. Для чего используется команда glBlendFunc?

  3. Почему для корректного вывода прозрачных объектов тре­буется соблюдение условий упорядоченного вывода прими­тивов с прозрачностью?

  4. Для чего используется буфер-накопитель? Приведите при­мер работы с ним.

  5. Как в OpenGL можно наложить маску на результирующее изображение?

  6. Объясните, для чего применятся команда glffintQ.

  7. Каков эффект выполнения команды glffint(GL_FOG_HINT, GL_DONT_CARE)?

Часть II

Приемы работы с OpenGL

99

Глава 8.

Графические алгоритмы на основе OpenGL

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

8.1. Устранение ступенчатости

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

Для каждого кадра необходимо нарисовать сцену несколько

101

102 Глава 8. Графические алгоритмы на основе OFENGL

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

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

Все полученные изображения сохраняем в буфере-накопите­ле с коэффициентом 1/п, где п — число проходов для каждого кадра. Чем больше таких проходов — тем ниже производитель­ность, но лучше результат.

for (i =0;i<samples_count;++i)

// обычно samples_count .лежит в пределах от 5 до 10

{

ShiftCamera (i ); // сдвигаем камеру

RenderScene();

if (i==0) // на первой итерации загружаем изображение glAccum (GL_LOAD, 1 / ( float) samples_count ) ;

else // добавляем к уже существующему glAccum (GL_ACCUM, 1 / ( float) samples_count ) ;

}

// Пишем то, что получилось , назад в исходный буфер

glAccum (GL_RETURN, 1.0);

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

8.2. Построение теней

103

8.2. Построение теней

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

Большинство алгоритмов, предназначенных для построения теней, используют модифицированные принципы перспективной проекции. Здесь рассматривается один из самых простых мето­дов. С его помощью можно получать тени, отбрасываемые трех­мерным объектом на плоскость.

Общий подход таков: для всех точек объекта находится их проекция параллельно вектору, соединяющему данную точку и точку, в которой находится источник света, на некую заданную плоскость. Тем самым получаем новый объект, целиком лежа­щий в заданной плоскости. Этот объект и является тенью исход­ного.

Рассмотрим математические основы данного метода.

Пусть:

Р —точка в трехмерном пространстве, которая отбрасывает тень.

L — положение источника света, который освещает данную точ­ку-

S = a(L — Р) — Р — точка, в которую отбрасывает тень точка Р, где а —параметр.

Предположим, что тень падает на плоскость z = 0. В этом случае а = zp/(zi — zp). Следовательно,

104 Глава 8. Графические алгоритмы па основе OFENGL

Vs

Zs =


= {XpZl

= iVpZi

zizp)/{zi yiZp)/{zi 0

zP) zP)

Введем однородные координаты:

xs

Vs =

Zs =

w' =

xslws

y's/w's 0

zi - zp

Отсюда координаты S могут быть получены с использовани­ем умножения матриц следующим образом:

I X в

V's

0 w's) = (xs Уз Zs l)

(Zl

0

0 0

zi 0

0

-Xl

Vo

-yi о

0 0

1

Для того, чтобы алгоритм мог рассчитывать тень, падающую на произвольную плоскость, рассмотрим произвольную точку на линии между S и Р, представленную в однородных координатах:

аР + ЬЬ, где а и Ъ — скалярные параметры.

Следующая матрица задает плоскость через координаты ее нормали:

(хп\

G =


Уп

Zn

W

Точка, в которой луч, проведенный от источника света через данную точку Р, пересекает плоскость G, определяется парамет­рами а и Ь, удовлетворяющими следующему уравнению:

8.2. Построение теней

105

{аР + bL)G = 0

Отсюда получаем: a(PG) + b(LG) = 0. Этому уравнению удо­влетворяют

a = (LG),b = -(PG)

Следовательно, координаты искомой точки S = (LG)P — (PG)L. Пользуясь ассоциативностью матричного произведения, получим

S = P[(LG)I-GL] (8.1)

где / — единичная матрица.

Матрица (LG)I — GL используется для получения теней на произвольной плоскости.

Рассмотрим некоторые аспекты практической реализации данного метода с помощью OpenGL.

Предположим, что матрица floorShadow была ранее получена нами из формулы (LG)I — GL. Следующий код с ее помощью строит тени для заданной плоскости:

/* Визуализируем сцену в обычном режиме. */ RenderGeometry () ;

Характеристики

Тип файла
Документ
Размер
3,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6430
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее