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 !
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября