Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 889 / 69 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 9:

Параметры модели освещения

Аннотация: В лекции рассматриваются параметры модели освещения: освещение обратных граней и фоновое освещение граней примитивов.

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

Примеры на C# (WinForms) и Object Pascal (Delphi)

Пример № 8.1 Пример демонстрирует освещение примитивов при включении режима освещения для лицевых и обратных граней примитивов.

Пример № 8.2 Пример демонстрирует формирование изображения освещенного цилиндра с использованием четырехугольников с общими гранями.

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

Для определения параметров модели освещения используется команда:

LightModel[if][v](pname: GLenum; param: GLType);

Параметры команды имеют значения:

  • pname – параметр определяет изменяемые свойства модели освещения;
  • params – параметр содержит значение, массив или указатель на массив значений изменяемого свойства модели освещения.

В библиотеке OpenTK команда LightModel реализуется с помощью набора статических методов класса GL (C#):

void LightModel(LightModelParameter pname, float param);
void LightModel(LightModelParameter pname, float* @params);
void LightModel(LightModelParameter pname, float[] @params);
void LightModel(LightModelParameter pname, int param);
void LightModel(LightModelParameter pname, int* @params);
void LightModel(LightModelParameter pname, int[] @params);

В Object Pascal команда LightModel реализована с помощью процедур:

procedure glLightModelf (pname: GLenum; param: GLfloat);
procedure glLightModelfv (pname: GLenum; params: PGLfloat);
procedure glLightModeli (pname: GLenum; param: GLint);
procedure glLightModeliv (pname: GLenum; params: PGLint);

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

Если же необходимо изменить свойство, которое определяется несколькими параметрами, то на C# необходимо использовать методы, у которых второй параметр является указателем или массивом значений. В Object Pascal для этого могут использоваться процедуры glLightModelfv и glLightModeliv.

Освещение обратных граней

После инициализации OpenGL используется режим, в котором освещаются только лицевые грани.

Для изменения освещения обратных граней используется команда LightModel с указанием в качестве первого параметра значения LightModelTwoSide перечисления LightModelParameter при использовании библиотеки OpenTK на C# и константы GL_LIGHT_MODEL_TWO_SIDE на Object Pascal.

Второй параметр команды может принимать два значения:

  • 1 – освещение обеих граней примитивов;
  • 0 – освещение только лицевых граней примитивов.

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

C#:
  GL.LightModel(LightModelParameter.LightModelTwoSide, 1);
Object Pascal:
  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, Ord(true));
Пример включения режима освещения лицевой и обратной граней примитивов

Рис. 8.1. Пример включения режима освещения лицевой и обратной граней примитивов

Интенсивность фонового освещения

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

Для задания фонового освещения на C# при использовании библиотеки OpenTK в качестве первого параметра команды LightModel используется значение LightModelAmbient перечисления LightModelParameter, на Object Pascal для этого используется константа GL_LIGHT_MODEL_AMBIENT.

Можно провести небольшой эксперимент. Если отключить источник света - закомментировать в программе вызов команды Enable со значением параметра EnableCap.Light0 на C# и GL_LIGHT0 на Object Pascal, но не отключать режим освещения, то объекты не будут освещены ( рис. 8.2).

C#:
  GL.Enable(EnableCap.Lighting);
  //GL.Enable(EnableCap.Light0);
Object Pascal:
  glEnable(GL_LIGHTING);
  //glEnable(GL_LIGHT0);
Вид фигуры при отключении источников света

Рис. 8.2. Вид фигуры при отключении источников света
Вид фигуры при использовании фонового освещения модели освещения

Рис. 8.3. Вид фигуры при использовании фонового освещения модели освещения

Если задать фоновое освещение ( пример 8.1 и пример 8.2), то вид фигуры изменится ( рис. 8.3) и она будет освещена фоновым освещением, причем ни одного источника при этом не включено.

GL.LightModel(LightModelParameter.LightModelAmbient, 
new float[] { 1f, 1f, 1f, 1f });
Листинг 8.1. Пример изменения параметров фонового освещения модели освещения на C# с использованием библиотеки OpenTK
procedure TfrmGL.FormCreate(Sender: TObject);
var
  params: TGLArrayf4;
