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

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

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

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

Файлы: 1 файл

kr - extended version.doc

— 1.24 Мб (Скачать)
  • занести некоторый цвет рамки { if ((u’<0)||(u’>= usize)||(v’<0)||(v’>= vsize)) C=Cb; }
  • занести цвет крайнего тексела { if (u’<0) u’=0; if (v’<0) v’=0; if (u’>= usize) u’= usize-1; if (v’>= vsize) v’= vsize-1;}
  • зациклить текстуру {u’=u’ % usize; v’=v’ % vsize; }
 

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

 
 
 
 
 
 
 
 

Чаще  всего работают с планарным наложением текстур. Чтобы получить координаты (u,v), нужно сначала перевести координаты точки P в систему координат текстуры. Сначала совмещаем начала координат P’=P-O. Затем переводим в базис (U,V,N). Т.к. в общем случае U и V не единичные, то , .

Из этих формул следует, что текстурные координаты можно линейно интерполировать, т.е. для любой точки P на отрезке AB, P=A+k(B-A), текстурные координаты равны , , где  и - текстурные координаты  точек A и B.

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

Поточечное  текстурирование 

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

Наиболее общим  методом будет искать пересечение  луча, проходящего через центр  пиксела  с плоскостью полигона , . Если используется параллельное проектирование, то параметры луча можно задать как , а L всегда постоянен. В этом случае, k является линейной комбинацией экранных координат (x,y) k=ax+by+c, и планарные текстурные координаты тоже линейные комбинации экранных координат. Поэтому, для полигона достаточно один раз вычислить коэффициенты и рассчитывать текстурные координаты по ним. Но, если используется перспективное проектирование, имеет смысл выбрать в качестве точки A – точку схода O, а L  вычислять, по координатам пиксела . Коэффициент k в этом случае будет равен , а текстурные координаты в виде , т.е. для каждого пиксела потребуется одно деление, не самая быстрая операция.

Подобные  зависимости характерны для всех параметров в объектном пространстве. Например, координата Z.

Зато, параметр является линейной комбинацией экранных координат. Текстурные координаты принято выражать относительно этого параметра w ( , ).

Метод постоянной глубины 

Если плоскость полигона параллельна  картинной плоскости, тогда для  всех точек полигона w=const, и деление не нужно. Если ориентация плоскости полигона произвольна, то ее пересечение с плоскостями, параллельными картинной плоскости, дадут набор параллельных прямых, для которых это свойство (w=const) выполняется. Эти прямые будут параллельны и в экранных координатах. Если так подобрать шаг плоскостей, что каждая прямая будет отстоять от другой ровно на 1 пиксел по одной из осе экранных координат, то можно растеризовать полигон заполняя пикселы грани, принадлежащие этим прямым. 

Линейная  интерполяция 

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

    • рассчитывается приращение вдоль оси Y du/dy kul=(Bu-Au)/(By-Ay);
    • затем, текстурные координаты для границы первого спана ul=Au+kul*(Ys-Ay) , где Ys=floor(Ay+0.5)+0.5;
    • наконец, при переходе на очередную линию, к ним прибавляется приращение ul+=kul;

Интерполяция  вдоль спана происходит подобным образом:

    • рассчитывается приращение вдоль оси X du/dx kus=(ur-ul)/(xr-xl);
    • затем, текстурные координаты для первого пиксела us=ul+kus*(Xs-xl), где Xs=floor(xl+0.5)+0.5;
    • наконец, для каждого следующего пиксела в спане, к ним прибавляется приращение us+=kus;

kul=1/4, kvl=0, kur=0, kvr=1/2

ul=1/4*1/4=1/16, vl=0

ur=0, vr=1/2*1/4=1/8

kus=(0-1/16)/(1/2)=-1/8

kvs=(1/8-0)/(1/2)=-1/4

(1/16,0)

ul=ul+kul=5/16, vl=0

ur=0, vr=vr+kvr=5/8

kus=(0-5/16)/2=-5/32

