Комбинирование компонентов освещения — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Комбинирование компонентов освещения

2022-10-29 28
Комбинирование компонентов освещения 0.00 из 5.00 0 оценок
Заказать работу

 

                                          Теперь мы можем сложить три компонента освещения – диффузный, зеркальный и фоновый, чтобы получить суммарное количество света I, которое попадает в глаз из точки P, а именно:

 

                                            (8.5)

где введены величины:

                                                           (8.6)  

                                              

Величина I зависит от различных интенсивностей источников и коэффициентов отражения объекта, а также от соотношения положений точки P, глаза и точечного источника света. Здесь интенсивности диффузного  и зеркального  компонентов обозначены различными буквами, поскольку в Open GL представляется возможность задавать их раздельно, как мы увидим позднее. На практике обе эти интенсивности обычно имеют одну и ту же величину.

                                          Рассмотрим несколько подробнее изменение интенсивности I в зависимости от положения точки P, для чего снова вернемся к рис. 8.12. Интенсивность I вычисляется для различных точек P рассматриваемой микрограни. Фоновый компонент не претерпевает никаких изменений в пределах микрограни; вектор m одинаков для всех точек P микрограни, но направления векторов s и v зависят от P. (Пусть, например, s =S-P, где S - расположение источника света. Как значение вектора v зависит от точки P и глаза?). Если источник света достаточно удален (это типичный случай), то вектор s при изменении точки P меняется незначительно; так что и диффузный компонент также будет незначительно изменяться для различных точек P. Это особенно верно, когда векторы s и m почти параллельны, так как для малых углов косинус изменяется медленно. Для удаленных источников света изменение направления промежуточного вектора h также слабо зависит от изменения точки P. С другой стороны, если источник света расположен близко к микрограни, то по мере изменения точки P векторы s и h могут сильно изменяться. В этом случае зеркальный компонент может сильно изменяться в пределах микрограни, поэтому яркий блик может быть локализован в ее малой области. Этот эффект усиливается, когда глаз также расположен близко к микрограни, вызывая сильные изменения в направлении v, и когда показатель степени очень f велик.

                                              

 

ДОБАВЛЕНИЕ ЦВЕТА

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

                                          В главе 12 содержится более детальное рассмотрение природы цвета, однако, как мы уже видели ранее, свет любого цвета может быть синтезирован путем сложения определенных количеств красного, зеленого и синего цветов. При работе с цветными источниками и цветными поверхностями мы вычисляем каждый компонент цвета отдельно и затем просто складываем их, чтобы окончательный цвет отраженного света. Тогда для вычисления красного, зеленого и синего компонентов отраженного света необходимо трижды применить уравнение (8.5):

 

                                               (8.7)

                       

 

(Величины lambert и phong заданы уравнением (8.6).)

Отметим, что мы предполагаем наличие у источника света трех <<типов>> цвета:

 

                                          ambient=()(фоновый),

                                          diffuse=()(диффузный),

                                          specular=()(зеркальный).

 

Обычно цвета диффузного и зеркального освещения одинаковы. Кроме того, отметим, что переменные lambert и phong не зависит от того, компонент какого цвета вычисляется, так что их нужно вычислить один раз. Развивая этот подход, следует определить девять коэффициентов отражения:

                                          ambieht reflection coefficients:  (коэффициенты фонового отражения);

                                          diffuse reflection coefficients: (коэффициенты диффузного отражения);

                                          specular reflection coefficients: (коэффициенты диффузного отражения).

 

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

 

 

21 Алгоритм Коэна — Сазерленда (англ. Cohen-Sutherland) — алгоритм отсечения отрезков, то есть алгоритм, позволяющий определить часть отрезка, которая пересекает прямоугольник. Был разработан Дэном Коэном и Айвеном Сазерлендом в Гарварде в 1966—1968 гг., и опубликован на конференции AFIPS в 1968.[1][2]

Содержание [убрать]
  • 1 Описание алгоритма
  • 2 Пример реализации
  • 3 Примечания
  • 4 См. также

