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

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

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

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

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

 

Значение для Cd имеет одно из следующих значений:

  • vertex color1, если ДИФФУЗМАТЕРИАЛИСТ = D3DMCS_COLOR1, а первый цвет вершины предоставляется в объявлении вершины.
  • Цвет вершины2, если ДИФФУЗМАТЕРИАЛУРС = D3DMCS_COLOR2, а второй цвет вершины предоставляется в объявлении вершины.
  • диффузный цвет материала

Примечание

Если используется любой из параметров ДИФФУЗМАТЕРИАЛИСТ, а цвет вершины не указан, используется диффузный цвет материала.

 

Чтобы вычислить затухание (Atten) или характеристики прожектора (Spot), см. раздел "Затухание" и "Фактор внимания" (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);

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

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

illustration of a gray sphereillustration of a red sphere

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

illustration of a sphere with diffuse lighting

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

illustration of a sphere with diffuse lighting and ambient lighting

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

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