Мы практически подобрались к концу наших занятий по OpenGL. Практически все основы я уже дал, и со следующих номеров мы будем заниматься только практикой. Освоив освещение, ты сможешь уже сам создавать полноценную 3D анимацию. А я только буду тебе помогать, выкладывая на свои странички различные примеры. Таким образом, ты увидишь все тонкости прелести OpenGL.
Рис 1. Результат
Как и все остальные примочки, освещение включается с помощью команды glEnable . Без освещения наши сцены трудно назвать трёхмерными, потому что конус выглядит как треугольник или вообще не понятно что, а сфера выглядит как круг. Без освещения объект выглядит монотонно и практически незаметны его загогулины и выпиндрёжы.
По умолчанию освещённость отключена, но когда ты её включишь, то рассеянный свет примет значение (0.2, 0.2, 0.2, 1). Это практически минимальная освещённость. Максимальная равна (1, 1, 1, 1).
Параметры освещения задаются с помощью команды glLightModel. Для этой команды нужны два параметры.
Параметр света, который нужно изменить.
Значение
Если ты будешь вызывать эту функцию как glLightModelf или glLightModeli (разница в последних буквах), то первый параметр сможет принимать значения GL_ LIGHT_ MODEL_ LOCAL_ VIEWER или GL_ LIGHT_ MODEL_ TWO_ SIDE, а второй GL_TRUE или GL_FALSE.
Если функция будет выглядеть как glLightModelfv или glLightModeliv, то первый параметр сможет выглядеть как GL_LIGHT_MODEL_AMBIENT, GL_LIGHT_MODEL_LOCAL_VIEWER или GL_LIGHT_MODEL_TWO_SIDE, а второй параметр - массив значений.
Вот как будет выглядеть установка значения рассеянного света в синий цвет:
const
ambient : Array [0..3] of GLFloat = (0.0, 0.0, 1.0, 1.0);
begin
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
end;
Прежде чем приступить к дальнейшему изучению освещённости нам необходимо ещё понять как работать с материалами. Освещённость объекта зависит от материала объекта. Это ни чем не отличается от реального мира. Например, метал имеет менее освещённую поверхность из-за его меньшей отражающей способности, полимеры тоже имеют свои особенности в зависимости от состава. Материал может как отражать, так и излучать свет.
Свойства материала устанавливаются с помощью функции glMaterialfv. Для неё нужно три параметра:
Первый параметр - это грань к которой будет применён материал. GL_BACK - задняя грань, GL_FONT - передняя грань и GL_FRONT_AND_BACK - обе грани.
Второй параметр - свойства материала. Может быть: GL_AMBIENT - рассеянный свет, GL_DIFFUSE - рассеянный свет, GL_SPECULAR - отраженный свет, GL_EMISSION - излучаемый свет, GL_SHININESS - степень отраженного света, GL_AMBIENT_AND_DIFFUSE - оба рассеянных света.
Третий параметр - значение цвета в формате RGBA.
С теорией покончено. Теперь посмотрим на пример и после него немного поднимем свои знания об освещённости.
В наиболее интересных местах я поставил комментарии. Единственное, что я забыл рассказать, так это про функцию glLightfv. Она устанавливает параметры света и требует три параметра:
Номер источника света. Они нумеруются как GL_LIGHT0, GL_LIGHT1, GL_LIGHT2 и так до GL_LIGHT9. Как я уже говорил, источник включается с помощью glEnable(GL_LIGHT0), в скобках указан номер источника.
Параметр, который нужно изменить: GL_POSITION (позиция источника) или GL_SPOT_DIRECTION (позиция точки в которую светит источник).
Значение устанавливаемого параметра.
Вот и всё. Да будет свет сказал программист и выключил Back-UPS. Теперь я с уверенностью могу сказать, что со светом мы покончили. В будущих номерах я буду выкладывать демки, в которых более подробно расскажу о хитростях и о свете (с маленькой буквы:)) тоже.