Внимание!
Эта публикация перенесена в раздел уроков по адресу Основы освещения в OpenGL.К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.
Основы освещения в OpenGL
Урок 2. Основы освещения в OpenGL
Ну вот наконец-то и пришел 2 урок =). Задержался он немного, так как были проблемы с жестким диском и с инетом. Но вот вышел второй урок =). В этом уроке я раскажу про освещение.
[spoiler]
Часть 1. Подготавливаемся
Что нам нужно для того, чтобы изучать освещение? Нам нужны:
- OpenGL(как же без него);
- glut;
- IDE (хотя можно и без него, я, например, пишу все свои программы в gedit (что то вроде блокнота на винде только круче), иногда в CodeBlocks (ну это только если проект большой, чтобы легче было) );
- ну и конечно нужен компилятор (как же без него), я использую компилятор gcc для Linux и mingw для Windows;
- и еще очень пригодится желание учиться (без него никак).
Часть 2. Пример простой программы
Тут я просто напишу пример программы, в которой используется освещение.
Код без коментариев так что то бы понять суть освещения нодо читать дальше =)
Часть 3. Небольшой разбор примера
Начнем разирать код примера.
Я все не буду пояснять, так как почти все есть в предыдушем уроке.
Тут мы инициализируем всякое =)
glClearColor(0.3, 0.3, 0.3, 1.0); //очищаем экран в цвет, установленый параметрами r,g,b,a
glEnable(GL_LIGHTING); //тут мы включаем расчет освещения
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);//делаем так, чтобы освещались обе стороны полигона
glEnable(GL_NORMALIZE);//делам нормали одинаковой величины во избежание артефактов
Здесь инициализируется освещение.
float light0_diffuse[] = {0.4, 0.7, 0.2};//устанавливаем диффузный цвет света
float light0_direction[] = {0.0, 0.0, 1.0, 0.0};//устанавливаем направление света
glEnable(GL_LIGHT0);//разрешаем использовать light0
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);//устанавливаем источнику света light0 диффузный свет, который указали ранее
glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);//устанавливаем направление источника света указанным ранее
Здесь происходит вся прорисовка.
init_l();//выполняем инициализацию освещения
GLfloat x, y;//высота и ширина плоскости
glBegin(GL_QUADS);//начинаем рисовать плоскость
glNormal3f(0.0, 0.0, -1.0);//указываем направление нормалей (это обязательно)
//тут рисуем плоскость
glEnd();//закончили рисовать
glDisable(GL_LIGHT0);//отключаем освещение
Ну, вот вроде с примером разобрались. Далее будем изучать освещение.
Часть 4. Изучаем освещение
Вначале включим расчет освещения командой glEnable(GL_LIGHTING);
далее надо разблокировать источник света командой glEnable(GL_LIGHT);
GL_LIGHT может принимать только 8 значений (по крайней мере в OpenGL 2.1, как и у меня), то есть GL_LIGHT0..GL_LIGHT7.
Теперь надо создать источник света. У каждого источника света есть свои параметры по умолчанию, например, если вы просто разблокируете 2 источника света GL_LIGHT0 и GL_LIGHT1, то будет виден только 0, так как в нем параметры по умолчанию отличаються от остальных (у всех остальных они идентичны).
Источники света имеют несколько параметров, таких как: цвет, позиция и направление.
Команда, используемая для указания всех параметров света – это glLight*(). Она принимает три аргумента: идентификатор источника света, имя свойства и желаемое для него значение.
GLenum light - это выбор источника, например, GL_LIGHT0
GLenum pname - это параметры источника света (далее будут приведены все ее параметры)
TYPE param - это значение, которое принимает GLenum pname
Если у вас стоит void glLight{if}v (GLenum light, GLenum pname, TYPE *param), значит используется векторная версия команды; param представляет собой вектор величин.
Например:
Или, если нет, то тогда это единственное значение.
Например:
Вот листинг значений GLenum pname
(читаеться так: первая строчка - это название параметра, вторая - это значение поумолчанию и третья - это пояснение; если вы видите что-то типа (1.0,1.0,1.0,1.0) или (0.0,0.0,0.0,1.0), то это значит, что первая скобка - это значение по умолчанию для нулевого источника, а вторая скобка - это для остальных):
вот пример использования освещения:
Часть 5. Изучаем параметры света
1.Цвет
Diffuse
Параметр GL_DIFFUSE, наверное, наиболее точно совпадает с тем, что вы привыкли называть «цветом света». Он определяет RGBA цвет диффузного света, который отдельный источник света добавляет к сцене.
Ambient
Параметр GL_AMBIENT влияет на цвет зеркального блика на объекте. В реальном мире на объектах вроде стеклянной бутылки имеется зеркальный блик соответствующего освещению цвета (часто белого).
Specular
Параметр GL_SPECULAR влияет на интенсивность зеркального блика на объектах.
2.Позиция
Position
Параметр GL_POSITION имеет 3 значения положения и одно, указывающее на то, какой источник света будет использоваться.
GL_POSITION (x,y,z,w)
Первые 3 параметра понятны - это положение, а вот 4-й параметр указывает, будет ли использоваться бесконечно удаленный свет или точечный. Если значение w = 0, то источник света бесконечно удаленный (что-то вроде солнца). Если w = 1, то этот источник света точечный (что то вроде лампочки).
Если w = 0, то первые 3 параметра - это вектор от центра системы координат (0,0,0).
3.Прожектор
GL_SPOT_DIRECTION
Направление света прожектора
GL_SPOT_EXPONENT
Концентрация светового луча
GL_SPOT_CUTOFF
Угловая ширина светового луча
Я думаю тут все понятно, единственное, нужно уточнить, что позиция должна быть с w = 1.
4.Ослабление
Если вам нужно ослаблять интенсивность света от центра(тоесть чем дальше от центра, тем тускнее), то вам надо настроить параметры: GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION.
Но так не удобно и можно расчитать по формуле:
где:
d - расстояние между позицией источника света и точкой где конец,
Kc - GL_CONSTANT_ATTENUATION (постоянный фактор ослабления),
Kl - GL_LINEAR_ATTENUATION (линейный фактор ослабления),
Kq - GL_QUADRATIC_ATTENUATION (квадратичный фактор ослабления).
Если вы не совсем поняли, как это применить, то у меня уже есть готовая заготовка:
Тут вы задаете радиус от центра до конца =)
Также, если вам надо уменьшить общую интенсивность, вы можете изменить параметр att
Часть 6. Выбор модели освещения
OpenGL понятие модели освещения разделяется на 4 компонента:
-Интенсивность глобального фонового света.
-Считается ли положение точки наблюдения локальным к сцене или бесконечно удаленным.
-Должен ли расчет освещенности производиться по-разному для лицевых и обратных граней объектов.
-Должен ли зеркальный цвет отделяться от фонового и диффузного и накладываться на объект после операций текстурирования.
glLightModel*() – это команда, используемая для задания всех параметров модели освещения. glLightModel*() принимает два аргумента: имя параметра модели освещения в виде константы и значение для этого параметра.
Устанавливаемая характеристика модели освещения определяется аргументом pname; param задает величину, в которую устанавливается pname.
Часть 7. Заключение
Ну вот и все, с освещением закончили =)
Теперь вы можете создавать отличные источники света.
Вот тут есть отличный пример использования всех источников света, найденый мною в недрах интернета.
.
В архиве лежит исходный код программы (мною подредактированый) и исполняемые файлы под Linux и под Windows.
Также, если вы компилируете под Windows с помощю компилятора mingw, то там компиляция немного отличается.Надо писать:
Также вам надо будет скачать библиотеку glut для mingw (в гугле есть точно),
а если под линукс с помощью gcc, то там как обычно:
Ну вот наконец-то и пришел 2 урок =). Задержался он немного, так как были проблемы с жестким диском и с инетом. Но вот вышел второй урок =). В этом уроке я раскажу про освещение.
[spoiler]
Часть 1. Подготавливаемся
Что нам нужно для того, чтобы изучать освещение? Нам нужны:
- OpenGL(как же без него);
- glut;
- IDE (хотя можно и без него, я, например, пишу все свои программы в gedit (что то вроде блокнота на винде только круче), иногда в CodeBlocks (ну это только если проект большой, чтобы легче было) );
- ну и конечно нужен компилятор (как же без него), я использую компилятор gcc для Linux и mingw для Windows;
- и еще очень пригодится желание учиться (без него никак).
Часть 2. Пример простой программы
Тут я просто напишу пример программы, в которой используется освещение.
|
Код без коментариев так что то бы понять суть освещения нодо читать дальше =)
Часть 3. Небольшой разбор примера
Начнем разирать код примера.
Я все не буду пояснять, так как почти все есть в предыдушем уроке.
|
Тут мы инициализируем всякое =)
glClearColor(0.3, 0.3, 0.3, 1.0); //очищаем экран в цвет, установленый параметрами r,g,b,a
glEnable(GL_LIGHTING); //тут мы включаем расчет освещения
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);//делаем так, чтобы освещались обе стороны полигона
glEnable(GL_NORMALIZE);//делам нормали одинаковой величины во избежание артефактов
|
Здесь инициализируется освещение.
float light0_diffuse[] = {0.4, 0.7, 0.2};//устанавливаем диффузный цвет света
float light0_direction[] = {0.0, 0.0, 1.0, 0.0};//устанавливаем направление света
glEnable(GL_LIGHT0);//разрешаем использовать light0
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);//устанавливаем источнику света light0 диффузный свет, который указали ранее
glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);//устанавливаем направление источника света указанным ранее
|
Здесь происходит вся прорисовка.
init_l();//выполняем инициализацию освещения
GLfloat x, y;//высота и ширина плоскости
glBegin(GL_QUADS);//начинаем рисовать плоскость
glNormal3f(0.0, 0.0, -1.0);//указываем направление нормалей (это обязательно)
//тут рисуем плоскость
glEnd();//закончили рисовать
glDisable(GL_LIGHT0);//отключаем освещение
Ну, вот вроде с примером разобрались. Далее будем изучать освещение.
Часть 4. Изучаем освещение
Вначале включим расчет освещения командой glEnable(GL_LIGHTING);
далее надо разблокировать источник света командой glEnable(GL_LIGHT);
GL_LIGHT может принимать только 8 значений (по крайней мере в OpenGL 2.1, как и у меня), то есть GL_LIGHT0..GL_LIGHT7.
Теперь надо создать источник света. У каждого источника света есть свои параметры по умолчанию, например, если вы просто разблокируете 2 источника света GL_LIGHT0 и GL_LIGHT1, то будет виден только 0, так как в нем параметры по умолчанию отличаються от остальных (у всех остальных они идентичны).
Источники света имеют несколько параметров, таких как: цвет, позиция и направление.
Команда, используемая для указания всех параметров света – это glLight*(). Она принимает три аргумента: идентификатор источника света, имя свойства и желаемое для него значение.
|
GLenum light - это выбор источника, например, GL_LIGHT0
GLenum pname - это параметры источника света (далее будут приведены все ее параметры)
TYPE param - это значение, которое принимает GLenum pname
Если у вас стоит void glLight{if}v (GLenum light, GLenum pname, TYPE *param), значит используется векторная версия команды; param представляет собой вектор величин.
Например:
|
Или, если нет, то тогда это единственное значение.
Например:
|
Вот листинг значений GLenum pname
(читаеться так: первая строчка - это название параметра, вторая - это значение поумолчанию и третья - это пояснение; если вы видите что-то типа (1.0,1.0,1.0,1.0) или (0.0,0.0,0.0,1.0), то это значит, что первая скобка - это значение по умолчанию для нулевого источника, а вторая скобка - это для остальных):
|
вот пример использования освещения:
|
Часть 5. Изучаем параметры света
1.Цвет
Diffuse
Параметр GL_DIFFUSE, наверное, наиболее точно совпадает с тем, что вы привыкли называть «цветом света». Он определяет RGBA цвет диффузного света, который отдельный источник света добавляет к сцене.
Ambient
Параметр GL_AMBIENT влияет на цвет зеркального блика на объекте. В реальном мире на объектах вроде стеклянной бутылки имеется зеркальный блик соответствующего освещению цвета (часто белого).
Specular
Параметр GL_SPECULAR влияет на интенсивность зеркального блика на объектах.
2.Позиция
Position
Параметр GL_POSITION имеет 3 значения положения и одно, указывающее на то, какой источник света будет использоваться.
GL_POSITION (x,y,z,w)
Первые 3 параметра понятны - это положение, а вот 4-й параметр указывает, будет ли использоваться бесконечно удаленный свет или точечный. Если значение w = 0, то источник света бесконечно удаленный (что-то вроде солнца). Если w = 1, то этот источник света точечный (что то вроде лампочки).
Если w = 0, то первые 3 параметра - это вектор от центра системы координат (0,0,0).
3.Прожектор
GL_SPOT_DIRECTION
Направление света прожектора
GL_SPOT_EXPONENT
Концентрация светового луча
GL_SPOT_CUTOFF
Угловая ширина светового луча
Я думаю тут все понятно, единственное, нужно уточнить, что позиция должна быть с w = 1.
4.Ослабление
Если вам нужно ослаблять интенсивность света от центра(тоесть чем дальше от центра, тем тускнее), то вам надо настроить параметры: GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION.
Но так не удобно и можно расчитать по формуле:
|
где:
d - расстояние между позицией источника света и точкой где конец,
Kc - GL_CONSTANT_ATTENUATION (постоянный фактор ослабления),
Kl - GL_LINEAR_ATTENUATION (линейный фактор ослабления),
Kq - GL_QUADRATIC_ATTENUATION (квадратичный фактор ослабления).
Если вы не совсем поняли, как это применить, то у меня уже есть готовая заготовка:
|
Тут вы задаете радиус от центра до конца =)
Также, если вам надо уменьшить общую интенсивность, вы можете изменить параметр att
Часть 6. Выбор модели освещения
OpenGL понятие модели освещения разделяется на 4 компонента:
-Интенсивность глобального фонового света.
-Считается ли положение точки наблюдения локальным к сцене или бесконечно удаленным.
-Должен ли расчет освещенности производиться по-разному для лицевых и обратных граней объектов.
-Должен ли зеркальный цвет отделяться от фонового и диффузного и накладываться на объект после операций текстурирования.
glLightModel*() – это команда, используемая для задания всех параметров модели освещения. glLightModel*() принимает два аргумента: имя параметра модели освещения в виде константы и значение для этого параметра.
|
Устанавливаемая характеристика модели освещения определяется аргументом pname; param задает величину, в которую устанавливается pname.
|
Часть 7. Заключение
Ну вот и все, с освещением закончили =)
Теперь вы можете создавать отличные источники света.
Вот тут есть отличный пример использования всех источников света, найденый мною в недрах интернета.
.
В архиве лежит исходный код программы (мною подредактированый) и исполняемые файлы под Linux и под Windows.
Также, если вы компилируете под Windows с помощю компилятора mingw, то там компиляция немного отличается.Надо писать:
|
Также вам надо будет скачать библиотеку glut для mingw (в гугле есть точно),
а если под линукс с помощью gcc, то там как обычно:
|
Внимание!
Эта публикация перенесена в раздел уроков по адресу Основы освещения в OpenGL.К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.
3712
25.08.2010
21



