Лекции по "Компьютерной графике"

Автор: Пользователь скрыл имя, 18 Октября 2011 в 01:13, курс лекций

Краткое описание

Работа содержит лекции по дисциплине "Компьютерная графика".

Файлы: 1 файл

kr - extended version.doc

— 1.24 Мб (Скачать)

В направлениях, близких к направлению отраженного вектора, добавляется блик. Он рассчитывается по эмпирической формуле Is=Il*ks*cosng, параметр n дает фокусировку блика, g - угол между направлением на наблюдателя и отраженным лучем. Цвет блика не зависит от цвета поверхности, т.е. белый свет дает белый блик на синей поверхности. Кроме того, к этим двум цветам добавляется некоторый рассеянный свет Ia*ka(l), где Ia – яркость рассеянного света, ka(l) – коэффициент отражения рассеянного света. Обычно ka(l)=kd(l).

Общая формула яркости света I’.

I’= Id+Is+Ia =Il*kd(l)*cosa+ Il*ks*cosng+ Ia*ka(l)

I’=Il*(kd(l)*cosa+ ks*cosng)+ Ia*ka(g)= (kd(l)*cosa+ ks*cosng)+ Ia*ka(l)

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

Определение нормали к поверхности 

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

, ,

,  

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

Метод излучательности 

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

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

, где 

- энергия, отбрасываемая i-м фрагментом;

- энергия излучаемая i-м фрагментом (если это источник света);

- доля энергии j-ого фрагмента, попадающая на i-м фрагментом (коэффициент формы);

- коэффициент отражения i-ого фрагмента;

Если  учитывать закон сохранения энергии  , то эта система хорошо решается итеративным методом.

,

Лекция 15 

Устранение  лестничного эффекта (Antialiasing) 

      При растеризации различных примитивов (отрезков, окружностей, полигонов)  неизбежно возникает одна проблема - рваные, ступенчатые края. Это явление, известное как лестничный эффект, совершенно естественное и, к тому же, неприятное следствие принятого подхода к подсветке пикселов, когда пиксел имеет только два состояния: включен/выключен. Алгоритмы рисования линий, рассмотренные ранее, реализует именно этот подход. При более высоком разрешении, когда соседние пикселы на экране находятся так близко друг к другу, что их трудно различить, лестничный эффект почти незаметен. Но при более низком разрешении лестничный эффект приводит к тому, что изображение выглядит грубым, компьютеризованным. Чем ниже разрешение, тем более явными становятся ступенчатые края, и тем менее реалистично выглядит изображение после растровой развертки. Для решения этой проблемы существуют специальные методы устранения лестничного эффекта. Для устранения лестничного эффекта используется тот факт, что пикселы можно высвечивать с различной интенсивностью и, если интенсивности соседних пикселов правильно подобраны, то они будут сливаться, формируя при этом гладкое изображение. Линии, нарисованные с помощью таких алгоритмов, выглядят слегка размытыми, но в этом и состоит устранение лестничного эффекта. Жертвуя четкостью, вы взамен получаете качество.

      Существуют  разные подходы к решению этой проблемы.

      Первый  метод – растеризовать все  изображение (или отдельный примитив) с большим разрешением (например в 2 или в 4 раза), а затем усреднить  значения цвета в пикселах. Например, при в 2 раза большем изображении, одному пикселу соответствуют 4 субпикселов, яркость при этом рассчитывается по формуле . В случае, когда одному пикселу соответствуют S сабпикселов, N=S2, кол-во градаций яркости пиксела равно S2+1.

 
 
 
 

      Не  обязательно растеризовать все  изображение (т.к. при этом потребуется слишком много памяти), достаточно растеризовать часть полигона, соответствующую одному спану (ему будут соответствовать 4 субспана при 4-х кратном увеличении), а затем посчитать яркость пикселов этого спана.

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

 
 
 
 
 
 
 
 

      Второй  метод – рассчитывать яркость  пикселов в зависимости от расстояния их центров до идеальной линии. 

 
 
 
 
 
 
 
 
 
 
 

      В отличие от предыдущих алгоритмов, выбирающих один пиксел, ближайший  к линии, алгоритм растеризации с  устранением лестничного эффекта высвечивает все пикселе, через которые проходит идеальная линия. Но ни один из них не светится с максимальной интенсивностью. Если идеальная линия проходит точно между пикселами, то каждый из них светится вполовину от нормальной интенсивности. Если линия ближе к какому-то из двух пикселов, то этот пиксел светится ярче, пропорционально расстоянию до другого. Пиксел высвечивается с максимальной яркостью только в том случае, когда линия проходит точно через его центр. Коэффициент яркости в DDA – алгоритме можно определять по расстоянию от линии до центра основного пиксела L= Y+0.5-floor(Y). Его яркость равна I1=1-fabs(L) (fabs(L)<=0.5). Если I1=1 – подсвечивается только основной пиксел, если меньше – то подсвечивается еще один – смещенный по Y в направлении знака L, I2=1-I1. 

      Третий  метод – рассчитывать яркость  пикселов в зависимости от площади  части пиксела, которую покрывает  примитив. Для полигонов все просто, а для линии используют прямоугольник  шириной в 1 пиксел. 
 
 

 
 
 
 
 
 
 
 
 

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

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