[править] Описание алгоритма

Алгоритм разделяет плоскость на 9 частей прямыми, которые образуют стороны прямоугольника. Каждой из 9 частей присваивается четырёхбитный код. Биты (от младшего до старшего) значат «левее», «правее», «ниже», «выше». Иными словами, у тех трёх частей плоскости, которые слева от прямоугольника, младший бит равен 1, и так далее.

Алгоритм определяет код конечных точек отрезка. Если оба кода равны нулю, то отрезок полностью находится в прямоугольнике. Если битовое И кодов не равно нулю, то отрезок не пересекает прямоугольник (т.к. это значит, что обе конечные точки отрезка находятся с одной стороны прямоугольника). В прочих случаях, алгоритм выбирает конечную точку, находящуюся вне прямоугольника, находит ближайшую к ней точку пересечения отрезка с одной из линий, образующей стороны прямоугольника, и использует эту точку пересечения как новую конечную точку отрезка. Укороченный отрезок снова пропускается через алгоритм.

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

….

 

Алгоритмы взяты из прекрасной книги
П.В.Вельтмандер "Машинная графика"

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

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

Программное исполнение отсечения достаточно медленный процесс, поэтому, естественно, в мощные дисплеи встраивается соответствующая аппаратура. Первое сообщение об аппаратуре отсечения, использующей алгоритм отсечения делением отрезка пополам и реализованной в устройстве Clipping Divider, появилось в 1968 г. [38]. Этот алгоритм был рассмотрен при изучении технических средств. Здесь мы рассмотрим программные реализации алгоритма отсечения.

Отсекаемые отрезки могут быть трех классов - целиком видимые, целиком невидимые и пересекающие окно. Очевидно, что целесообразно возможно более рано, без выполнения большого объема вычислений принять решение об видимости целиком или отбрасывании. По способу выбора простого решения об отбрасывании невидимого отрезка целиком или принятия его существует два основных типа алгоритмов отсечения - алгоритмы, использующие кодирование концов отрезка или всего отрезка и алгоритмы, использующие параметрическое представление отсекаемых отрезков и окна отсечения. Представители первого типа алгоритмов - алгоритм Коэна-Сазерленда (Cohen-Sutherland, CS-алгоритм) [4] и FC-алгоритм (Fast Clipping - алгоритм) [37]. Представители алгоритмов второго типа - алгоритм Кируса-Бека (Curus-Beck, CB - алгоритм) и более поздний алгоритм Лианга-Барски (Liang-Barsky, LB-алгоритм) [32].

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

Вначале мы рассмотрим алгоритм Коэна-Сазерленда, являющийся стандартом де-факто алгоритма отсечения линий и обладающий одним из лучших быстродействий при компактной реализации. Затем рассмотрим наиболее быстрый, но и чрезвычайно громоздкий FC-алгоритм. Далее рассмотрим алгоритм Лианга-Барски для отсечения прямоугольным окном с использованием параметрического представления. Быстродействие этого алгоритма сравнимо с быстродействием алгоритма Коэна-Сазерленда при большей компактности и наличии 3D и 4D реализаций. Последним рассмотрим алгоритм Кируса-Бека, который использует параметрическое представление и позволяет отсекать произвольным выпуклым окном. В заключение сравним быстродействие различных алгоритмов.


0.6.1 Двумерный алгоритм Коэна-Сазерленда

Этот алгоритм позволяет быстро выявить отрезки, которые могут быть или приняты или отброшены целиком. Вычисление пересечений требуется когда отрезок не попадает ни в один из этих классов. Этот алгоритм особенно эффективен в двух крайних случаях:

· большинство примитивов содержится целиком в большом окне,

· большинство примитивов лежит целиком вне относительно маленького окна.

Идея алгоритма состоит в следующем:

Окно отсечения и прилегающие к нему части плоскости вместе образуют 9 областей (рис. 0.2.3). Каждой из областей присвоен 4-х разрядный код.

