Использование нескольких источников света
OpenGL позволяет создать до 8-ми источников света, но чем больше источников включено, тем дольше выполняется расчет освещения. При создании дополнительных источников надо обязательно указывать все их параметры, т.к. значения по умолчанию для нулевого источника (табл. 5.1) отличаются от остальных. Ниже приведены функции для создания белого прожектора с затуханием и фокусировкой:
float light1_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; float light1_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; float light1_specular[] = { 1.0, 1.0, 1.0, 1.0 }; float light1_position[] = { -1.5, -1.5, 3.0, 1.0 }; float spot_direction[] = { 0.0, 1.0, -1 }; glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular); glLightfv(GL_LIGHT1, GL_POSITION, light1_position); glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5); glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5); glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2f); glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0); glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction); glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0); glEnable(GL_LIGHT1);
Если добавить эти строки в программу 5.1, то сфера будет освещаться двумя источниками: одним направленным и одним прожектором.
Изменение местоположения источников света Местоположение и направление источников света, как и координаты вершин, в OpenGL могут подвергаться модельным преобразованиям. Точнее, при вызове функции glLight*() для задания местоположения или направления источника света переданные координаты преобразуются в соответствии с текущей видовой матрицей. В этом параграфе кратко описываются два варианта расположения источника света: · источник света находится в фиксированной точке; · источник света перемещается относительно неподвижного объекта. В простейшем случае (например, в программе 5.1) положение (или направление) источника света не изменяется. Координаты (или направление) такого источника определяются сразу после выбора видовой матрицы:
glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (width <= height) glOrtho(-1.5, 1.5, -1.5*(float)height/width, 1.5*(float)height/width, -10.0, 10.0); else glOrtho(-1.5*(float)width/height, 1.5*(float)width/height, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
// Далее, внутри функции lightsInit() float light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Итак, сначала задаются оконное преобразование и проекционная матрица. Затем в качестве видовой матрицы загружается единичная и затем определяется направление нулевого источника света. Т.к. используется единичная видовая матрица, то направление источника в мировой системе координат будет (1.0, 1.0, 1.0). Предположим, что необходимо поворачивать и/или сдвигать локальный источник света так, чтобы он двигался относительно неподвижного объекта. Для это надо задавать координаты источника после видовых преобразований, точно так же, как это делается при размещении объектов сцены. Ниже приведена функция display(), в которой источник света поворачивается на угол spin вокруг неподвижного тора (переменная spin изменяется в фоновой функции или в обработчике событий).
void CALLBACK display() { float light_position[] = { 0.0, 0.0, 1.5, 1.0 }; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0, 0.0, -5.0); glPushMatrix(); glRotated((double)spin, 1.0, 0.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glPopMatrix(); auxSolidTorus(0.275, 0.85); glPopMatrix(); glFlush(); }
Сводка результатов Взаимодействие света с предметами реального мира – сложный процесс. На зрительную картину, воспринимаемую человеком, влияют расположение источников света, распределение их излучения по длинам волн, рельеф отражающих поверхностей, свойства атмосферы и др. В OpenGL используется приближенная модель освещения, дающая результаты приемлемого качества при не очень громоздких вычислениях. Световое излучение представляется в виде 4-х компонент: излучаемый свет, рассеянный свет, диффузно отраженный и зеркально отраженный. Эти световые компоненты являются свойствами источников света и материалов. В OpenGL у источников света и материалов довольно много свойств, влияющих на изображение сцены. В данной лекции подробно описаны свойства источников света.
Упражнения Упражнение 1 С помощью программы 2.1 выясните различие между плавной и плоской закраской треугольника.
Упражнение 2 Проверьте, как будет работать программа 5.1 с каждым из трех изменений: · замените направленный источник света на локальный белый источник; · задайте синее фоновое освещение максимальной интенсивности; · к направленному белому источнику света добавьте еще один цветной прожектор (см. п.6.4).
Упражнение 3 С использованием функции display() из п.6.5 разработайте программу, показывающую тор, освещаемый вращающимся вокруг него локальным источником света. Затем измените эту программу следующим образом: · Сделайте так, чтобы источник света не вращался вокруг тора, а перемещался относительно него прямолинейно. Подсказка: в функции display() вместо glRotated() примените функцию glTranslated() и заведите вместо spin подходящую переменную для хранения значения смещения источника света. · Задайте коэффициент затухания так, чтобы интенсивность света уменьшалась по мере удаления от источника. Подсказка: коэффициент затухания задается с помощью функции glLight*(). ЛЕКЦИЯ 6. Свойства материала и спецэффекты освещения Задание свойств материала На общее освещение сцены и вид объектов, кроме источников света, влияют также отражающие и поглощающие свойства объектов – свойства материала, из которого "сделаны" объекты. Часть этих свойств похожи на свойства источников света: рассеянная, диффузная и зеркально отраженная компоненты света. Есть также свойства "блеск" и "излучаемый свет". Все свойства материала задаются с помощью функции: void glMaterial{if}[v](GLenum face, GLenum pname, TYPE param); Параметр pname выбирает свойство материала (табл. 6.1), face указывает сторону объектов (GL_FRONT, GL_BACK или GL_FRONT_AND_BACK). Новое значение свойства передается в параметре param. Значение блеска (GL_SHININESS) можно передать непосредственно, а для остальных свойств надо передавать указатель на массив. У многих материалов рассеянная и диффузная компоненты одинаковые, поэтому pname, равное GL_AMBIENT_AND_DIFFUSE, позволяет задать сразу два свойства.
В табл. 6.1 обратите внимание, что значения большинства свойств материалов – это цветовые значения (R, G, B, A). Назначение цветовой компоненты A (альфа) будет рассмотрено далее в п.2 "Смешение цветов".
Таблица 6.1. Свойства материала
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|