Спекулярное освещение (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);
В соответствии с уравнением результирующий цвет для вершин объекта является сочетанием цвета материала и светлого цвета.
На следующих двух рисунках показан зеркальный цвет материала, который серый, и цвет зеркального света, который белый.
Результирующее зеркальное отблеск показан на следующем рисунке.
Объединение зеркального отражения с фоновым и диффузным освещением даёт следующую иллюстрацию. При применении всех трех типов освещения это более четко напоминает реалистичный объект.
Спекулярное освещение требует более интенсивных вычислений, чем диффузное освещение. Обычно он используется для предоставления визуальных подсказок о материалах поверхности. Зеркальный блик изменяется в размере и цвете в зависимости от материала поверхности.
Связанные разделы