Две конечные точки отрезка получают 4-х разрядные коды, соответствующие областям, в которые они попали. Смысл разрядов кода:

1 рр = 1 - точка над верхним краем окна;

2 рр = 1 - точка под нижним краем окна;

3 рр = 1 - точка справа от правого края окна;

4 рр = 1 - точка слева от левого края окна.

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

· если коды обоих концов отрезка равны 0 то отрезок целиком внутри окна, отсечение не нужно, отрезок принимается как тривиально видимый (отрезок AB на рис. 0.2.3);

· если логическое & кодов обоих концов отрезка не равно нулю, то отрезок целиком вне окна, отсечение не нужно, отрезок отбрасывается как тривиально невидимый (отрезок KL на рис. 0.2.3);

· если логическое & кодов обоих концов отрезка равно нулю, то отрезок подозрительный, он может быть частично видимым (отрезки CD, EF, GH) или целиком невидимым (отрезок IJ); для него нужно определить координаты пересечений со сторонами окна и для каждой полученной части определить тривиальную видимость или невидимость. При этом для отрезков CD и IJ потребуется вычисление одного пересечения, для остальных (EF и GH) - двух.

При расчете пересечения используется горизонтальность либо вертикальность сторон окна, что позволяет определить координату X или Y точки пересечения без вычислений.


Рис. 0.2.3: Отсечение по методу Коэна-Сазерленда

 

При непосредственном использовании описанного выше способа отбора целиком видимого или целиком невидимого отрезка после расчета пересечения потребовалось бы вычисление кода расположения точки пересечения. Для примера рассмотрим отрезок CD. Точка пересечения обозначена как P. В силу того, что граница окна считается принадлежащей окну, то можно просто принять только часть отрезка PD, попавшую в окно. Часть же отрезка CP, на самом деле оказавшаяся вне окна, потребует дальнейшего рассмотрения, так как логическое И кодов точек C и P даст 0, т.е. отрезок CP нельзя просто отбросить. Для решения этой проблемы Коэн и Сазерленд предложили заменять конечную точку с ненулевым кодом конца на точку, лежащую на стороне окна, либо на ее продолжении.

В целом схема алгоритма Коэна-Сазерленда следующая:

  1. Рассчитать коды конечных точек отсекаемого отрезка.

В цикле повторять пункты 2-6:

  1. Если логическое И кодов конечных точек не равно 0, то отрезок целиком вне окна. Он отбрасывается и отсечение закончено.
  2. Если оба кода равны 0, то отрезок целиком видим. Он принимается и отсечение закончено.
  3. Если начальная точка внутри окна, то она меняется местами с конечной точкой.
  4. Анализируется код начальной точки для определения стороны окна с которой есть пересечение и выполняется расчет пересечения. При этом вычисленная точка пересечения заменяет начальную точку.
  5. Определение нового кода начальной точки.

Эта схема реализована в процедуре V_CSclip, приведенной в Приложении 7.

19 Трассировка лучей (англ. Ray tracing; рейтрейсинг) — один из методов геометрической оптики — исследование оптических систем путём отслеживания взаимодействия отдельных лучей с поверхностями. В узком смысле — технология построения изображения трёхмерных моделей в компьютерных программах, при которых отслеживается обратная траектория распространения луча (от экрана к источнику). Достоинства и недостатки текущих реализаций метода

Алгоритм трассировки лучей

[править] Достоинства

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

[править] Недостатки

Серьёзным недостатком метода обратного трассирования является производительность. Метод растеризации и сканирования строк использует когерентность данных, чтобы распределить вычисления между пикселями. В то время как метод трассирования лучей каждый раз начинает процесс определения цвета пикселя заново, рассматривая каждый луч наблюдения в отдельности. Впрочем, это разделение влечёт появление некоторых других преимуществ, таких как возможность трассировать больше лучей, чем предполагалось для устранения контурных неровностей в определённых местах модели. Также это регулирует отражение лучей и эффекты преломления, и в целом — степень фотореалистичности изображения.

