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


 

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

16714. Антикризисные услуги Отечественному бизнесу не нужен аутсорсинг 54 KB
  Антикризисные услуги Отечественному бизнесу не нужен аутсорсинг Отечественный рынок рекрутинга развивается по своим правилам. Просто применить западные технологии на нем не получится. Российские заказчи
16715. ПРОБЛЕМЫ ПЕРЕХОДА ОТ ФИНАНСОВОГО КОНТРОЛЯ К АУДИТУ ЭФФЕКТИВНОСТИ ДОЛГОВЫХ ОБЯЗАТЕЛЬСТВ 77.7 KB
  Л. Брагинская ПРОБЛЕМЫ ПЕРЕХОДА ОТ ФИНАНСОВОГО КОНТРОЛЯ К АУДИТУ ЭФФЕКТИВНОСТИ ДОЛГОВЫХ ОБЯЗАТЕЛЬСТВ. В стратегических документах Правительства Российской Федерации определяющих долговую политику страны говорится о том что в целях повышения эффективности долг...
16716. Economics in China 21.96 KB
  Economics in China. The official support of a marketbased economy that came from Deng Xiao Ping in 1992 has resulted in a more open system of trade for China and subsequently a huge growth spurt in China's economy. The economic reforms which Deng instigated culminated in a socialist market economy a term which was actually incorporated into the Chinese constitution during the National People's Congress in March 1993. Since that time China's economy has experienced a substantial boost in...
16717. Planned economy 41.9 KB
  Planned economy This article is about an economic system controlled or directed by the state. For proposed economic systems that employs participatory or democratic planning Planned economy or command economy is an economic system in which the state directs the economy.[1] It is an economic system in which the central government controls industry such that it makes major decisions...
16718. ДОБЫЧА ЗОЛОТА МЕТОДАМИ ГЕОТЕХНОЛОГИИ 109.5 KB
  Геотехнология определяется как метод добычи цветных, редких и благородных металлов путем их избирательного растворения химическими реагентами на месте залегания и последующего извлечения образованных в зоне реакций
16719. Бактериальное выщелачивание 40 KB
  Бактериальное выщелачивание избирательное извлечение химических элементов из многокомпонентных соединений посредством их растворения микроорганизмами в водной среде. Благодаря Б. в. появляется возможность извлекать из руд отходов производства и т. д. ценные...
16720. Влияние вторичных процессов на извлечение золота при сорбционном выщелачивании 53.5 KB
  УДК.669.21/23 Влияние вторичных процессов на извлечение золота при сорбционном выщелачиванииКустова Л.А. начальник ЦЗЛ ГМЗ2 Центрального рудоуправления НГМК; Коротовских Г.А. зам. начальника ЦЗЛ ГМЗ2 Центрального рудоуправления НГМК Золотосодержащие руды отличаются бо...
16721. Влияние концентрации цианистого натрия и тонины помола на извлечение золота и серебра из пульпы 65.5 KB
  УДК 622 Влияние концентрации цианистого натрия и тонины помола на извлечение золота и серебра из пульпыДубов А.А. начальник цеха сорбции и регенерации ГМЗ2 Центрального рудоуправления НГМК С момента пуска Гидрометаллургического завода № 2 НГМК в эксплуатацию на нем с
16722. ВОЗМОЖНОСТИ ГРАВИТАЦИОННОГО ОБОГАЩЕНИЯ УПОРНЫХ ПРОМПРОДУКТОВ ЗОЛОТОИЗВЛЕКАТЕЛЬНЫХ ФАБРИК 84.5 KB
  ВОЗМОЖНОСТИ ГРАВИТАЦИОННОГО ОБОГАЩЕНИЯ УПОРНЫХ ПРОМПРОДУКТОВ ЗОЛОТОИЗВЛЕКАТЕЛЬНЫХ ФАБРИК Евтушенко М.Б. ОOО НТЦ Магнитные жидкости Посысоева Д.С. МГГУ Упорными промпродуктами золотоизвлекательных фабрик ЗИФ являются хвосты доводки гравиоконцентратов пред...