14575

Использование источников света в OpenGL и свойств материала

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №6 Использование источников света в OpenGL и свойств материала. 1.Описание источников света в OpenGL. В системе OpenGl поддерживаются источники света четырех типов: фонового освещения ambient lighting точечные источники point sources прожекторы spotlights удален

Русский

2013-06-08

70 KB

15 чел.

Лабораторная работа №6

Использование источников света в OpenGL и свойств материала.

1.Описание источников света в OpenGL.

В системе OpenGl поддерживаются источники света четырех типов: фонового освещения (ambient lighting), точечные источники (point sources), прожекторы (spotlights), удаленные источники света (distant light).  В одной программе может использоваться до восьми источников света. Каждый источник света имеет свой набор параметров, в том числе программный код включения/выключения. Параметры, описывающие источник света, соответствуют параметрам модели Фонга. Для установки векторных параметров используется функция glLightfv(), которая имеет следующий формат обращения:

glLightfv(source, parameter,  pointer_to_array);

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

Для установки скалярных параметров в OpenGL служит функция glLightf():

glLightf(source, parameter, value);

 Пусть, например, требуется включить в сцену источник GL_LIGHT0, который должен находиться в точке (1.0, 2.0, 3.0). положение источника сохраняется в программе в виде точки в однородных координатах:

 GLfloat light0_pos[]={1.0, 2.0, 3.0, 1.0};

 Если четвертый компонент этой точки равен нулю, то точечный источник превращается в удаленный,  для которого существенно только направление лучей:

 GLfloat light0_dir[]={1.0, 2.0, 3.0, 0.0};

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

 GLfloat diffise0[]= {1.0, 0.0, 0.0, 1.0};

GLfloat ambient0[]={1.0, 0.0, 0.0, 1.0};

GLfloat specular0[]={1.0, 1.0, 1.0, 1.0};

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);

glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);

glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);

glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);

 Функция glEnable() вызывается дважды: сначала для включения режима анализа освещения, а затем для включения в сцену конкретного источника.

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

 GLfloat global_ambient[]={0.1, 0.1, 0.1, 1.0};

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

 

 В модели освещения член, учитывающий расстояние до источника имеет вид:

f(d)= 1/(a+ b*d+ c*d^2)

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

 glLightf(GL_LIGHT0, GL_CONSTANT_ATTENATION, a);

 Для преобразование точечного источника в прожектор нужно задать направление луча прожектора (GL_SPOT_DIRECTION), показатель функции распределения интенсивности (GL_SPOT_EXPONENT) и угол рассеяния луча (GL_SPOT_CUTTOF). Эти параметры устанавливаются с помощью функций glLightf() и glLightfv().

 Параметры, устанавливаемые для источников света по умолчанию приведены в таблице 1-1.

Table 1-1 : Default Values for parameter Parameter of glLight*()

Parameter Name

Default Value

Meaning

GL_AMBIENT

(0.0, 0.0, 0.0, 1.0)

ambient RGBA intensity of light

GL_DIFFUSE

(1.0, 1.0, 1.0, 1.0)

diffuse RGBA intensity of light

GL_SPECULAR

(1.0, 1.0, 1.0, 1.0)

specular RGBA intensity of light

GL_POSITION

(0.0, 0.0, 1.0, 0.0)

(x, y, z, w) position of light

GL_SPOT_DIRECTION

(0.0, 0.0, -1.0)

(x, y, z) direction of spotlight

GL_SPOT_EXPONENT

0.0

spotlight exponent

GL_SPOT_CUTOFF

180.0

spotlight cutoff angle

GL_CONSTANT_ATTENUATION

1.0

constant attenuation factor

GL_LINEAR_ATTENUATION

0.0

linear attenuation factor

GL_QUADRATIC_ATTENUATION

0.0

quadratic attenuation factor

2. Спецификация материалов в OpenGL.

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

 glMaterialfv(face, type, pointer_to_array);

glMaterilf(face, type, value);

 Для определения коэффициентов отражения для фоновой, диффузионной и зеркальной составляющих (ka, kd, ks) по каждому из первичных цветов в программу нужно включить определение трех массивов:

 GLfloat ambient[]= {0.2, 0.2, 0.2, 1.0};

GLfloat diffise[]= {1.0, 0.8, 0.0, 1.0};

GLfloat specular[]= {1.0, 1.0, 1.0, 1.0};

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

glMaterialfv(G_FRONT_AND_BACK, GL_AMBIENT, ambient);

glMaterialfv(G_FRONT_AND_BACK, GL_DIFFUSE, diffuse);

glMaterialfv(G_FRONT_AND_BACK, GL_SPECULAR, specular);

 Если параметры для зеркальной и диффузионной составляющих  одинаковы, то можно задавать их одним вызовом функции glMaterialfv(), передав ей в качестве параметра type константу GL_DIFFUSE_AND_SPECULAR. При индивидуальном определении параметров материалов для внутренней и внешней стороны в качестве аргумента face используются соответственно константы GL_FRONT и GL_BACK.

Коэффициент резкости бликов- показатель степени зеркального отражения в модели Фонга- задается вызовом функции glMaterialfv(), которой в качестве параметра  type передается константа GL_SHININESS:

glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 100);

Свойства материала являются параметрами режима- их текущие значения ассоциируются со всеми объектами, задаваемыми в программе, до тех пор, пока не будут изменены с помощью функций glMaterilfv() или glMaterialf().

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

GLfloat emission[]={0.0, 0.3, 0.3, 1.0};

glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission);

 Параметры, устанавливаемые для свойств материалов по умолчанию приведены в таблице 1-2.

Table 1-2 : Default Values for type Parameter of glMaterial*()

Parameter Name

Default Value

Meaning

GL_AMBIENT

(0.2, 0.2, 0.2, 1.0)

ambient color of material

GL_DIFFUSE

(0.8, 0.8, 0.8, 1.0)

diffuse color of material

GL_AMBIENT_AND_DIFFUSE

ambient and diffuse color of material

GL_SPECULAR

(0.0, 0.0, 0.0, 1.0)

specular color of material

GL_SHININESS

0.0

specular exponent

GL_EMISSION

(0.0, 0.0, 0.0, 1.0)

emissive color of material

GL_COLOR_INDEXES

(0,1,1)

ambient, diffuse, and specular color indices

3.Пример программы, использующей источник света и свойства материала.

#include <GL/glut.h>

#include <stdlib.h>

/*  Initialize material property, light source, lighting model,

*  and depth buffer.

*/

void init(void)

{

  GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };

  GLfloat mat_shininess[] = { 50.0 };

  GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

  glClearColor (0.0, 0.0, 0.0, 0.0);

  glShadeModel (GL_SMOOTH);

  glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

  glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

  glLightfv(GL_LIGHT0, GL_POSITION, light_position);

  glEnable(GL_LIGHTING);

  glEnable(GL_LIGHT0);

  glEnable(GL_DEPTH_TEST);

  glEnable(GL_COLOR_MATERIAL);

}

void display(void)

{

  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColor3f(1.0,0.0,0.0);

  glutSolidSphere (1.0, 20, 16);

  glFlush ();

}

void reshape (int w, int h)

{

  glViewport (0, 0, (GLsizei) w, (GLsizei) h);

  glMatrixMode (GL_PROJECTION);

  glLoadIdentity();

  if (w <= h)

     glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,

        1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);

  else

     glOrtho (-1.5*(GLfloat)w/(GLfloat)h,

        1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);

  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity();

}

void keyboard(unsigned char key, int x, int y)

{

  switch (key) {

     case 27:

        exit(0);

        break;

  }

}

int main(int argc, char** argv)

{

  glutInit(&argc, argv);

  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

  glutInitWindowSize (500, 500);

  glutInitWindowPosition (100, 100);

  glutCreateWindow (argv[0]);

  init ();

  glutDisplayFunc(display);

  glutReshapeFunc(reshape);

  glutKeyboardFunc(keyboard);

  glutMainLoop();

  return 0;

}

4. Задание на лабораторную работу.

  1.  Отладить программу, приведенную в п.3.
  2.  Отключить все источники света, кроме глобального фонового освещения.
  3.  Добавить точечный источник света.
  4.  Превратить точечный источник света в прожектор.
  5.  Изменить свойства материала в соответствии с вариантом, заданным преподавателем Параметры источника освещения задаются следующим фрагментом программы:

void init(void)

{

  GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };

  GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };

  GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };

  GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };

  GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };

  GLfloat local_view[] = { 0.0 };

  glClearColor(0.0, 0.1, 0.1, 0.0);

  glEnable(GL_DEPTH_TEST);

  glShadeModel(GL_SMOOTH);

  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);

  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);

  glLightfv(GL_LIGHT0, GL_POSITION, position);

  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);

  glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);

  glEnable(GL_LIGHTING);

  glEnable(GL_LIGHT0);

}

Варианты, задающие свойства материала:

 

Вари-ант

Диффузионная

cоставляющая

(GL_DIFFUSE)

Зеркальная составляющая

(GL_SPECULAR)

Фоновая составляющая

(GL_AMBIENT)

Коэффициент

резкости бликов

(GL_SHININESS)

Эмиссионные

свойства

(GL_EMISSION)

1

0.7, 0.7, 0.7, 1.0

0.0, 0.0, 0.0, 1.0

0.0, 0.0, 0.0, 1.0

0.0

0.0, 0.0, 0.0, 1.0

2

0.1, 0.5, 0.8, 1.0

1.0, 1.0, 1.0, 1.0

0.0, 0.0, 0.0, 1.0

100.0

0.0, 0.0, 0.0, 1.0

3

0.1, 0.5, 0.8, 1.

1.0, 1.0, 1.0, 1.0

0.0, 0.0, 0.0, 1.0

5.0

0.0, 0.0, 0.0, 1.0

4

0.1, 0.5, 0.8, 1.0

0.0, 0.0, 0.0, 1.0

0.0, 0.0, 0.0, 1.0

0.0

0.3, 0.2, 0.2, 0.0

5

0.1, 0.5, 0.8, 1.0

0.0, 0.0, 0.0, 1.0

0.7, 0.7, 0.7, 1.0

0.0

0.0, 0.0, 0.0, 1.0

6

0.1, 0.5, 0.8, 1.0

1.0, 1.0, 1.0, 1.0

0.7, 0.7, 0.7, 1.0

5.0

0.0, 0.0, 0.0, 1.0

7

0.1, 0.5, 0.8, 1.0

1.0, 1.0, 1.0, 1.0

0.7, 0.7, 0.7, 1.0

100.0

0.0, 0.0, 0.0, 1.0

8

0.1, 0.5, 0.8, 1.0

0.0, 0.0, 0.0, 1.0

0.7, 0.7, 0.7, 1.0

0.0

0.3, 0.2, 0.2, 0.0

9

0.1, 0.5, 0.8, 1.0

0.0, 0.0, 0.0, 1.0

0.8, 0.8, 0.2, 1.0

0.0

0.3, 0.2, 0.2, 0.0

10

0.1, 0.5, 0.8, 1.0

1.0, 1.0, 1.0, 1.0

0.8, 0.8, 0.2, 1.0

5.0

0.0, 0.0, 0.0, 1.0