glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Ю0.0); Свойства материала являются параметрами режима- их текущие значения ассоциируются со всеми объектами, формируемыми в программе, до тех пор, пока не будут изменены с помощью glMaterialfv( ) или glMaterialf ( )4.
В системе OpenGL можно включить в сцену излучающую поверхность, которая сама по себе является источником света. Этот метод используется в тех случаях, когда необходимо, чтобы на изображении был виден источник света. OpenGL не анализирует освещение светящейся поверхности другими источниками света, а также влияние испускаемого ею света на другие объекты сцены. Со всей такой поверхностью ассоциируется постоянный цвет, который задается так же, как и другие свойства материалов. Например, для придания такой поверхности сине-зеленого (бирюзового) цвета нужно включить в программу представленный ниже фрагмент:
GLfloat emission[]={0.0, 0.3, 0.3, 1.0}; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission);
6.9. Закрашивание модели сферы
Теперь можно вернуться к уже разработанной модели сферы и организовать в программе ее тонирование. Мы не будем останавливаться на стандартных процедурах инициализации OpenGL - полный текст программы читатель найдет в приложении А. Использование модели Фонга требует прежде всего позаботиться о связывании вектора нормали с каждым пло4 В OpenGL имеется и другое средство изменения свойств материалов - с помощью функции glColorMaterial().
Закрашивание
ским многогранником аппроксимированной поверхности. В первом варианте будем использовать самый простой алгоритм, обеспечивающий плоское закрашивание, - определим нормаль по трем вершинам многоугольника и свяжем этот вектор с первой вершиной. Следуя подходу, описанному в разделе 6.6, воспользуемся для этого операцией векторного произведения, а затем нормализуем результат. Программный код функции формирования векторного произведения представлен ниже:
cross(point3 a, point3 b, point3 с, point3 d); {
d[0]=(b[l]-a[l])*(c[2]-a[2])-(b[2]-a[2])*(c[l]-a[l]); d[l]=(b[2]-a[2])*(c[0]-a[0])-(b[0]-a[0])*(c[2]-a[2]); d(2]=(b[0]-a[0])*(c[l]-a[l])-(b[l]-a[l])*(c[0]-a[0]); normal(d);