При необходимости назначить одинаковые значения коэффициентам отражения рассеянного и диффузного света вместо двух вызовов функции gl Materi а 1 f v (), можно вызвать ее один раз с первым параметром GL_AMBIENT_ANDJ3IFFUSE.

Различные типы света передаются функции glLight() со значениями второго параметра GL_AMBIENT GL_DIFFUSE или GL_SPECULAR. Рассеянный цвет разумно задавать моделью освещения, поэтому по умолчанию в источниках задана нулевая интенсивность рассеянного света.

Чтобы библиотека формировала изображения с учетом освещения, нужно прежде всего включить расчет освещения вершин от используемых в данный момент источников света. После этого необходимо передать в конвейер характеристику источников света, характеристику освещаемого материала и направление нормалей в вершинах.

Но минимально необходимыми операциями для учета освещенности в рассмотренных выше проектах являются только включение расчета освещенности функцией gl Enabl e(GL_LIGHTING) и задание источников света, как показано в листинге 22.14.

Листинг 22.14

void InitLight(void) {
float 1nten[4]-{0.95f.0.95f.0.95f.l.0f}: float intenl[4]-{0.2f.0.2f.0.2f.l.Of}:

float pos[4] - {0.43f,0.5f,-0.75f.0.0f}://W-0 - источник бесконечно далеко gl Enabl e(GL_COLOR_MATERIAL); glEnable(GLJ-IGHTING); glEnable(GL_LIGHTO);

gll_ightfv(GL_LIGHTO. GL_AMBIENT, intenl); gl Lightfv(GL_LIGHTO. GL_DIFFUSE. inten): glLightfv(GL_LIGHTO. GL_P0SITI0N, pos); }

Следует отметить, что в конвейере всегда присутствует заданный по умолчанию материал с коэффициентами отражения рассеянного света (0.2, 0.2, 0.2, 1), коэффициентами диффузного отражения (0.8, 0.8, 0.8, 1) и без зеркального отраМатериал и освещение жения и светимости граней, коэффициенты которых по умолчанию равны (0.0, 0.0,0.0,1.0).

Функция gl Enable(GL__C0L0R__MATERIAL) включает запись текущего цвета, заданного последней из выполненных операций glColor*( ), в коэффициенты диффузного отражения хранящегося в конвейере материала. В этом случае glColor*() работает как glMaterialfv(GL_DIFFUSE,<Адрес данных>), а действие самой функции glMaterialfv( ) после вызова glEnable(GL_C0L0R_MATERIAL) отключается.


⇐ Предыдущая| |Следующая ⇒