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


Зеркальное освещение (Direct3D 9)

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

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

Уравнение отраженного света

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

Зеркальное освещение = Cs * sum[Ls * (N · H)P * Atten * Spot]

 

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

Параметр Значение по умолчанию Тип Описание
Cₛ (0,0,0,0) D3DCOLORVALUE Отраженный цвет.
Sum Н/Д Н/Д Суммирование каждого компонента отраженного света.
N Н/Д D3DVECTOR Вершина нормальная.
H Н/Д D3DVECTOR Вектор полупути. См. раздел по вектору полупути.
P 0,0 FLOAT Сила отраженного света Диапазон от 0 до +бесконечность
Lₛ (0,0,0,0) D3DCOLORVALUE Цвет отраженного света.
Atten Н/Д FLOAT Значение ослабления света. См. раздел Затухание и фактор внимания (Direct3D 9).
Немедленная оплата. Н/Д FLOAT Коэффициент узкой направленности света. См. раздел Затухание и фактор внимания (Direct3D 9).

 

Значение для Cₛ — либо:

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

Примечание

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

 

Компоненты отражения ужимаются до диапазона 0-255, после отдельной обработки и интерполяции всех источников света.

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

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

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

 

Параметр Значение по умолчанию Тип Описание
Cₚ Н/Д D3DVECTOR Позиция камеры.
Vₚ Н/Д D3DVECTOR Положение вершины.
Ldir Н/Д 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);

Согласно уравнению, получившийся цвет для вершин объекта — это сочетание цвета материала и цвета света.

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

Изображение серой сферы с изображением белой сферы

Итоговый блик показан на следующей иллюстрации.

Иллюстрация блика

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

Иллюстрация сочетания бликов, общего и рассеянного света

Отраженный свет требуют больше вычислительных ресурсов, чем рассеянный свет. Обычно он применяется для предоставления визуальных подсказок о материале поверхности. Блики варьируются по размеру и цвету для разных материалов поверхности.

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