О трассировке лучей

Трассировка лучей (ray tracing) – один из самых мощных методов компьютерной графики для построения изображений. С его помощью можно получить множество эффектов, таких как преломление (refraction) и отражение (reflection), бамп-меппинг (bump-mapping), эффект размытия глубины (depth of field) и многие другие. Но построение изображения по одной точке, поиск пересечения со всеми объектами сильно замедляет работу. Существую гораздо более эффективные алгоритмы, такие как построчное сканирование (scan line), BSP-деревья, развертка с использованием z-буфера.

Рассмотрим наиболее общий алгоритм трассировки, также известный как метод фотонных карт (photon mapping).

Для получения эффектов вроде бликов лучей на поверхностях от зеркал (солнечный "зайчик") и фокусирования лучей при прохождении линзы, необходимо построения карт освещения. Для этого используется прямая трассировка. Испускаются (трассируются) лучи от источников света (чем больше тем лучше). При прохождении через полупрозрачный материал луч ослабляется и, возможно, преломляется. После пересечения с объектом мы знаем, что найденная точка освещена. В результате у каждого объекта строится карта освещения (например растр в памяти).

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

Матрицы и вектора

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

Во всех дальнейших примерах будем полагать, что вектор у нас представлен строкой с четырьмя компонентами, а матрица, соответственно, имеет размеры 4 на 4.

В виде уравнений

Для переноса точки используется следующее преобразование

Для масштабирования (вытягивания/сжатия в направлении осей координат)

Для вращения вокруг оси X

Для вращения вокруг оси Y

Для вращения вокруг оси Z

В программе эти матрицы получаются непосредственной инициализацией.

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

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

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

void ReverseMatrix(Matrix *res, const Matrix &m){ REAL d = m.Determinant(), k; if (d == 0)   throw "Matrix invalid"; k = 1/d; for (int i = 0; i < 4; i++)   for (int j = 0; j < 4; j++)       if ((i + j)%2 == 0)           res->m[j][i] = m.Minor(i, j)*k;       else           res->m[j][i] = - m.Minor(i, j)*k;} REAL Matrix::Minor(int i, int j) const{ REAL a[3][3]; int i0, j0, i1, j1; for (i1 = 0, i0 = 0; i1 < 3; i1++, i0++) {   if (i0 == i)       i0++;   for (j1 = 0, j0 = 0; j1 < 3; j1++, j0++)   {       if (j0 == j)           j0++;       a[i1][j1] = m[i0][j0];   } } return         + a[0][0]*a[1][1]*a[2][2] + a[0][1]*a[1][2]*a[2][0] + a[0][2]*a[1][0]*a[2][1]         - a[0][2]*a[1][1]*a[2][0] - a[0][0]*a[1][2]*a[2][1] - a[0][1]*a[1][0]*a[2][2];} REAL Matrix::Determinant() const{ return         + _00*_11*_22*_33 - _00*_11*_23*_32 - _00*_12*_21*_33 + _00*_12*_23*_31   + _00*_13*_21*_32 - _00*_13*_22*_31 - _01*_10*_22*_33 + _01*_10*_23*_32   + _01*_12*_20*_33 - _01*_12*_23*_30 - _01*_13*_20*_32 + _01*_13*_22*_30   + _02*_10*_21*_33 - _02*_10*_23*_31 - _02*_11*_20*_33 + _02*_11*_23*_30   + _02*_13*_20*_31 - _02*_13*_21*_30 - _03*_10*_21*_32 + _03*_10*_22*_31   + _03*_11*_20*_32 - _03*_11*_22*_30 - _03*_12*_20*_31 + _03*_12*_21*_30;}

Процедура выполняется примерно 2000 тактов. После развертка циклов нахождения миноров (без i и j) все занимает около 700 тактов (можно увидеть в исходных кодах трассировщика).

Обратная трассировка лучей


Поделиться с друзьями:

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.063 с.