Значения RGB для источников света и материалов
Цветовые значения световых компонент имеют разный смысл для источников света и для материалов. Для источника света они определяют интенсивность излучения каждого из основных цветов. Например, если R, G и B равны 1.0, то свет будет белым, максимальной интенсивности. Если R=G=1 и B=0 (максимальный красный и зеленый, совсем нет синего), то свет будет выглядеть желтым. Для материалов значения компонент определяют долю отраженного света каждого цвета. Например, если для материала задано R=1, G=0.5 и B=0, то этот материал будет отражать весь падающий красный свет, половину зеленого и совсем не будет отражать синий свет. Допустим, что цвет одной из компонент источника света равен (LR, LG, LB), а цвет соответствующей компоненты материала равен (MR, MG, MB). Тогда, если не учитывать другие эффекты отражения, в глаз наблюдателя будет попадать свет (LR*MR, LG*MG, LB*MB). Аналогично, если есть два источника света (R1, G1, B1) и (R2, G2, B2), то OpenGL сложит эти компоненты, и в глаз наблюдателя будет попадать свет (R1+R2, G1+G2, B1+B2). Если одна из сумм больше 1, то она уменьшается до 1 – максимально возможной интенсивности.
Пример: рисование освещенной сферы Добавление освещения в сцену производится в следующем порядке: 1) У всех объектов для каждой вершины задается вектор нормали. Эти векторы определяют ориентацию объекта относительно источников света. 2) Задаются местоположение и свойства одного или нескольких источников света. Каждый источник необходимо включить. 3) Задаются параметры модели освещения, которые определяют уровень фонового рассеянного света и эффективную точку наблюдения (она используется при вычислениях освещения). 4) Задаются свойства материалов объектов сцены.
Выполнение перечисленных действий показано в программе 5.1. Она рисует сферу, освещенную одним источником света (см. рис. 5.2). Вызовы всех функций, имеющих отношение к освещению, вынесены в функцию lightInit(). Эти функции кратко описываются в следующих параграфах.
#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h>
void lightsInit() { float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; float mat_shininess[] = { 50.0 }; float light_position[] = { 1.0, 1.0, 1.0, 0.0 }; float light_global_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_global_ambient) glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); }
void CALLBACK display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); auxSolidSphere(1.0); glFlush(); }
void CALLBACK resize(int width, int height) { 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(); }
void main() { auxInitDisplayMode(AUX_SINGLE | AUX_RGBA | AUX_DEPTH); auxInitPosition(0, 0, 400, 400); auxInitWindow("Лекция 5, программа 5.1"); lightsInit(); auxReshapeFunc(resize); auxMainLoop(display); } Программа 5.1. Рисование освещенной сферы:
Вектора нормали в вершинах объектов Нормали в вершинах объекта определяют его ориентацию относительно источников света. OpenGL использует нормаль вершины, чтобы вычислить, сколько света от каждого источника попадает в эту вершину. В программе 5.1 нормали для вершин явно не задаются, это делается внутри функции auxSolidSphere().
Создание, расположение и включение источников света В программе 5.1 используется только один источник белого света. Его местоположение задается функцией glLightfv(). В данном примере для нулевого источника света (GL_LIGHT0) используется цвет по умолчанию (белый). Для изменения цвета источника надо вызвать функцию glLight*(). OpenGL позволяет включить до 8-ми источников света (у всех, кроме нулевого, по умолчанию задан черный цвет). Эти источники можно располагать в любых местах – вблизи сцены (как настольную лампу), или бесконечно далеко (как солнце). Кроме того, можно управлять свойствами светового пучка – сделать его узким сфокусированным или широким. Необходимо помнить, что каждый источник света приводит к усложнению вычислений. Поэтому производительность программы зависит от количества включенных источников.
После задания характеристик источников света, необходимо включить каждый источник функцией glEnable(). Предварительно необходимо вызвать эту функцию с параметром GL_LIGHTING, чтобы подготовить OpenGL к выполнению расчетов освещения.
Выбор модели освещения Функция glLightModel*() предназначена для задания параметров модели освещения. В программе 5.1 явно задается только один подобный параметр – яркое фоновое рассеянное освещение. Модель освещения также определяет, где надо располагать наблюдателя – на бесконечно большом расстоянии или близко от сцены, и не должны ли расчеты освещения выполняться по–разному для передних и задних сторон объектов сцены. В программе 5.1 используются параметры модели "по умолчанию" – бесконечно удаленный наблюдатель и одностороннее освещение. Использование локального наблюдателя существенно усложняет расчеты, т.к. OpenGL должна будет вычислять угол между точкой наблюдения и каждым объектом. Для бесконечно далекого наблюдателя этот угол не учитывается, поэтому результаты слегка теряют реалистичность. Далее, т.к. в этом примере внутренняя поверхность сферы никогда не видна, то достаточно одностороннего освещения.
Задание свойств материалов для объектов сцены Свойства материала объекта определяют, как он будет отражать свет, и, значит, как будет выглядеть этот материал. Взаимодействие между поверхностью объекта и падающим светом – сложный физический процесс. Задать свойства материала в приближенной модели освещения OpenGL так, чтобы объект выглядел похожим на реальный, довольно сложное дело, требующее навыка. Для материала можно независимо задавать излучаемую, рассеянную, диффузную и зеркальную компоненты, а также блеск. В программе 5.1 с помощью функции glMaterialfv() задаются два свойства материала – цвет зеркальной компоненты (GL_SPECULAR) и блеск (GL_SHININESS).
Создание источников света У источников света есть набор свойств – цвет разных компонент света, местоположение и направление излучения. Для задания всех свойств источника света используется функция glLight*(): void glLight{if}[v](GLenum light, GLenum pname, TYPE param); Параметр light – это номер источника света (от GL_LIGHT0 до GL_LIGHT7). Параметр pname обозначает изменяемое свойство (см. табл. 5.1). Новое значение свойства pname передается в параметре param.
Таблица 5.1. Константы, обозначающие свойства источника света, и значения этих свойств "по умолчанию".
Значения по умолчанию для свойств GL_DIFFUSE и GL_SPECULAR в табл. 5.1 верны только для GL_LIGHT0. Для остальных источников света значения этих компонент по умолчанию равны (0.0, 0.0, 0.0, 1.0) (т.е. остальные источники света по умолчанию ничего не излучают даже во включенном состоянии). Ниже приведен пример использования функции glLightfv(), показывающий, что для задания свойств GL_AMBIENT, GL_DIFFUSE и GL_SPECULAR необходимы отдельные вызовы этой функции: float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; float light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; float light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Цвет OpenGL позволяет указать для каждого источника света цветовые значения трех компонент света – GL_AMBIENT, GL_DIFFUSE и GL_SPECULAR. Компонента GL_AMBIENT определяет вклад источника в общее рассеянное освещение. Как видно из табл. 5.1, по умолчанию рассеянная компонента отсутствует, т.е. GL_AMBIENT равна (0.0, 0.0, 0.0, 1.0). В программе 6.1 задается фоновое яркое белое рассеянное освещение. Если изменить его на синее, то сфера будет выглядеть иначе:
float light_global_ambient[]= { 0.0, 0.0, 1.0, 1.0}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_global_ambient); Компонента GL_DIFFUSE, вероятно, ближе всего похожа на то, что можно назвать "цветом света". Эта компонента определяет количество диффузного света, добавляемого источником к суммарному освещению сцены. Для GL_LIGHT0 по умолчанию GL_DIFFUSE равен (1.0, 1.0, 1.0, 1.0) (яркий белый цвет). Для остальных источников (GL_LIGHT1,..., GL_LIGHT7) значение по умолчанию равно (0.0, 0.0, 0.0, 0.0). Параметр GL_SPECULAR влияет на цвет зеркальных бликов на объекте. Обычно в реальном мире цвет зеркального блика на объекте, например, на стеклянной бутылке, совпадает с цветом источника света (обычно белый). Следовательно, если вы хотите получить реалистичное изображение бликов, надо задавать GL_SPECULAR равным значению GL_DIFFUSE. По умолчанию GL_SPECULAR равен (1.0, 1.0, 1.0, 1.0) для GL_LIGHT0 и (0.0, 0.0, 0.0, 0.0) для остальных источников света.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|