Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СКТ - 5,6сем.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.67 Mб
Скачать

Свойства материала и модель освещения

Свойства материала задаются с помощью команды glMaterialfv. Характеристики следующие:

GL_AMBIENT Рассеянный или фоновый свет;

GL_DIFFUSE Диффузный свет;

GL_SPECULAR Зеркальный свет;

GL_EMISSION Излучаемый свет;

GL_SHININESS Степень зеркального отражения.

Чтобы цветовой фильтр не перебивал задаваемые свойства, не включать режим GL_COLOR_MATERIAL.

Параметры команды glMaterialfv:

  1. лицевая поверхность (GL_FRONT), обратная (GL_BACK), и та и другая (GL_FRONT_AND_BACK).

  2. Характеристика материала

  3. Массив цветовой гаммы

Модель освещения задается командой glLightModelfv. Кроме того, в примере ниже источник света смещен с помощью массива position и команды glLight.

procedure TfrmGL.FormPaint(Sender: TObject);

const MaterialCyan: Array[0..3] of GLfloat=(0.0,1.0,1.0,0.0);

position : array[0..3] of GLfloat = ( 0.0, 3.0, 2.0, 0.0 );

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glPushMatrix;

glLightfv(GL_LIGHT0, GL_POSITION, @position);

//или задание свойств материала glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MaterialCyan);

// или установка модели освещения

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@MaterialCyan);

//здесь первый пар-р – задание полной фоновой интенсивности света

glutSolidSphere (1.5, 20, 20);

glPopMatrix;

SwapBuffers(DC);

end;

Команда glLight может задавать диффузную и фоновую составляющие света:

glLightfv(GL_LIGHT0, GL_diffuse, @light_diffuse);

Следующая команда удаляет гладкость форм:

glShadeModel(gl_flat);

Хороший пример блика на сфере:

procedure TfrmGL.FormPaint(Sender: TObject);

const MaterialCyan: Array[0..3] of GLfloat=(0.0,1.0,1.0,1.0);

position : array[0..3] of GLfloat = ( 0.0, 3.0, 2.0, 0.0 );

dif : array[0..3] of GLfloat = ( 0.0, 0.8, 1.0, 1.0 );

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glPushMatrix;

glLightfv(GL_LIGHT0, GL_position, @position);

glMaterialfv(GL_FRONT, GL_DIFFUSE, @dif);

glMaterialfv(GL_FRONT, GL_SPECULAR, @MaterialCyan);

glMaterialf(GL_FRONT, GL_SHININESS, 25.0);

glutSolidSphere (1.5, 20, 20);

glPopMatrix;

SwapBuffers(DC);

end;

Отсечение

Для отсечения части объекта необходимо задать координаты плоскости отсечения:

Const eqn : Array [0..3] of GLdouble = (1.0, 0.0, -1.0, 1.0);

И затем использовать:

glClipplane(gl_clip_plane0,@eqn);

glEnable(gl_clip_plane0);

Тогда можно задавать различные материалы для внешней и внутренней поверхностей:

glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1); режим расчета освещенности для обеих сторон поверхности

glMaterialfv(GL_front, GL_DIFFUSE, @dif);

glMaterialfv(GL_back, GL_DIFFUSE, @back_dif);

Туман

Цвет дыма задается серым:

Const fogColor : array[0..3] of GLfloat = ( 0.5, 0.5, 0.5, 1.0 );

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glPushMatrix;

glEnable(GL_FOG); // включаем режим тумана

fogMode := GL_EXP; // переменная, хранящая режим тумана (типа glint)

glFogi(GL_FOG_MODE, fogMode); // задаем закон смешения тумана

glFogfv(GL_FOG_COLOR, @fogColor); // цвет дымки

glFogf(GL_FOG_DENSITY, 0.35); // плотность тумана

glHint(GL_FOG_HINT, GL_DONT_CARE); //предпочтений к работе тумана нет

Вместо использования переменной fogMode можно указывать конкретные законы: GL_LINEAR, GL_EXP2, GL_EXP.