kvs=(5/8-0)/(2)=5/16

(5/16,0),(5/32,5/16),(0,5/8)

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

Можно линейно интерполировать u’,v’ и w, но тогда придется все равно делить на w для каждой точки.

Можно получать точные (u,v) для спана (два  деления на строку), а внутри линейно  интерполировать, для коротких спанов это приемлемо, но для длинных  заметны искажения, поэтому их разбивают  на участки (например по 8 пикселов), рассчитывают точные координаты на концах этих отрезков, а между ними интерполируют линейно. 

Нелинейная  интерполяция 

Вместо  линейной , можно применить квадратичную интерполяцию . Для этого нужна система из трех уравнений, первые два получаются из значений для двух концов отрезка (x1,w1,u1) и (x2,w2,u2), а третье – из точки между ними ( ).

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

По похожей  схеме можно применить и кубическую интерполяцию. 

Фильтрование  текстур  

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

Более простым методом является пирамидальное  фильтрование (mipmapping), для этого строится иерархия текстур, текстура на очередном уровне два раза меньше предыдущей. Для этого выбираются квадраты 2х2 тексела и значение цвета в них усредняется. 8х8->4х4->2х2->1х1. Дополнительные затраты памяти составляют 33% от начального размер текстуры. 

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

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

С0=С00+(С01-С00)*ku

С1=С10+(С11-С10)*ku

С= С0+(С1-С0) *kv

U0=floor(U-0.5) V0=floor(V-0.5)

ku=U-(U0+0.5) kv=V-(V0+0.5) 

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

Лекция 14 

Освещение 

      Если  рассматривать луч света, как  электромагнитную волну, то он характеризуется  двумя параметрами – длиной волны l, и амплитудой I. Произвольный луч можно рассматривать как сумму волн с различной длиной, каждая из них вносит свой вклад I(l). Эта функция называется спектральной характеристикой луча света. В общем луч одного и того же цвета может состоять из различных волн. Обычно рассматривают луч света, как состоящий из трех базовых компонент R,G,B. При распространении света следует обрабатывать два случая – распространение в однородной среде и взаимодействие с границей раздела двух сред.

      В однородной среде свет распространяется прямолинейно с постоянной скоростью. Отношение этой скорости к скорости света в вакууме определяется коэффициентом преломления среды h(l). При этом свет затухает с коэффициентом , где d – расстояние, пройденное светом в среде, b - коэффициент затухания. На практике, пользуются более простой формулой , где a,b – некоторые константы.

 При переходе границы двух сред  происходит отражение  и преломление света. Угол отражения a равен углу падения. Отсюда легко можно получить отраженный вектор.

R=-L+a+b

a=b=L+c

c=(cosa)N=(-L·N)N

R=-L+2(L-(L·N)N)=L-2(L·N)N 

Преломление происходит согласно закону hLsina=hTsinq.

Можно использовать один коэффициент  , тогда sinq=hsina.

  (1)

=С,  , если представить вектор T=aL+bN, тогда .

если  наложить условие нормировки на T, тогда |T|=1

  (2)

Если  теперь сложить (1) и (2)

=>

Теперь  из уравнения (2) можно вычислить  b.

,

 

Это законы для идеального отражения и преломления, когда поверхность идеально гладкая. Обычно поверхность имеет неровности, и часть света отражается во всех направлениях. Такой освещение отражение  диффузным и интенсивность отраженного  луча рассчитывается по законы Ламберта Id=Il*kd(l)*cosa, где Il – яркость света, упавшего на поверхность, kd(l) – коэффициент диффузного отражения поверхности. Этот коэффициент зависит от цвета поверхности, т.е. белый свет отражаясь от синей поверхности становится синим. Если свет задается тремя компонентами, то обычно эти коэффициенты рассчитывают из цвета поверхности (R,G,B) и некоторого общего коэффициента диффузного отражения kd. kd(lR)=kd*R, kd(lG)=kd*G, kd(lB)=kd*B.

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