Главная » Free Pascal » Световые характеристики материала Free Pascal

0

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

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

glMaterialfv(face, name_par, v);     // установка характеристик glGetMaterialfv(face, name_par, v);  // опрос характеристик материала

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

± GL_FRONT — передняя (по отношению к источнику света) грань;

± GL_BACK — задняя (по отношению к источнику света) грань;

± GL_FRONT_AND_BACK — передняя и задняя грань.

Задание материала только передней грани позволяет сократить время ренде- ринга, т. к. в этом случае не производится никаких вычислений, связанных с осве- щенностью задней грани. Перечень имен параметров, значения компонентов кото- рых задаются четырехкомпонентными векторами, приведен в табл. 16.6. В отличие от модели источника света, значения коэффициентов отражения задаются в диапа- зоне [–1, +1].

Таблица 16.6

Имя параметра

Смысл и значение параметра

GL_AMBIENT

Коэффициенты отражения RGB-лучей фонового излучения, обычно задаваемые вектором (RkA, GkA, BkA, 1). По умолчанию — (0.2, 0.2, 0.2, 1.0)

Таблица 16.6 (окончание)

Имя параметра

Смысл и значение параметра

GL_DIFFUSE

Коэффициенты отражения RGB-лучей диффузного излучения, обычно задаваемые вектором (RkD, GkD, BkD, 1). По умолчанию — (0.8, 0.8, 0.8, 1.0)

GL_SPECULAR

Коэффициенты отражения RGB-лучей зеркального излучения, обычно задаваемые вектором (RkS, GkS, BkS, 1). По умолчанию — (0, 0, 0, 1)

GL_EMISSION

Интенсивность собственного свечения грани (например, покрытой светящимся слоем). По умолчанию — (0, 0, 0, 1)

GL_AMBIENT_AND_DIFFUSE

Экономное задание при совпадении значений двух параметров (для фонового и диффузного излучений)

В листинге 16.10 приводится пример взаимодействия единственного источника света с гранями вращающегося куба. Идею примера нам подсказал один из уроков по OpenGL, обнаруженный в Интернете, но предлагаемый нами вариант програм- мы вдвое короче.

   Листинг 1 6 .1 0 .  Использование  источник а  света                                                                         

program light;

{$mode objfpc} uses

gl, glu, glut; var

angle: single = 0; step : single = 0.1;

diffuseL: array[0..3] of single = (0.8, 0.8, 0.8, 1);

//——————————————————–

procedure OnRedraw; cdecl; begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glLoadIdentity; glTranslatef(0, 0, -5);

glRotatef(angle, 1, 0, 0);

glRotatef(angle, 0, 1, 0);

glRotatef(angle, 0, 0, 1);

glColor3f(1, 1, 1); glutSolidCube(2); angle := angle + step;

glutSwapBuffers; end;

//——————————————————–

procedure OnResize(W, H: integer); cdecl; begin

glViewport(0, 0, W, H); glMatrixMode(GL_PROJECTION); glLoadIdentity;

gluPerspective(45, W / H, 0.1, 1000); glMatrixMode(GL_MODELVIEW);

end;

//———————————————————

begin

glutInit(@argc,argv);

glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH); glutCreateWindow(‘Rotating Cube + Light’);

glClearColor(0, 0.8, 0.2, 0);

glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING);  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseL); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glutDisplayFunc(@OnRedraw); glutReshapeFunc(@OnResize); glutIdleFunc(@OnRedraw);

glutMainLoop;

end.

Рис. 16.9. Освещенный куб

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

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии