Диффузное освещение (Direct3D 9)

После настройки интенсивности света для всех эффектов затухания модуль освещения вычисляет количество оставшегося света, отражаемое от вершины, с учетом угла нормали вершины и направления падающего света. Модуль освещения переходит к этому этапу в случае с направленными источниками света, так как они не ослабевают с расстоянием. Система учитывает два типа отражения — рассеянное и зеркальное — и использует другую формулу для определения количества отраженного света в каждом случае. После вычисления количества отраженного света Direct3D применяет новые полученные значения к свойствам рассеянного и зеркального отражения текущего материала. Полученные значения цвета являются компонентами рассеянного и зеркального отражения, которые средство отрисовки использует для создания затенения по методу Гуро и световых бликов.

Рассеянное освещение описывается следующим уравнением.

Диффузное освещение = sum[Cd*Ld*(N. Ldir)*Atten*Spot]

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

 

Для Cd используется одно из следующих значений:

  • цвет вершины1, если ДИФФУЗИМЕНТИСТОЧНИК = D3DMCS_COLOR1, и первый цвет вершины указан в объявлении вершины.
  • цвет вершины2, если ДИФФУЗИМЕНТИСТОЧНИК = D3DMCS_COLOR2, а второй цвет вершины указан в объявлении вершины.
  • диффузный цвет материала

Примечание

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

 

Сведения о том, как вычислить затухание (Atten) или характеристики прожектора (точечный), см. в разделе Затухание и коэффициент внимания (Direct3D 9).

Рассеянные компоненты прикрепляются к диапазону от 0 до 255, после того как все источники освещения отдельно обработаны и интерполированы. Полученное значение рассеянного света представляет собой сочетание значений внешнего, рассеянного и излучаемого освещения.

Пример

В этом примере цвет объекта определяется рассеянным цветом источника света и рассеянным цветом материала. Код показан ниже.

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 );

// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );

// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

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

На двух следующих рисунках показан цвет материала (серый) и цвет света (ярко-красный).

Изображение серогошара с изображением красного шара

Получившаяся сцена показана на следующем рисунке. Единственный объект в сцене — сфера. Для расчета рассеянного света рассеянный цвет материала и источника света изменяется с учетом угла между направлением света и нормалью вершины при помощи скалярного произведения. В результате, тыльная сторона сфера темнеет по мере ухода изгиба сферы от источника света.

иллюстрация сферы с рассеянным освещением

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

иллюстрация сферы с рассеянным и внешним освещением

Рассеянное освещение сложнее в расчете, чем внешнее. Поскольку оно зависит от нормалей вершин и направления света, раскрывается геометрия объекта в трехмерном пространстве, поэтому освещение становится более реалистичным, чем при использовании внешнего освещения. Вы можете использовать световые блики для получения более реалистичного вида.

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