.
Только код без комментариев меня немного смутил
там вначале пример весь закоментирован
да и дальше почти каждую строчку пояснял
если что не так то напиши что исправить я подправлю
Просто в самом коде комментов нет и если кто-то очень ленивый вначале копи-пастит, а потом только разбираться начинает, то туго ему бедненькому придется
Хотя это уже его проблемы мы для лентяев не стараемся
Кстати по-поводу лентяев, а у тебя есть такой же код только на C#?
так а там изменять почти ничего не надо
только перед gl ставить GL. и все (вроде)
я на шарпе уже давно не программировал
так как мне больше С++ понравился =)
хотя так скучаю по формачкам и кнопочкам =)
Там перед каждым из параметров внутри функции например glutInitDisplayMode(...) или др. нужно Gl. ставить. Ну ни чего, блокнот мне в руки
ты скачай пример, там класно =) мне понравился
правда я там убрал один прикол
а зря, с ним лучше было, ты просто делай так:
напиши в первой строчке GL. и скопируй ее и потом просто везде Ctrl + V
ну и на стрклочках строчку ниже и Home чт бы в начало строчки
там быстро тогда
ты сделай на консоле, почти ничего не надо
и вобще чет меня занесло, может ты не про пример тот говоришь =))
там просто есть исполняемый файл для винды и для линукса
Кстати, если захочешь, когда код будет готов я могу тебе скинуть (или сразу Anvi), чтобы он в конце урока ссылку на C#+TaoFramework проект сделал. Мало ли, вдруг людям пригодится
Еще, просьба ко всем, кто создает новые уроки, к урокам. Это поможет не упустить несколько важных вещей для создания качественных, полных уроков.
Ща попробую в mingw, а то у меня OGl там не компилился. После чего, я mingw и забросил.
Побольше бы Linux-а в нашу жизнь!
может быть когда нить сделаю что нить по типу блога про линукс =) там как компилировать в разных средах, как подключать файлы, Makefiles
сейчас просто времени не очень много
но вскоре думаю сделаю
может быть когда нить сделаю что нить по типу блога про линукс =)Это очень классно.
Буду надеяться на то, что времени у тебя станет побольше.))
Ну и у меня заодно)))
вот смотрю я тут и не могу понять к чему эти разные приставки например
m_Surface — что означает эта m_ ??
и какие еще приставки знаете? а то я как то все называю без приставок, может если кто читает и ему будет с приставками понятнее