drawSphere(0.6f. 64); Второй аспект заливки Гуча - то, что рассеянное освещение вычисляется по методу Фонга, и его цветом является белый. Освещение дает информацию о кривизне поверхности, и выбор белого цвета гарантирует, что освещенные области будут отличаться от контурных черных линий и от цветов заливки объекта (обычно они не черные и не белые).

Третий аспект алгоритма - ограниченный диапазон значений яркости, используемых для подчеркивания кривизны поверхности объекта. Эта часть заливки выполняется с использованием цвета объекта, и обычно это среднее значение, которое не сливается ни с черным, ни с белым цветом.

Так как диапазон значений яркости ограничен, переход цвета от теплого к холодному тоже используется для передачи информации о поверхности объекта. Художники применяют теплые (желтый, красный, оранжевый) и холодные (синий, фиолетовый, зеленый) цвета, чтобы правильно передать глубину. Теплые цвета, визуально приближающие объект, больше подходят для ближних объектов. Холодные цвета, визуально отдаляющие объект, больше подходят для объектов, расположенных на заднем плане.

Заливка объектов зависит от двух коэффициентов. Коэффициент рассеянного отражения нужен для вычисления значений в ограниченном диапазоне для заливки. Вторым коэффициентом является полоска перехода между двумя разными цветами. Один из этих цветов будет холодный, имитирующий удаление поверхности, второй - теплый, имитирующий приближение поверхности. Полоса перехода цветов от холодного к теплому получается полутоновая, вне зависимости от основного цвета объекта.

15.2.1. Настройка приложения Этот алгоритм является двухпроходным (все геометрические объекты рисуются дважды). Используем в нем метод Лендера для рисования черных силуэтных линий. За первый проход многоугольники задней поверхности отбрасываются, а рендеринг многоугольников передней поверхности выполняется шейдером Гуча. За второй проход отбрасываются многоугольники передней поверхности и с помощью стандартной функциональности OpenGL черным цветом рисуются контуры задних прямоугольников. Если рисовать контуры линией толще одного пиксела, они будут выходить за края объекта. Чтобы этот шейдер работал правильно, нужно передавать координаты вершин и нормали поверхности в вершинный шейдер.

15.2.2. Вершинный шейдер

Назначение вершинного шейдера Гуча - выдавать значение для выражения (1 + NL)/2 и передавать вектор отражения и вектор обзора, так что рассеянное отражение можно вычислять во фрагментном шейдере (листинг 15.4). Другие элементы шейдера такие же, как в предыдущих.

Листинг 15.4. Вершинный шейдер для матовой заливки Гуча

uniform vec3 LightPosition: // (0.0. 10.0. 4.0)

varying float NdotL: varying vec3 ReflectVec; varying vec3 ViewVec:

void main(void)

{

vec3 ecPos = vec3 (gl_Mode1ViewMatrix * gl_Vertex);

vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);

vec3 lightVec = normalize(LightPosition - ecPos):


⇐ вернуться назад | | далее ⇒