- •Г.М. Набережнов, н.Н. Максимов трехмерное моделирование полигональными сетками
- •Казань 2008 Задания для самостоятельного выполнения
- •1. Понятие полигональнОй сетки
- •2. Построение полигональной сетки
- •3. Рисование полигональной сетки
- •4. Введение в модели закрашивания
- •5. Использование источников света в OpenGl
- •5.1. Создание источника света
- •5.3. Ослабление света с расстоянием
- •5.4. Перемещение источников света
- •5.2. Прожекторы
- •6. Работа со свойствами материалов в OpenGl
6. Работа со свойствами материалов в OpenGl
Влияние источника света можно увидеть только при отражении света от поверхности объекта. В OpenGL предусмотрены возможности задания степени зеркального отражения и различных коэффициентов отражения. Эти коэффициенты устанавливаются с помощью различных версий функции glMaterial, причем коэффициенты можно установить отдельно для лицевых и не лицевых граней. Следующий код:
GLfloat myDiffuse[] = {0.8, 0.2, 0.0, 1.0};
glMaterialfv(GL_FRONT, GL_DIFFUSE, myDiffuse);
GLfloat myShininess[] = {51.2};
glMaterialfv(GL_FRONT, GL_SHININESS, myShininess);
присваивает коэффициенту диффузного отражения значение (0.8, 0.2, 0.0, 1.0) и степени зеркального отражения значение (51.2) для всех последовательно заданных граней. Коэффициенты отражения задаются в формате RGBA в виде четверки, аналогично заданию цвета. Первый параметр функции glMaterialfv(…) может принимать следующие значения:
-
GL_FRONT: задается коэффициент отражения для лицевых граней.
-
GL_BACK: задается коэффициент отражения для не лицевых граней.
-
GL_FRONT_AND_ BACK: задается коэффициент отражения для лицевых, и для не лицевых граней.
Второй параметр может принимать следующие значения:
-
GL_AMBIENT: задаются коэффициенты фонового отражения.
-
GL_DIFFUSE: задаются коэффициенты диффузного отражения.
-
GL_SPECULAR: задаются коэффициенты зеркального отражения.
-
GL_AMBIENT_AND_ DIFFUSE: коэффициенты фонового и диффузного отражения устанавливаются равными одному и тому же значению. Такая установка сделана для удобства, поскольку коэффициенты фонового и диффузного отражения часто бывают одинаковыми.
-
GL_SHININESS: устанавливается степень зеркального отражения.
-
GL_EMISSION: устанавливается эмиссионный цвет поверхности.
-
В последнем случае устанавливается эмиссионный цвет для грани, вследствие чего она начинает «светиться» заданным цветом, независимо ни от какого источника света.
OpenGL может различать только «лицевые грани» и «нелицевые грани». Грань является лицевой, если ее вершины расположены в списке против часовой стрелки, в том порядке, каком их видит глаз. Для объекта, ограничивающего некоторое пространство, все грани, которые видит глаз, являются лицевыми, и OpenGL правильно рисует и закрашивает их. Нелицевые грани также рисуются в OpenGL, но в конце концов они скрываются за более близкими лицевыми гранями.
Можно ускорить работу компьютера, если запретить OpenGL визуализацию нелицевых граней. При этом используется следующий код:
glCullFace(GL_BACK); // Что принято по умолчанию
glEnable(GL_CULL_FACE);

