Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_4 Трехмерное моделирование полигональными с....doc
Скачиваний:
29
Добавлен:
04.12.2018
Размер:
275 Кб
Скачать
☆

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);

14