Проективные текстуры

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

 

Рис5.1

 

 

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

Всего мы имеем дело с четырьмя координатными системами.

1. Наблюдательская система ("clip" или "projection") - является обычным для графики 4-х координатным представлением 3-х мерного (объемного) пространства. Координаты зовутся x, y, z, w. Начало этой координатной системы лежит в точке наблюдения.

2. Экранная система ("screen") - 2-х мерный экран, который и видит наблюдатель. Эти координаты получаются из наблюдательской системы путём деления x и y на w – x5 = x / w, y5 = y / w, (индекс "s" у получающихся координат обозначает экранную систему).

3. Система источника света ("light") - это вторая объемная система координат (xt, yt, zt и wt,). В начале этой системы координат находится источник света.

4. Текстурная система (texture) - координаты на плоскости проецируемой текстуры (тот слайд, сквозь который светит воображаемый источник света). Текстурные координаты получаются как xt = xt / wt, yt = yt / wt (также можно вычислить zt = zt / wt , если мы решили не ограничиваться плоской текстурой).

Наша задача: имея точку (x5, y5) на экране, нам необходимо найти соответствующую ей точку (xt, yt) на текстуре.


 

 


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

 

 

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

 

и решим относительно t . Для тех, кому интересно, приведем все рассуждения:


Вычисление t:

Зададим a и b, таким образом, что 1 – t5 = a / (a + b) и t5 = b / (a + b).

Зададим A и B так, что t = A / (A + B) и t = B / (A + B).

Тогда:

Легко проверить, что A = aw1 и B = bw2 удовлетворяют этому уравнению, позволяя нам получить искомый параметр t , и, далее, координаты Q.

Продолжим. У нас есть матрица M, переводящая координаты из системы источника в наблюдательскую:

 

 

Уравнение (6) выражает координаты на поверхности текстуры, соответствующие любой точке сегмента выбираемой (линейно интерполируемой) параметром в экранных координатах.

Для того, чтобы получить координаты, мы должны линейно интерполировать xt/w, yt/w, wt/w.

Для каждого пикселя:

Если wt постоянна на всём полигоне, то уравнение (7) приобретает вид

откуда мы имеем s = xt/wt, t = yt/wt. Здесь (s,t) - текстурные координаты, синонимы (xt, yt).

 

Уравнение (8) и определяет текстурные координаты, которые можно привязать к вершинам передаваемого на ускоритель полигона. В более общем сложном случае проективной текстуры, выражаемом уравнением (7), требуется деление на wt/w, а не на 1/w.


Туман

 

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

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

Мы рассмотрим пиксельный туман.

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

Расстояние до точки.

 

D – расстояние от наблюдателя (Р) до точки (или дистанция).

 

отсюда получаем

где

Подставляя в формулу получаем уравнение расстояния до точки:

, где

 

V(D) – яркость в данной точке

dD – расстояние, на которое добавляем туман

V(D+dD) – яркость в точке с учетом добавленного тумана

Формула яркости в точке с учетом добавленного тумана.

,

где Vт – яркость тумана

s - плотность тумана

решим дифференциальное уравнение

отсюда получим

В нулевой точке, то есть в точке, где находится наблюдатель тумана нет, поэтому получаем:

, тогда получим:

, где Dт – дистанция тумана

Получаем уравнение вычисления тумана:

. На дистанции Dт туман увеличивается в раз.

Примем соглашение, что , так как отображать объекты, находящиеся на расстоянии больше, чем 3Dт, нет смысла (из-за тумана не будет видно).

 

Экспоненциальный туман.

Значение функции можно вычислять таблично:

h – по старшим разрядам, например, 6 разрядов

r – делим на зоны, r = r0…rmax , например, на 16 зон (4 разряда)

Итого, например, получаем 10-ти разрядную таблицу.


Тени

 

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

 

Тени бывают двух типов:

Первый:

 

Рис 2.1

 

На рисунке 2.1 представлены следующие обозначения, которые будут использоваться в дальнейшем:

s – точечный источник света.

p – положение наблюдателя.

Рис 2.2


S – вектор, направленный на S.

