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


 

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

85457. Леся Українка «Біда навчить» 167 KB
  Серед лиха співати пісні Без надії таки сподіватись Буду жити Геть думи сумні Як це пов’язано з нашою казкою яку ми розпочали вивчати Горобчику також довелось посумувати перш ніж він став мудрим. Пригадайте нашого горобчика перегляд фрагменту мультфільму Некмітливий горобець.
85458. ВИДИ КАЗОК. СКЛАДАННЯ КАЗОК ЗА ОПОРНОЮ СХЕМОЮ 39.5 KB
  Оголошення теми уроку. Добрий день. Сьогодні у нас цікава і незвичайна тема уроку. Ми будемо грати у казку, ознайомимося з видами казок і створимо свою власну казку за опорною схемою. Розповідь вчителя з елементами бесіди (презентація проекту).
85459. «Путешествие в Книгоград» (экскурсия в библиотеку) 55 KB
  Умными словами недаром сказано: Всем лучшим книге мы обязаны Книги читают стар и млад Книжке хорошей каждый рад. Книги читаю значит мыслю Мыслю значит живу а не кисну. Что же в них хранили Книги В Египте написанные на папирусе в Междуречье выцарапанные на глиняных табличках в Индии составленные...
85460. Чарівна осінь 64 KB
  Мета: Удосконалювати навички виразного читання збагачувати лексичний запас учнів; учити порівнювати художні твори; формувати естетичні смаки; розвивати уяву спостережливість; виховувати бережливе ставлення до природи. Мотивація навчальної діяльності: а Виразне читання вірша вчителем...
85461. М.Коцюбинський. Харитя 52 KB
  Мета. Удосконалювати навички виразного читання; розвивати вміння орієнтуватися у структурі оповідання, придумувати заголовки, розвивати навички елементарного аналізу художнього твору, давати характеристику дійовим особам твору, збагачувати словниковий запас, розвивати мовлення...
85462. Життєвий і творчий шлях І.Я.Франка. І.Я.Франко «Дивувалася зима» 43.5 KB
  Мета. Поглибити знання учнів про життя і творчість Івана Яковича Франка; вчити виразно читати вірші, формувати вміння аналізувати віршовані твори, виховувати через образне слово почуття любові до свого народу, до України, рідної мови.
85463. «Два брехуни одної правди не кажуть», або «Рука руку миє, нога ногу підпирає». Порівняльний опис байки Л.І. Глібова «Зозуля й півень» та байки І.А. Крилова «Зозуля й півень» 188 KB
  Мета: Розширювати знання дітей про жанр байки, вчити виразно, інтонаційно читати, порівнювати твори різних авторів; словниковий запас учнів; розвивати вміння визначати головну думку байки; виховувати почуття справедливості.
85464. Великий Кобзар. Т. Г. Шевченко «Вітер з гаєм розмовляє...»; «Садок вишневий коло хати...» 2.28 MB
  Розробка уроку читання у 4 класі на заявлену тему мета якого збагатити й узагальнити знання дітей про Тараса Шевченка великого поета і художника; зосередити увагу на образних засобах створення поетичних картин української природи; розвивати вміння виразно читати образне мислення і мовлення...
85465. Василь Сухомлинський «Усмішка» 309 KB
  Мета: активізувати і розширити знання дітей про життя і творчість В.Сухомлинського, розвивати навички швидкого виразного читання, вміння швидко орієнтуватися в тексті, знаходити описи, висловлювати оцінні судження; виховувати в учнів доброзичливе ставлення до оточуючих.