Этот метод предназначен для создания иллюзии гладкой криволинейной поверхности, которая описана в виде многогранников или полигональной сетки с плоскими гранями. Если каждая плоская грань имеет один постоянный цвет, который определен в соответствии с учетом отражения, то разные цвета соседних граней очень заметны, и поверхность выглядит именно как многогранник. Казалось, этот дефект можно замаскировать за счет увеличения количества граней при аппроксимации поверхности. Но зрение человека имеет способность подчеркивать перепады яркости на границах смежных граней — такой эффект называется эффектом полос Маха. Вследствие этого, для создания иллюзии гладкости нужно намного увеличить количество граней, что приводит к существенному замедлению визуализации — чем больше граней, тем меньше скорость рисования объектов.
Метод Гуро основан на идее закрашивания каждой плоской грани не одним цветом, а плавно изменяющимися оттенками, которые вычисляются путем интерполяции цветов прилегающих граней. Закрашивание граней по методу Гуро осуществляется в четыре этапа.
• Вычисляются нормали к каждой грани.
• Определяются нормали в вершинах. Нормаль в вершине определяется усреднением нормалей прилегающих граней (рис. 8.6).
Рис. 8.6. Нормаль в вершине а
На основе нормалей в вершинах вычисляются значения интенсивностей в вершинах в соответствии с выбранной моделью отражения света. Закрашиваются полигоны граней цветом, который соответствует линейной интерполяции значений интенсивности в вершинах.
Вектор нормали в вершине (а) равняется
Определение интерполированных значений интенсивности отраженного света в каждой точке грани (и, следовательно, цвет каждого пиксела) удобно выполнять во время цикла заполнения полигона. Рассмотрим заполнение контура грани горизонталями в экранных координатах (рис. 8.7).
Рис. 8.7. Заполнение полигона грани
Интерполированная интенсивность I в точке (X, У) определяется, исходя из пропорции
откуда
Значение интенсивности I1 и I2 на концах горизонтального отрезка вычислим путем интерполяции интенсивности в вершинах