Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_OpenGL3 (1).doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
112.13 Кб
Скачать

Цвет материала

Цвет материала, из которого "сделан" объект, в 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. Рисование освещенной сферы:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]