Поделиться через


Спекулярное освещение (Direct3D 9)

Моделирование зеркального отражения требует, чтобы система не только знала, в каком направлении свет перемещается, но и направление к глазу зрителя. В системе используется упрощенная версия модели зеркального отражения Фонга, которая использует вектор полпути для приближения интенсивности зеркального отражения.

Состояние освещения по умолчанию не вычисляет зеркальные блики. Чтобы включить зеркальное освещение, обязательно установите D3DRS_SPECULARENABLE в TRUE.

Уравнение зеркального освещения

Зеркальное освещение описывается следующим уравнением:

Спекулярное освещение = Cs * sum[Ls * (N · H)P * Atten * Spot]

 

В следующей таблице указаны переменные, их типы и их диапазоны.

Параметр Значение по умолчанию Тип Описание
Cs (0,0,0,0) D3DCOLORVALUE Зеркальный цвет.
сумма N/A N/A Суммирование зеркального компонента каждого источника света.
N N/A D3DVECTOR Нормальное состояние вершины.
H N/A D3DVECTOR Вектор на полпути. См. раздел о полувекторе.
P 0.0 ПЛАВАТЬ Спекулярная отражающая способность. Диапазон составляет от 0 до +бесконечности
Ls (0,0,0,0) D3DCOLORVALUE Цвет зеркального отражения.
Аттен N/A ПЛАВАТЬ Значение аттенуации света. См. ослабление и коэффициент прожектора (Direct3D 9).
Пятно N/A ПЛАВАТЬ Фактор внимания. См. затухание и фактор прожектора (Direct3D 9).

 

Значение для Cₛ может быть следующим:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • цвет вершины1, если источник спектрированного материала D3DMCS_COLOR1, а первый цвет вершины предоставляется в объявлении вершин.
  • цвет вершины 2, если источник зеркального материала D3DMCS_COLOR2, и второй цвет вершины предусмотрен в объявлении вершины.
  • спекулярный цвет материала

Заметка

Если используется любой из опций источника спекулярного материала и цвет вершины не указан, то используется спекулярный цвет материала.

 

Спекулярные компоненты ограничены значениями от 0 до 255, после того как все источники света обработаны и интерполированы отдельно.

Вектор на полпути

Вектор на полпути (H) существует по середине между двумя векторами: вектором от вершины объекта к источнику света и вектором от вершины объекта к позиции камеры. Direct3D предоставляет два способа вычисления вектора на полпути. Если D3DRS_LOCALVIEWER задано значение TRUE, система вычисляет вектор полпути, используя положение камеры и положение вершины, и вектор направления света. Следующая формула иллюстрирует это.

H = norm(norm(Cp - Vp) + Ldir)

 

Параметр Значение по умолчанию Тип Описание
Cp N/A D3DVECTOR Положение камеры.
Vp N/A D3DVECTOR Позиция вершины.
Ldir N/A D3DVECTOR Вектор направления от положения вершины до положения источника света.

 

Определение половинного вектора таким образом может быть вычислительным ресурсоемким. В качестве альтернативы установка D3DRS_LOCALVIEWER = FALSE указывает системе действовать так, как будто точка зрения бесконечно удалена на оси z. Это отражается в следующей формуле.

H = норма((0,0,1) + Ldir)

 

Этот параметр является менее вычислительным, но гораздо менее точным, поэтому он лучше всего используется приложениями, используюющими ортогональную проекцию.

Пример

В этом примере объект окрашивается с помощью цвета зеркального света сцены и зеркального цвета материала. Ниже показан код.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;

light.Range = 1000;
light.Falloff = 0;
light.Attenuation0 = 1;
light.Attenuation1 = 0;
light.Attenuation2 = 0;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

mtrl.Specular.r = 0.5f;
mtrl.Specular.g = 0.5f;
mtrl.Specular.b = 0.5f;
mtrl.Specular.a = 0.5f;
mtrl.Power = 20;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);

В соответствии с уравнением результирующий цвет для вершин объекта является сочетанием цвета материала и светлого цвета.

На следующих двух рисунках показан зеркальный цвет материала, который серый, и цвет зеркального света, который белый.

иллюстрация серой сферы иллюстрации белой сферы

Результирующее зеркальное отблеск показан на следующем рисунке.

иллюстрация бликов

Объединение зеркального отражения с фоновым и диффузным освещением даёт следующую иллюстрацию. При применении всех трех типов освещения это более четко напоминает реалистичный объект.

иллюстрация объединения бликового освещения, окружающего освещения и диффузного освещения

Спекулярное освещение требует более интенсивных вычислений, чем диффузное освещение. Обычно он используется для предоставления визуальных подсказок о материалах поверхности. Зеркальный блик изменяется в размере и цвете в зависимости от материала поверхности.

математика освещения