Шаг 15 - Устанавливаем направленный источник света

Здесь мы научимся устанавливать источник света, а материалы присвоим в "Шаг 16 - Назначим материалы". Нужно только одно запомнить, не будет света, не увидите материалов, не будет материалов, бесполезен источник света.

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

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_NORMAL )

struct CUSTOMVERTEX { float x, y, z, nx, ny, nz; };

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

CUSTOMVERTEX g_Vertices[] =
{
	{  0.0f,   0.0f,  0.0f, 0.0f, 0.0f, 0.0f,},
	{  0.0f, 100.0f,  0.0f, 0.0f, 0.0f, 0.0f,},
	{ 60.0f,   0.0f,  0.0f, 0.0f, 0.0f, 0.0f,},

	{  0.0f, 100.0f,  0.0f, 0.0f, 0.0f, 0.0f,},
	{ 60.0f,   0.0f, 60.0f, 0.0f, 0.0f, 0.0f,},
	{ 60.0f,   0.0f,  0.0f, 0.0f, 0.0f, 0.0f,},

	{  0.0f,   0.0f,  0.0f, 0.0f, 0.0f, 0.0f,},
	{ 60.0f,   0.0f, 60.0f, 0.0f, 0.0f, 0.0f,},
	{  0.0f, 100.0f,  0.0f, 0.0f, 0.0f, 0.0f,},
};

О выделенных нулях мы поговорим в "Шаг 16 - Назначим материалы", а пока перейдем к созданию источника света:

class CMainWnd : public CFrameWnd
{
private:
	LPDIRECT3D8 p_d3d;				// наш главный интерфейс 
	LPDIRECT3DDEVICE8 p_d3d_Device;		// наше устройство d3d8
	D3DDISPLAYMODE d3ddm;			// способ отображения
	D3DPRESENT_PARAMETERS d3dpp;		// параметры монитора
	LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer;	// наш буфер вершин
	D3DXMATRIX matWorld;			// мировая матрица
	D3DXMATRIX matView;			// матрица вида
	D3DXMATRIX matProj;			// матрица проецирования
	D3DLIGHT8 light;				// источник света
.
.
.

Инициализировали. Теперь нам нужно как и любому объекту выделить память, установить тип источника, цвет освещаемого света, задать его расположение в 3D сцене, дальность освещения, установить в нашем устройстве Direct3D и разрешить устройству использовать источник света в сцене для расчетов освещения. Ничего сложного :) вот код:

D3DXVECTOR3 vecDir;
ZeroMemory (&light, sizeof(D3DLIGHT8));
light.Type = D3DLIGHT_DIRECTIONAL;

light.Diffuse.r  = 1.0f;	// освещаем белым цветом
light.Diffuse.g  = 1.0f;
light.Diffuse.b  = 1.0f;

vecDir = D3DXVECTOR3 (0.0f, 0.0f, 1.0f);
D3DXVec3Normalize ((D3DXVECTOR3*)&light.Direction, &vecDir);

light.Range = 1000.0f;

p_d3d_Device->SetLight (0, &light);
p_d3d_Device->LightEnable (0, true);

Располагаем его (исходный код) в конструктор главного окна CMainWnd::CMainWnd() перед закрывающей скобкой. Для более полной информации см. раздел Справка по DirectX:

Перейдем к функции Transform3D(void) и меняем FALSE на TRUE:

p_d3d_Device->SetRenderState (D3DRS_LIGHTING, TRUE);

И добавим еще один способ отображения:

p_d3d_Device->SetRenderState (D3DRS_AMBIENT, 0);

Смотрите дополнительно "Шаг 54 - Описание перечисляемого типа D3DRENDERSTATETYPE".

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


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Хавов Евгений Валерьевич - 30.08.2002