Наблюдатель увидит линию терминатора – границу раздела света и тени.

Если угол между S и N > 90, то источник света падает не на лицевую грань.

 


Второй:

Рис 2.3

 

Тень второго типа – тень, отбрасываемая одним объектом на другой.

 

 

Наблюдателя помещаем в S (некоторого вспомогательного наблюдателя).

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

Рис 2.4

 

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

1 Этап – построение Hs.

2 Этап – построение H,V.

Обработка каждой текущей точки будет производиться в соответствии со следующим алгоритмом. (когда мы идём по сканированной строке).

Нам известно: x, y – координаты в плоскости изображения.

U - яркость

U0 - яркость для точки в тени.

h - текущее значение параметра глубины.

Имеется HS , H , V.

Условие (**) проверяет - освещена точка или нет.

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

 

 

Пересчет точек из одной системы координат в другую осуществляется следующим образом.

где:

Из первого уравнения найдем пространственные координаты.

Чтобы перейти в другую систему координат необходимо осуществить параллельный перенос

 

Перед этим из выражения (*) мы получаем SS через S

Для расчета коэффициентов применим следующие формулы:

 

 

В отличие от локального освещения, тени являются одним из эффектов глобального освещения. Т.к. основным местом использования алгоритмов теней в реальном времени являются компьютерные игры, то в дальнейшем, для удобства, будут приводиться примеры именно на них. Существует несколько основных подходов к построению теней, рассмотрим алгоритм «Преобразование модели "на землю" и отрисовка её как тени». Фактически, это первый алгоритм построения тени, который был применён в играх. (Turok II, Shogo, etc.). Он отличается простотой реализации и хорошим качеством получаемой тени. Этот алгоритм был впервые описан Джимом Блинном [BLIN88]. В своей статье он описал уравнения для проектирования полигона "на землю", т.е. на плоскость z=0, в направлении от источника света. Он рассмотрел два случая:


 

  1. Источник на бесконечности (параллельный направленный свет)
  2. Локальный источник (точечный источник недалеко от объекта)

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

 

 

  1. Источник на бесконечности

 

 

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

Общая постановка задачи:

Имея точку источника света (xS, yS, zS) и вершину объекта (xP, yP, zP) , мы хотим получить проекцию вершины объекта на плоскость z=0, т.е. точку тени (x5, y5, z5).

Из подобных треугольников получаем:

решая это уравнение относительно x5, получаем:

если принять, что L это вектор из точки P к источнику света, то точку S можно выразить как

 

S = P - aL (3)

 

т.к. мы производим проекцию на плоскость z=0, то уравнение (3) можно переписать в следующем виде: 0 = zp - azs (4) или a = zp / zs (5)

решая (3) относительно x5 и y5, получаем:

 

Теперь имея координаты точки P в мировом координатном пространстве, можно получить её проекцию на плоскость z=0 просто путём умножения на матрицу М5: S = M5 * P (8)

 

 

  1. Локальный источник

 


Уравнение (6) для бесконечно удалённого источника света может быть обобщено для случая, когда источник света находится на конечном расстоянии от объекта. В этом случае нам понадобятся дополнительные вычисления на каждую вершину, т.к. каждая вершина имеет, в общем случае, своё собственное направление на источник света. Тем не менее, в этом случае мы тоже можем перенести большую часть вычислений в матрицу М5.

 

Если L это точка расположения источника света, то (3) принимает вид: S = P + a(P - L) (9)

и снова нам необходимо произвести проекцию на плоскость z=0, т.ч.

Если использовать гомогенизацию после преобразования, то (11) можно записать в виде матрицы

-zs 0 xs 0

M5k = 0 -zs 0 0 (12)

0 0 -ys 0

0 0 1 -zs

 

Опять, имея координаты точки P в мировом координатном пространстве, можно записать:

 

Sk = M5k * P (13)

 

после чего провести гомогенизацию точки Sk для получения проекции точки P на плоскость z=0.

 

 

Существует несколько ситуаций, когда тени не нужны:

1. Когда нет источника света.

2. Когда совмещены наблюдатель и источник света.

3. Когда солнце в Зените.

 

 


Моделирование освещения.