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


 

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

28826. Эволюция советской политической системы в 20-30гг. Было ли неизбежно становление тоталитарного режима в СССР 15.43 KB
  Она поддерживалась всей мощью государства на всех уровнях.Тоталитаризм Одна из форм устройства авторитарного государства характеризующаяся его полным господством над всеми сторонами жизни; тоталитарный режим. Так происходит провоцирование ГОСУДАРСТВА на расширение его контрольных функций то есть подталкивание к ТОТАЛИТАРИЗМУ. В итоге общество получает полное огорчение по поводу деятельности ГОСУДАРСТВА и начинает ратовать за освобождение от тоталитаризма.
28827. Становление детской психологии в конце 19 н 20 в. 48.5 KB
  Предпосылками возникновения возрастной психологии явились запросы педагогической практики разработка идей развития в психологии появление экспериментальной психологии и разработка объективных методов исследования детей. Бюлера биогенетический закон периодизации психического развития. Эволюция как основа психологического развития. В основе развития психики лежит биогенетический закон.
28828. Кризис в психологии в начале XX века 53.5 KB
  Кризис в психологии в начале XX века Причины и значение открытого кризиса в психологии поиски новых объяснительных принципов и объективных методов исследования психики. К началу 20 века теория начала отставать в своем объяснении данных психологических исследований а порой оказывалась и просто неадекватной им привела к ситуации кризиса в психологии. По Выготскому это был кризис методологических основ психологии. Кризис в психологии совпал с периодом обострения экономических и социальнополитических противоречий в буржуазном обществе.
28829. Глубинная психология 72.5 KB
  Во втором периоде 1906 1918 фрейдизм превращается в общепсихологическое учение о личности и ее развитии. Структура личности представляется теперь в виде учения о трех инстанциях Я Оно СверхЯ Я и Оно 1923. Структура личности функции Ид Эго Суперэго Ид располагается в бессознательном слое является энергетической основой личности в ид содержаться врожденные бессозн инстинкты инстинкт жизни и смерти; исключительно примитивные инстинктивные и врожденные аспекты личности. Развитие личности стадии Фундамент...
28830. Развитие идей Фрейда в неопсихоанализе 61.5 KB
  Развитие личности: решающая роли детских переживаний для формирования структуры и функционирования личности взрослого решающим фактором в развитии личности являются социальные отношения между ребенком и его родителями. Согласно Хорни для нормального развития личности ребенку присущи две основные потребности: потребность в удовлетворении все биологические нужды: в пище сне и т. Ее основу составляет тезис о роли межличностных отношений в формировании личности и процесса ее развития. Описывая их роль в психическом развитии он доказал что...
28831. Бихевиоризм. Предпосылки бихевиоризма, критика традиционной психологии, влияние ассоциативной психологии. Философские основы бихевиоризма (прагматизм, позитивизм), понятие о предмете и методе психологии в бихевиоризме 34 KB
  4 Функциональная психология оказала определенное влияние на бихевиоризм психология должна стремиться быть более объективной и поэтому изучать поведение а не сознание душу или разум. Торндайк: психология должна исследовать поведение а не психические элементы или опыт сознания. псих изучать формирование поведенческих реакций и на этой основе изучать человеческое поведение как результат научения. предсказывать поведение человека в каждой конкретной ситуации и в последующем управлять этим поведением.
28832. Развитие необихевиоризма. Изменение представлений о структуре поведенческого акта 56.5 KB
  принципы поведения организмов стоящих на более низких ступенях развития аналогичны таковым принципам поведения организмов стоящих на более высоких ступенях развития. особое значение анализу поведения единичных организмов психологи должны научиться предсказывать влияние отдельных переменных на компоненты поведения отдельного организма. концепция оперантного поведения: Люди да и животные в реальной жизни редко действуют согласно классической схеме S R респондентное поведение или обусловливанием типа С стимульным. Последствия...
28833. Гештальтпсихология 82.38 KB
  Гештальтпсихология возникла из исследований восприятия. В исследованиях ученых были открыты свойства воображения восприятия и др. Принципы гештальта Целостность восприятия и его упорядоченность достигаются благодаря следующим принципам: Близость. Работы посвящены исследованию зрительного восприятия.
28834. Французская социологическая школа 46.5 KB
  Говорил о существовании коллективного сознания совокупность общих у членов одного и того же общества интересов верований убеждений чувств ценностей. исследовал структуру сознания и личности Изучая структуру сознания Жане подчеркивал что все высшие проявления духа строятся на основе низших где действие чувство и разум слиты воедино. Трехуровневая структура сознания: элементарные ощущения затем память а на ней базируется Я или личность. Ввёл в психологию понятие поле сознания это наибольшее число простых или относительно...