Begin
….
  params[0] := 1;
  params[1] := 1;
  params[2] := 1;
  params[3] := 1;
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @params);
….
End;
Листинг 8.2. Пример изменения параметров фонового освещения модели освещения на Object Pascal

Может возникнуть вопрос: почему интенсивность освещения фигуры является довольно низкой ? Причина заключается в том, что результирующее фоновое освещение грани зависит не только от значения фонового освещения источников света и фонового освещения модели освещения, но и от свойств материала. В примере параметры материала имеют значения по умолчанию и значение фонового освещения для материала равно (0.2, 0.2, 0.2, 1.0). Поэтому результирующее освещение материала не высоко. Если увеличить фоновое освещение материала ( пример 8.3 и пример 8.4), то увеличится и освещение объектов ( рис. 8.4).

GL.Material(MaterialFace.Front, MaterialParameter.Ambient, 
new float[] { 0.5f, 0.5f, 0.5f, 1f });
Листинг 8.3. Пример изменения фоновой составляющей освещения свойства материала на C# с использованием библиотеки OpenTK
Procedure TfrmGL.FormCreate( Sender: TObject);
var
  params: TGLArrayf4;
….
Begin
….
  params[0] := 0.5;
  params[1] := 0.5;
  params[2] := 0.5;
  params[3] := 1;
  glMaterialfv(GL_FRONT, GL_AMBIENT, @params);
End;
Листинг 8.4. Пример изменения фоновой составляющей освещения свойства материала на Object Pascal
Вид фигуры при использовании фонового освещения модели освещения и увеличении фоновой составляющей  освещения свойства материала

Рис. 8.4. Вид фигуры при использовании фонового освещения модели освещения и увеличении фоновой составляющей освещения свойства материала

Краткие итоги

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

Упражнения. Освещение

Пример выполнения задания

Задание: Для изображения цилиндра, созданного в упражнении № 1 набора для практики № 2, добавьте освещение.

Выполнение задания

В первую очередь после инициализации библиотеки OpenGL необходимо включить освещение с помощью команды Enable.

C#:
  GL.Enable(EnableCap.Lighting);
Object Pascal:
  glEnable(GL_LIGHTING);

Также необходимо включить один из источников света, например "нулевой":

C#:
  GL.Enable(EnableCap.Light0);
Object Pascal:
  glEnable(GL_LIGHT0);

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

C#:

GL.Enable(EnableCap.Lighting);
GL.Enable(EnableCap.Light0);
GL.PolygonMode(MaterialFace.FrontAndBack, mode);
GL.Begin(BeginMode.QuadStrip);
double r = 0.5;
int n = 20;
for (int i = 0; i <= n; ++i)
{
  double a = 2 * Math.PI/n * i;
  double x = r * Math.Cos(a);
  double y = r * Math.Sin(a);
  GL.Normal3(x, y, 0);
  GL.Vertex3(x, y, -0.5);
  GL.Vertex3(x, y, 0.5);
}
GL.End();
GL.Disable(EnableCap.Lighting);

Object Pascal:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glPolygonMode(GL_FRONT_AND_BACK, mode);
glBegin (GL_QUAD_STRIP);
r := 0.5;
n := 20;
for i := 0 to n do
begin
  a := 2*pi/n * i;
  x := r * Cos(a);
  y := r * Sin(a);
  glNormal3f(x, y, 0);
  glVertex3d(x, y, -0.5);
  glVertex3d(x, y, 0.5);
end;
glEnd;
glDisable(GL_LIGHTING);

В результате будет получено изображение освещенного цилиндра ( рис. 8.5).

Изображение освещенного цилиндра

Рис. 8.5. Изображение освещенного цилиндра

Задание

Задайте освещение для изображения поверхности вращения, созданного при выполнении упражнения из набора для практики № 2.

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Александр Сивков
Александр Сивков
Россия, Екатеринбург
Алиса Алиса
Алиса Алиса
Украина