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

0

Для повышения реалистичности сцены можно воспользоваться источниками света. Стандартная версия OpenGL предоставляет пользователю до 8 источников света, для обозначения которых используются константы перечисления GL_LIGHT0, GL_LIGHT1, …, GL_LIGHT7. Подключение одного или нескольких источников света осуществляется в два этапа. Сначала нужно разрешить режим использования осве- щения:

glEnable(GL_LIGHTING);   // разрешение режима освещения

Каждый источник света включается индивидуально:

glEnable(GL_LIGHT0);     // включение "лампы" с номером 0

Точечный источник света равномерно распространяет все компоненты своего излучения по любому направлению в пространстве. Прожектор имеет более узкий конус излучения с ослаблением интенсивности луча по мере отклонения от его главной оси.

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

Таблица 16.5

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

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

GL_POSITION

Положение источника света, обычно задаваемое одним из векторов (x, y, z, 0) или (x, y, z, 1)

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

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

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

GL_AMBIENT

Интенсивность излучения фоновой компоненты источника, обычно задаваемая вектором (RIA, GIA, BIA, 1)

GL_DIFFUSE

Интенсивность излучения диффузной компоненты источника, обычно задаваемая вектором (RID, GID, BID, 1)

GL_SPECULAR

Интенсивность излучения зеркальной компоненты источника, обычно задаваемая вектором (RIS, GIS, BIS, 1)

GL_SPOT_DIRECTION

Направление излучения прожектора, задаваемое компонентами вектора главной оси излучения

GL_SPOT_EXPONENT

Показатель функции распределения интенсивности излучения

GL_SPOT_CUTOFF

Угол рассеяния, задаваемый в градусах по каждой координатной оси

Четвертая составляющая в позиции источника света определяет удаленность источника от освещаемой сцены. Нулевое значение соответствует бесконечно уда- ленному источнику света, для которого все лучи, достигающие сцены, имеют оди- наковое направление. Угол попадания лучей на освещаемый объект, естественно, может оказать влияние на тень, для построения которой используется соответст- вующий режим.

Интенсивности того или иного излучения задаются для каждой RGB-состав- ляющей из диапазона от 0 (минимальное значение интенсивности) до 1 (макси- мальное значение интенсивности).

Показатели функции распределения интенсивности в прожекторе задаются от

–1 (минимум) до 1 (максимум).

Для задания значений характеристик параметра с именем name_par разумно воспользоваться векторной модификацией процедуры glLightfv:

var

v:array [0..3] of single = (val1,val2,val3,val4);

begin

glLightfv(GL_LIGHTk,name_par,v);   // k – номер источника

Опрос значений характеристик, установленных по умолчанию, можно осущест- вить с помощью процедуры glGetLightfv:

glGetLightfv(GL_LIGHTk, name_par, v);

В наиболее простых программах, использующих режим освещенности, обычно задействуется единственный источник — GL_LIGHT0. В листинге 16.9 приводится текст программы LIGHT_0.pas, которая выводит значения параметров этого источ- ника света.

   Листинг 1 6 .9 .  Опро с  пар а ме тро в  источ ник а  с вета                                                                      

program LIGHT_0;

{$mode objfpc} uses

gl, glu, glut; var

v:array [0..3] of single; procedure print(s:string); begin

write(s,'(‘,v[0]:3:1,’, ‘,v[1]:3:1,’, ‘);

writeln(v[2]:3:1,’, ‘,v[3]:3:1,’)’);

end;

begin

glutInit(@argc,argv); glutCreateWindow(‘LIGHT0 parameters’);

writeln(‘Параметры источника света GL_LIGHT0 по умолчанию:’); glGetLightfv(GL_LIGHT0,GL_POSITION,v);

print(‘Position = ‘); glGetLightfv(GL_LIGHT0,GL_AMBIENT,v); print(‘Ambient = ‘); glGetLightfv(GL_LIGHT0,GL_DIFFUSE,v); print(‘Diffuse = ‘); glGetLightfv(GL_LIGHT0,GL_SPECULAR,v); print(‘Specular = ‘); glGetLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,v); print(‘Spot Direction = ‘); glGetLightfv(GL_LIGHT0,GL_SPOT_EXPONENT,v); print(‘Spot Exponent = ‘); glGetLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,v); print(‘Spot Cutooff  = ‘);

readln; end.

Результаты ее работы выглядят следующим образом:

Running "e:\fpc\myprog\LIGHT_0.exe "

Параметры источника света GL_LIGHT0 по умолчанию: Position = (0.0, 0.0, 1.0, 0.0)

Ambient = (0.0, 0.0, 0.0, 1.0)

Diffuse = (1.0, 1.0, 1.0, 1.0)

Specular = (1.0, 1.0, 1.0, 1.0)

Spot Direction = (0.0, 0.0, -1.0, 1.0)

Spot Exponent = (0.0, 0.0, -1.0, 1.0)

Spot Cutooff  = (180.0, 0.0, -1.0, 1.0)

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

По теме:

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