|
Buzz
#17
10 апреля 1999 |
|
GOURAUD - Ликбез в области 3D-shading (алгоритм заливки грани методом GOURAUD).

(C) 1999 SaiR00S/EI
Целью данной статьи (а, возможно, и цикла статей, если Вам
все это покажется небезинтересным) является проведение
небольшого ликбеза в области 3D-shading, ибо меня , мягко
скажем, достали изречения в отношении данного вопроса в стиле:
"Паа-фа-а, аа-а хде моге ?" и т.п.
Ну ладно, хватит о грустном, перейдем непосредственно к теме
сегодняшнего повествования.
Gouraud shading - это метод заливки 3D
поверхности,основанный на Ламбертовской модели освещения , и
являющийся ее усовершенствованием (подробнее , кому интересно ,
читайте об этом в литературе на данную тему или проясняйте
данный вопрос на очной встрече со мной за пару пива :) . Ну дак
вот , при данной модели освещенности, интенсивность света,
падающего на плоскость определяется из угла между вектором света
и вектором нормали к поверхности. Чуть-чуть поднапрягшись в
математике , мы вспоминаем , что косинус угла между двумя
векторами определяется следующим образом:
cos (AB) = (Xa*Xb+Ya*Yb+Za*Zb)/(|A|*|B|)
где Xa,Xb,Ya,Yb,Za,Zb - соответственно координаты концов векто-
ров A и B;
|A|,|B| - соответственно длины этих векторов, вычисляемых
довольно просто :), как гоеметрическая суммa ко-
ординат Xa..Za:
|A| = sqrt (Xa^2+Ya^2+Za^2),
аналогично находим |B|.
Применительно к Gouraud , это нам дает информацию о том, в
какой цвет закрашивать полигон.
Итак , что-же нам нужно для образования поверхности по
методу Gouraud:
- во-первых - это координаты вершин спроецированного
полигона (мы будем использовать треугольник,т.к. он является
наиболее простым, быстрым и он наиболее математически корректен,
ибо три его вершины не могут лежать в разных плоскостях, чего
нельзя сказать о других видах полигонов);
- во-вторых - это значения интенсивности света в каждой из
вершин.
О том , как спроецировать вершину на плоскость я
рассказывать не буду , а вот на том, как получить значение
интенсивности света в вершинах, я остановлюсь поподробнее.
Итак,к каждой грани 3D об'екта мы имеем нормаль. В каждой
вершине об'екта мы восставляем нормаль, являющуюся суммой
нормалей граней , окружающих данную вершину. Затем, нормализуем
полученные нормали, и, взяв какую-либо координату за
интенсивность света относительно оси, образуемой данной
координатой и началом координат , получаем значение цвета в
данной точке.
Следующая картинка поможет чуть-чуть осознать прочитанное.
(X1,Y1),a1
/
/ \ a1..a3 - зна-
/ чения цветов в
/ \ точках с коор-
/ динатами X1-X3,
(X2,Y2),a2/ \ Y1-Y3.
\
\ \
\
\ \
\
\ \
\
\ \
\
\\
(X3,Y3),a3
Далее , линейно проинтерполировав цвета от a1 до a2, от a2
до a3, и от a1 до a3, мы получим значения цветов на каждую
вертикальную линию . Кому не лень, интерполяцию можете проводить
по уравнению прямой:
Y = A*X + B,
в результате чего получите небольшой тормоз. Гораздо удобнее
интерполировать по Брезенхему ( этим вы избавитесь от деления).
После этого интерполируете цвета на каждой горизонтальной
линии и одновременно прорисовываете полигон:
LD A,H ;Заносим в A значе-
;ние цвета
ADD HL,DE ;Интерполируем цвет
;по горизонтальной
;линии
LD (BC),A ;Выбрасываем цвет в
;буфер
INC C ;Переходим к следу-
;ющей точке.
И все! Получаете красивый (насколько это может быть красивым
на Spectrum ) Gouraud shading.
Прежде, чем бросаться все это кодить , можно посмотреть как
это выглядит у VAV'а в Refresh ( та часть, где бублик мотается
на фоне глаза) , или на AMIGA (хотя чистый Gouraud там уже
большая редкость, все Phong, да Phong ...) в последних демах от
Ramses, но уже с Texture Mapping'ом (настоятельно рекомендую
просмотреть все лучшие демы за 97-98 годы , так, для общего
развития...).
За сим прощаюсь, успехов на demoscene !
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября