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


 

А также другие работы, которые могут Вас заинтересовать

16671. ПРАВО УДЕРЖАНИЯ ПРОТИВ ТРЕБОВАНИЙ О РЕСТИТУЦИИ И ВИНДИКАЦИИ ВЕЩИ 27.77 KB
  ТАК ДЕРЖАТЬ О ПРАВЕ УДЕРЖАНИЯ ПРОТИВ ТРЕБОВАНИЙ О РЕСТИТУЦИИ И ВИНДИКАЦИИ ВЕЩИ К. СКЛОВСКИЙ Константин Скловский адвокат доктор юридических наук. Значительная часть судебных споров имеет своим предметом возврат имущества отчужденного по недействител...
16672. ВСЕ НА ПРОДАЖУ 15.6 KB
  ВСЕ НА ПРОДАЖУ К. СКЛОВСКИЙ К. Скловский адвокат доктор юридических наук. Различные аспекты реализации имущества должника с торгов не раз рассматривались в юридической литературе. Однако судебная практика свидетельствует что проблемы и противоречия остаютс...
16673. ВЛАДЕТЬ ИМЕЕМ ПРАВО 12.59 KB
  ВЛАДЕТЬ ИМЕЕМ ПРАВО К. СКЛОВСКИЙ Начиная с 1997 г. когда судебная практика впервые обнаружила проблему незащищенности добросовестного приобретателя имущества мне многократно приходилось обращаться к этой теме Закон. N 12. 1997. Более подробно вопрос рассматривался в ...
16674. ПРИОБРЕТАТЕЛЬНАЯ ДАВНОСТЬ 15.68 KB
  ПРИОБРЕТАТЕЛЬНАЯ ДАВНОСТЬ К. СКЛОВСКИЙ К. Скловский член Ставропольской краевой коллегии адвокатов кандидат юридических наук. Недавно возвращенная в наше законодательство приобретательная давность бывшая и прежде по словам известного российского цивилис...
16675. ДОГОВОР КУПЛИ - ПРОДАЖИ: ВЕЩНЫЙ ЭФФЕКТ 20.08 KB
  ДОГОВОР КУПЛИ ПРОДАЖИ: ВЕЩНЫЙ ЭФФЕКТ К. СКЛОВСКИЙ К. Скловский член Ставропольской краевой коллегии адвокатов кандидат юридических наук. Важное место в гражданском праве занимают договоры о передаче вещи в собственность иногда называемые договорами с реал
16676. ЗАЩИТА ВЛАДЕНИЯ ПРИ ПРИЗНАНИИ ДОГОВОРА НЕДЕЙСТВИТЕЛЬНЫМ 24.08 KB
  ЗАЩИТА ВЛАДЕНИЯ ПРИ ПРИЗНАНИИ ДОГОВОРА НЕДЕЙСТВИТЕЛЬНЫМ К. СКЛОВСКИЙ К. Скловский член Ставропольской краевой коллегии адвокатов кандидат юридических наук. Возрождение в нашем законодательстве приобретательной давности ст. 234 ГК не может не привести к ради...
16677. ЗАЩИТА ВЛАДЕНИЯ ОТ ИЗЪЯТИЯ В АДМИНИСТРАТИВНОМ ПОРЯДКЕ 18.72 KB
  ЗАЩИТА ВЛАДЕНИЯ ОТ ИЗЪЯТИЯ В АДМИНИСТРАТИВНОМ ПОРЯДКЕ К. СКЛОВСКИЙ К. Скловский адвокат кандидат юридических наук. Юристы только начинают обсуждать вопросы защиты владения как такового и при отсутствии в нашем законодательстве отдельной владельческой защ...
16678. О ПОСЛЕДСТВИЯХ СОВЕРШЕНИЯ РУКОВОДИТЕЛЕМ СДЕЛОК ВОПРЕКИ ИНТЕРЕСАМ ОРГАНИЗАЦИИ 24.96 KB
  О ПОСЛЕДСТВИЯХ СОВЕРШЕНИЯ РУКОВОДИТЕЛЕМ СДЕЛОК ВОПРЕКИ ИНТЕРЕСАМ ОРГАНИЗАЦИИ К. СКЛОВСКИЙ К. Скловский адвокат кандидат юридических наук. Одной из наиболее острых проблем корпоративного права становится отсутствие эффективных частноправовых средств про
16679. КВАЛИФИКАЦИЯ ОТНОШЕНИЙ ПО ЗАСТРОЙКЕ И ПРАВО НА ОБЪЕКТ СТРОИТЕЛЬСТВА В СУДЕБНОЙ ПРАКТИКЕ 29.92 KB
  КВАЛИФИКАЦИЯ ОТНОШЕНИЙ ПО ЗАСТРОЙКЕ И ПРАВО НА ОБЪЕКТ СТРОИТЕЛЬСТВА В СУДЕБНОЙ ПРАКТИКЕ К. СКЛОВСКИЙ К. Скловский кандидат юридических наук. Судебные споры вытекающие из договоров о застройке составляя значительную часть рассматриваемых арбитражными суд