C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 15 - Устанавливаем направленный источник света / Direct3D / Microsoft DirectX

Шаг 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".

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


Загрузить проект | | |
Автор Хавов Евгений Валерьевич.
[AD]