Закраска Гуро При закрашивании Гуро (Gouraud shading) для каждого пиксела вычисляется отдельное значение цвета с. Для строки развертки при ys на рис. 8.22 цвет крайнего левого пикселя color]cfl определяется посредством линейной интерполяции цветов на верхнем и нижнем концах левого ребра полигона1. Для этой строки развертки «верхний» цвет равен colorv а «нижний» - color\, так что со1огш можно вычислить по формуле (вспомните уравнение (8.9)):
colorleft = lerp(colort> color4,/), (8.12)
где дробь
изменяется от 0 до 1 при изменении уг от уЫ1 до ук. Отметим, что равенство (8.12) подразумевает три вычисления, поскольку каждое значение цвета содержит компоненты красного, зеленого и синего цветов.
Подобным же образом вычисляется цвет со1огг|(,к - путем интерполяции цветов в верхнем и нижнем концах правого ребра. Затем плиточник заполняет строку развертки, линейно интерполируя между цветами со1ог|сЛ и со!огг1к1)1 для получения цвета пиксела х.
(8.13)
Для повышения эффективности заполнения этот цвет вычисляется в приращениях для каждого пиксела. То есть между цветами с(х + 1) и с(х) разность постоянна, так что с(х + 1) = с(х) +---. (8.14)
-""right - *lcft
Приращение вычисляется только один раз за пределами самого внутреннего цикла. Код при этом выглядит примерно так:
for (int у - ybott ; у <= ytop : у++)
// for each scan line
// для каждой строки развертки
{
find xleft and xright
1 Позже мы увидим, что хотя цвета обычно интерполируют линейно, как мы делаем это здесь, лучшие результаты могут быть достигнуты с помощью так называемой гиперболической интерполяции. Для закрашивания Гуро различие этих видов интерполяции несущественно; однако при отображении текстуры оно становится критическим.
Визуализация граней для усиления реалистичности
// нахОДИН Xlett И Xright
find colorleft and colorright II находим colorieft и colornght
Colonne - (COlornght - COlorieft ) / (xright - Xleft ):
for (int x - xieft . с - colorieft : x <= xnght : x++. c+-colonnc ) put с into the pixel at (x. y) II помещаем цвет с в пиксел (х, у)