Лекция 16 

Дискретизация изображений 
 

       Прежде  чем работать с изображением его  нужно перевести в цифровую форму, это делается при помощи квантования. Физически изображение представляет собой непрерывную функцию яркости от двух переменных X и Y (для цветного – это три функции, для каждой компоненты цвета – своя). Во-первых, ее нужно квантовать по осям X и Y (чтобы получить пикселы), во-вторых – нужно квантовать яркость (чтобы перейти от непрерывных значений яркости к дискретным значениям). Обычно квантование происходит на аппаратном уровне, например, при сканировании. В этом случае частота дискретизации (разрешение изображения) и кол-во градаций яркости пикселов (глубина цвета) зависят от параметров сканера.

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

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

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

         
 
 
 
 
 
 

       Одним из видов преобразования является приведение цветного изображения в черно-белое. При в качестве результирующей картинки используется значение яркости пикселов, которое считается по формуле   Y =  0.30*R+0.59*G+0.11*B.

       При уменьшении глубины цвета или  приведении изображения к палитре  качество изображения может сильно ухудшиться, если не применять специальных  методов. Например, нужно черно-белую картинку с глубиной цвета 8 бит (256 оттенков серого) привести к глубине цвета 1 бит (например, для печати на принтере). Самым простым было бы все оттенки с яркостью меньше половины (от 0 до 127) заменить на  черный цвет, а с яркостью больше половины (от 128 до 255) – на белый. Но тогда появятся большие области с одинаковым цветом, границы между ними будут очень портить изображение. Для того, чтобы избежать этого эффекта, применяют методы псевдотонирования (dithering). Псевдотонирование позволяет увидеть в изображении больше цветов, чем их есть на самом деле. Если pазноцветные пикселы группируются вместе то, человеческий глаз смешивает их цвета, воспринимая результат как дополнительный цвет.  

        Первый алгоритм – Флойда-Стейнберга (диффузия ошибки). Его суть состоит в том, что ошибка между истинным значением цвета и цветом поставленной точки не теряется, а распространяется на соседние пикселы. Например, яркость текущего пиксела 200, ставим на его место белый пиксел с яркостью 255, и распространяем ошибку -55 (отрицательная – т.к. поставили более яркий пиксел, чем следовало бы и это нужно компенсировать) на соседние 3 пиксела. Если яркость следующего пиксела 140, то вместе с 3/8 долей ошибки она составит 120 и нужно будет ставить черный пиксел с яркостью 0, ошибка составит 120 и ее нужно распространять дальше. Его можно не только для формирования однобитных изображений, но и для любой другой глубины цвета. Причем цвет можно выбирать как равномерно распределенные градации, например для 2-х битового режима – 20, 60, A0, E0, так и создать палитру для наиболее часто используемых цветов и искать цвета в ней.

Информация о работе Лекции по "Компьютерной графике"