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