Приведем формулы для вычислений цветов в заливке Гуча:
^агт _ ^ус11о\у + Р^сШше ;
-1 2 I С01>| +1 2 ] ™ '
Здесь ксоы - цвет неосвещенных областей. Это значение вычисляется добавлением голубого полутона и рассеянного цвета объекта, &<ш,5е. Значение а является переменной, определяющей, как много рассеянного цвета будет добавлено к голубому полутону. АЛагт - цвет полностью освещенных областей. Это значение вычисляется как сумма желтого полутона и рассеянного цвета объекта с коэффициентом р.
Окончательный цвет получается в результате линейного перехода между цветами &с<ю1 и £*агт, основанного на диффузном отражении М., где М - нормализованная нормаль поверхности, а I - единичный вектор, направленный к источнику освещения. Так как М, может меняться в диапазоне [-1, 1], добавим к нему 1 и разделим результат на 2, чтобы получить значение в диапазоне [0, 1]. Затем по этому значению определяются пропорции ксоо] и &„агш для вычисления окончательного цвета.
15.2.1. Настройка приложения Этот алгоритм является двухпроходным (все геометрические объекты рисуются дважды). Используем в нем метод Лендера для рисования черных силуэтных ли15.2. Примеры технических иллюстраций ний. За первый проход многоугольники задней поверхности отбрасываются, а рендеринг многоугольников передней поверхности выполняется шейдером Гуча. За второй проход отбрасываются многоугольники передней поверхности и с помощью стандартной функциональности OpenGL черным цветом рисуются контуры задних прямоугольников. Если рисовать контуры линией толще одного пиксела, они будут выходить за края объекта. Чтобы этот шейдер работал правильно, нужно передавать координаты вершин и нормали поверхности в вершинный шейдер.
15.2.2. Вершинный шейдер
Назначение вершинного шейдера Гуча - выдавать значение для выражения (1 + NL)/2 и передавать вектор отражения и вектор обзора, так что рассеянное отражение можно вычислять во фрагментном шейдере (листинг 15.4). Другие элементы шейдера такие же, как в предыдущих.