вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


Источники и свойства материала


Одной из задач компьютерной графики является создание реалистичных изображений. Для получения реалистичного изображения необходимо уметь моделировать источники освещения и взаимодействие света и материала моделей сцены. Существует большое количество моделей, которые можно разделить на две группы: локальные и глобальные. В библиотеке OpenGL реализована простая, но эффективная локальная модель, которая позволяет вычислить оттенок отдельной точки на некоторой поверхности. При этом учитываются только характеристики материала, локальная геометрия поверхности, расположения и свойства источников освещения. В глобальных моделях учитыватюся все участники сцены (другие поверхности, их свойства и то, что они тоже отражают свет).

Вспомним, физику и основы оптики. Поверхность материального тела может:

  • излучать световую энергию (источник);
  • отражать падающий свет (большинство объектов вокруг нас);
  • поглощать падающий свет (предельный пример -- абсолютно черное тело, которое всё поглощает);
  • пропускать свет через себя (прозрачные объекты из оптического материала).

Источник освещения характеризуется следующими параметрами: положение источника (x, y, z), направление и угол излучения, характеристики углового распределения излучения, спектральный состав. В зваисимости от характеристик можо выделить такие виды источников, как точечные, направленные, бесконечно удаленные. В обычных условиях основную долю освещения создает так называемое фоновое (ambient) освещение, создаваемое протяженными источниками, многократно отраженное от всех предметов. Это особый вид освещения, который обычно рассматривается отдельно.

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

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

Модель Фонга

В библиотеке OpenGL используется локальная модель Фонга (Phong), в которой надйен компромис между физической корректностью и объёмом необходимых вычислений. В этой модели анализируются только световые лучи, испускаемые светоизлучающими поверхностями -- источниками, и их взаимодействие с поверхностями сцены. В отличии от метода трассировки лучей здесь учитывается только одно отражение. Еще одно упрощение, которое уменьшает объём вычислений, заключается в том, что анализируются только те лучи источника, которые попадают в порт вывода.

Для вычисления цвета произвольной точки P на поверхности объекта в модели Фонга используются четыре вектора:
n -- вектор нормали к поверхности в точке P;
v -- вектор, направленный от точки P к наблюдателю;
i -- вектор, направленный от точки P к точке источника освещения;
r -- вектор идеального отражения луча падающего вдоль вектора i.

Модель Фонга позволяет описать зеркальное и диффузное отражения, а также фоновое освещение. Для этого используется упрощенная модель источника, в которой источник представляется совокупностью трёх независимых источников, излучающих свет основных цветов: L=(LR, LG, LB). При этом каждый из видов отражений рассматривается и описывается отдельно:

La=(LR, LG, LB)
Ld=(LR, LG, LB)
Ls=(LR, LG, LB)

Также отдельно определяется коэффциенты различных видов отражения для различных цветовых компонент:

Ra=(RR, RG, RB)
Rd=(RR, RG, RB)
Rs=(RR, RG, RB)

Для каждой цветовой соствляющей интенсивность точки определяется по следующей формуле:

I= (Ra*La + Rd*Ld + Rs*Ls) + Ia,

где Ia - интенсивность глобального фонового освещения.

Источники

Трудоемкость такой модели источника очень велика, поэтому практически приходится пользоваться упрощенными моделями. Библиотека OpenGL позволяет моделировать освещение следующих типов: от точечного источника (point source), от направленного источника или прожектора (spotlight), от удаленного источника (distant light) и фоновое освещение (ambient light).

Точечный удаленный источник

Точечный источник размещается в любой точке сцены с использованием функции:

GLfloat light_position[] = { 1.0, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Цвет излучения, которое претерпевает диффузное, спектральное отражение от объекта и цвет фонового излучения задается отдельно с помощью функций:

GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

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

Близкий точечный источник

Учет влияния расстояния до источника можно включить с помощью функции:

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

Изменение инетнсивности излучения источника в зависимости от расстояния до поверхности задается с помощью функции:

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);

и определяется по формуле: .

Направленный источник

Направленный источник определяется в визовых координатах сцены. Точечный источник легко превращается в направленный с помощью функций:

glMatrixMode(GL_MODELVIEW);

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);
GLfloat spot_direction[] = {.0, .0, -1.0 };
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);

При этом определяется направление, в котором излучает источник, и угол излучения. Кроме того для направленного источника можно задать степень экспоненциального падения интенсивности от центра направления илучения к краю.

glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);

Хотя можно использовать и квадратичную форму так же, как и уточечного источника.

Фоновое освещение

При создании модели освещения можно ограничиться фоновым (ambient) освещением.

GLfloat model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);

После того, как свойства освещения определены, необходимо включить освещение с помощью функции:

glEnable(GL_LIGHTING);

В OpenGL можно использовать несколько источников. Тогда после определения свойств каждого из них, необходимо каждый из них включить.

glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

Материал

При определении свойств материала поверхности необходимо помнить, что эти свойства у лицевой и изнаночной стороны поверхности эти свойства могут быть разными. Если поверхность замкнутая (например, сфера), то изнаночной поверхности не видно. В остальных случаях требуется включить режим раздельной обработки двух сторон поверхностей с помощью функции:

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

Цвет отражения фонового излучения лицевой стороной поверхности задаётся с помощью функции:

GLfloat mat_amb[] = { 0.2, 0.2, 0.2, 1.0 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_amb);

Цвет диффузного отражения изнаночной стороны поверхности задаётся с помощью функции:

GLfloat mat_dif[] = { 0.8, 0.8, 0.8, 1.0 };
glMaterialfv(GL_BACK, GL_DIFFUSE, mat_dif);

Цвет фонового и диффузного отражения двух сторон поверхности задаётся с помощью функции:

GLfloat mat_amb_diff[] = { 0.1, 0.5, 0.8, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff);

Цвет зеркального отражения лицевой стороной поверхности задаётся с помощью функции:

GLfloat mat_spec[] = { 1., 1., 1., 1.0 };
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_spec);

Степенью соотношением диффузного и зеркального отражения можно управлять задавая шероховатость поверхности:

GLfloat low_shininess[] = { 50.0 };
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);

В сцену можно включить поверхность источника. Для этого можно использовать функцию для определения излучательных свойств поверхности:

GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);

Таким образом, используя упрощённую модель Фонга тем не меннее можно определять свойства источников и материалов, учитывать их при определении цвета точек изображения и получать реалистичные изображения.