
- •Лабораторная работа №3 Материалы и освещение
- •Модель освещения
- •Спецификация материалов
- •Описание источников света
- •Цвет материала
- •Значения rgb для источников света и материалов
- •Вектора нормали в вершинах объектов
- •Выбор модели освещения
- •Задание свойств материалов для объектов сцены
- •Местоположение и затухание
Цвет материала
Цвет материала, из которого "сделан" объект, в OpenGL описывается количеством отраженного красного, зеленого и синего света. Например, идеально красный мяч отражает весь падающий красный свет и полностью поглощает зеленый и синий.
В белом свете (он состоит из равного количества красного, зеленого и синего) этот мяч будет выглядеть красным. В чистом красном свете мяч тоже будет красным. Но если осветить мяч чистым зеленым или синим светом, то он будет выглядеть черным.
Материалы, как и источники света, характеризуются тремя компонентами света: рассеянной, диффузной и зеркальной. Значения компонент задаются как доли отраженных компонент света, падающего на поверхность из этого материала.
Компонента рассеянного отражения материала комбинируется с рассеянной компонентой падающего на объект света от каждого источника. Диффузная и зеркальная компоненты материала аналогично комбинируются с соответствующими компонентами источников света. Видимый цвет материала в основном зависит от свойств рассеянного и диффузного отражения. Обычно эти компоненты материала одинаковы или примерно равны. Зеркальная компонента материала обычно задается белой или серой, так что цвет зеркальных бликов совпадает с цветом зеркальной компоненты источника света. Например, если освещать блестящую красную пластиковую сферу белым светом, то большая часть сферы будет выглядеть красной, а блестящий блик – белым.
Значения 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 );
63
auxInitPosition( 0, 0, 400, 400 );
auxInitWindow( "Лекция 5, программа 5.1" );
lightsInit();
auxReshapeFunc( resize );
auxMainLoop( display );
}
Программа 5.1. Рисование освещенной сферы: