□ Края поверхностей, силуэт и неоднородности поверхности объекта обычно рисуют черными кривыми линиями.

□ Для освещения используется один простой источник, который излучает на объекты белый свет.

□ Источник освещения обычно находится сверху объекта, и рассеянное отражение от видимой поверхности объекта находится в диапазоне [0, 1].

□ Сложные и реалистичные эффекты, а именно тени, отражения и многочисленные источники освещения, не показаны.

□ Матовые объекты затеняются с интенсивностью, не близкой ни к белому, ни к черному цвету, так что их цвет будет отличаться и от черных линий края, и от белой подсветки.

□ Теплота или холодность цвета показывает нормаль поверхности (и кривизну поверхности).

Эти характеристики были использованы в алгоритме, называемом заливка Гуча. Один из важных аспектов заливки Гуча - выделение нужных граней черными линиями. Есть несколько методов рисования таких линий. Лучше всего определить эти линии сможет человек, который будет создавать модель. В этом случае края можно рисовать как сглаженные черные линии, которые нанесены непосредственно на поверхность объекта (то есть проводится второй рендеринг, которые рисует линии уже после завершения основного рендеринга).

Если контурные линии все же не были заданы при моделировании, есть несколько способов создать их автоматически. Качество результата во многом зависит от использованного метода и от характеристик объектов. Внутренние края или сгибы также нужно прорисовывать, иногда это очень важно для восприятия. Метод определения внутренних краев и сгибов включает в себя использование вершинных и фрагментных шейдеров для записи нормалей и значений глубины в буфер кадров. Результат сохраняется в текстуре, и последующий рендеринг другими вершинным и фрагментным шейдерами может использовать алгоритм определения края на этом «изображении».

Метод рисования силуэтных линий для простых объектов, описанный Джеффом Лендером в книге [11], требует двойного прохода при рисовании. Сначала рисуют только многоугольники передних граней, а режим глубины устанавливается в GL_LESS. Шейдеры Гуча при этом активны. Затем рисуют задние многоугольники простыми линиями, а режим глубины при этом установлен в GL_LEQUAL. Эти линии будут нарисованы черным с помощью стандартной функциональности OpenGL, а как сделать правильные вызовы, показано в листинге 15.3.

Листинг 15.3. Код на языке С для рисования силуэтов простых объектов

// Включить отбраковку glEnable(GL_CULL_FACE):

// Рисовать передние грани как заполненные с помощью шейдера Гуча

glPolygonMode(GL_FRONT, GL_FILL):

glDepthFunc(GL_LESS):

gl Си 11 Face(GL_BACK);

glUseProgramObjectARB(ProgramObject);

drawSphere(0.6f. 64);

// Рисовать задние грани черными контурами обычными вызовами OpenGL

glLi neWi dth(5.0);

gl PolygonMode(GL_BACK. GL_LINE):

glDepthFunc(GL_LEQUAL);

glCul 1 Face(GL_FRONT);

glColor3f(0.0. 0.0. 0.0):

glUseProgramObjectARB(O);


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