Цель лекции: Изучить команды OpenGL, позволяющие изменять освещение обратных граней примитивов и фоновое освещение граней примитивов.
Пример № 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" type="example"/> и , то результат будет аналогичен C#:
GL.LightModel(LightModelParameter.LightModelTwoSide, 1);
Object Pascal:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, Ord(true));
Для задания фонового освещения на C# при использовании библиотеки Можно провести небольшой эксперимент. Если отключить источник света - закомментировать в программе вызов команды ).
(рис 8.1) Пример включения режима освещения лицевой и обратной граней примитивов
Интенсивность фонового освещения
OpenGL позволяет определить интенсивность фонового освещения, которое не зависит от источников света. Даже если все источники света отключены, то сцена будет освещаться фоновым светом заданной интенсивности.OpenTK в качестве первого параметра команды LightModel используется значение LightModelAmbient перечисления LightModelParameter, на Object Pascal для этого используется константа GL_LIGHT_MODEL_AMBIENT.C#:
GL.Enable(EnableCap.Lighting);
//GL.Enable(EnableCap.Light0);
Object Pascal:
glEnable(GL_LIGHTING);
//glEnable(GL_LIGHT0);
(рис 8.2) Вид фигуры при отключении источников света |
(рис 8.3) Вид фигуры при использовании фонового освещения модели освещения |
Если задать фоновое освещение ( и ), то вид фигуры изменится (рис 8.1" type="example"/> и ), то вид фигуры изменится (GL.LightModel(LightModelParameter.LightModelAmbient,
new float[] { 1f, 1f, 1f, 1f });
Может возникнуть вопрос: почему интенсивность освещения фигуры является довольно низкой ? Причина заключается в том, что результирующее фоновое освещение грани зависит не только от значения фонового освещения источников света и фонового освещения модели освещения, но и от свойств материала. В примере параметры материала имеют значения по умолчанию и значение фонового освещения для материала равно и ), то увеличится и освещение объектов (рис 8.4" type="example"/>), то увеличится и освещение объектов (GL.Material(MaterialFace.Front, MaterialParameter.Ambient,
new float[] { 0.5f, 0.5f, 0.5f, 1f });
В отличие от параметров источников света параметры модели освещения влияют на все объекты сцены незасимо от того какими и сколькими источниками света они освещены. Наиболее часто при создании изображений используются такие параметры модели освещения как освещённость обратных граней примитивов и фоновое освещение всех объектов сцены. Задание: Для изображения цилиндра, созданного в упражнении № 1 набора для практики № 2, добавьте освещение. В первую очередь после инициализации библиотеки Также необходимо включить один из источников света, например "нулевой": Фрагмент кода, формирующий изображение цилиндра необходимо дополнить указанием направления нормали для каждой вершины. Для цилиндра направления нормалей для вершин на обоих окружностях, формируемых при каждом выполнении тела цикла, будут совпадать. Направление нормали будет совпадать с направлением радиус-вектора окружностей цилиндра. В результате будет получено изображение освещенного цилиндра (рис 8.5). Задайте освещение для изображения поверхности вращения, созданного при выполнении упражнения из набора для практики № 2.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;
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) Вид фигуры при использовании фонового освещения модели освещения и увеличении фоновой составляющей освещения свойства материала
Краткие итоги
Упражнения. Освещение
Пример выполнения задания
Выполнение задания
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) Изображение освещенного цилиндра
Задание
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.