Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2008, 13:27   #1
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Уроки по использованию Direct3D в Delphi

Подготовка к изучению Direct3D.
Для начала вам нужно скачать необходимые библиотеки и модули.
библиотеки D3DX9sab.dll и DXErr9ab.dll
http://www.develprog.ucoz.ru/Lib.rar (898 kb)
Модули Direct3D.pas, D3DX9.pas...
http://www.develprog.ucoz.ru/Direct3D.rar (96 kb)
D3DX9sab.dll и DXErr9ab.dll скопируйте в папку с проектом или в C:\WINDOWS\system32
Модули Direct3D.pas, D3DX9.pas... скиньте в папку с проектом или в папку с Delphi или задайте путь к файлам в Delphi.

Урок 1. Инициализация Direct3D.

Код:
function DX3DInit(var ppiD3D9: IDirect3D9;//для хранения интерфейса IDirect3D 9-й версии
   var ppiD3DDevice9: IDirect3DDevice9;//для хранения интерфейса устройства
   hWnd: THandle;//окно в котором будет происходить отображение 3D сцены
   iWidth, iHeight: Integer;//размер окна
   iColor: _D3DFORMAT;// глубина цвета
   FullScreen: Boolean):Boolean; //полноэкранный/оконный режим
var
 d3dpp:TD3DPresentParameters;
 wndRect, clientRect: TRect;
 d3ddm : TD3DDISPLAYMODE;
 Flags: DWORD;
 hRes : HRESULT;
 Aspect : real;
 matProjection : TD3DMATRIX;
begin
 Result:= false;

 ppiD3D9:=Direct3DCreate9(D3D_SDK_VERSION);
 if ppiD3D9=nil then
  exit;

 ZeroMemory(@d3dpp, sizeof(d3dpp));

 d3dpp.BackBufferWidth := iWidth;
 d3dpp.BackBufferHeight := iHeight;
 d3dpp.AutoDepthStencilFormat := D3DFMT_D16; //буфер глубины
 d3dpp.EnableAutoDepthStencil := TRUE; // включаем буфер глубины

 if(FullScreen) then
  begin
   d3dpp.BackBufferFormat := iColor; 
	 d3dpp.SwapEffect       := D3DSWAPEFFECT_FLIP;
	 d3dpp.Windowed         := FALSE;
   d3dpp.FullScreen_RefreshRateInHz := D3DPRESENT_RATE_DEFAULT; // частота обновления экрана
   d3dpp.PresentationInterval := D3DPRESENT_INTERVAL_DEFAULT;
  end
 else
  begin
   GetWindowRect(hWnd, wndRect);
   GetClientRect(hWnd, clientRect);

	 iWidth := iWidth + (wndRect.right-wndRect.left)  - (clientRect.right-clientRect.left);
	 iHeight := iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top);

	 MoveWindow(hWnd, wndRect.left, wndRect.top, iWidth, iHeight, TRUE);

	 ppiD3D9.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm);

	 d3dpp.BackBufferFormat := d3ddm.Format;
	 d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD;
	 d3dpp.Windowed := TRUE;
  end;

 Flags := D3DCREATE_MIXED_VERTEXPROCESSING;

 hRes := ppiD3D9.CreateDevice(
	  D3DADAPTER_DEFAULT,
	  D3DDEVTYPE_HAL, hWnd, Flags,
	  @d3dpp, ppiD3DDevice9);
 if (FAILED(hRes)) then
	  exit;

 Aspect := d3dpp.BackBufferWidth / d3dpp.BackBufferHeight;
 D3DXMatrixPerspectiveFovLH(matProjection, D3DX_PI/4.0, Aspect, 0.1, 2000.0);
 ppiD3DDevice9.SetTransform(D3DTS_PROJECTION, matProjection);

 ppiD3DDevice9.SetRenderState(D3DRS_LIGHTING, DWORD(FALSE));

 Result:=true;
end;
Пример:
http://www.develprog.ucoz.ru/D3DXInit.rar (13 kb)
Вложения
Тип файла: rar Lib.rar (898.5 Кб, 411 просмотров)
Тип файла: rar D3DXInit.rar (12.2 Кб, 346 просмотров)

Последний раз редактировалось Kostia; 24.03.2008 в 17:02.
Kostia вне форума Ответить с цитированием
Старый 24.03.2008, 14:44   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Урок 2. Точка, линия, треугольник.
В примере рассмотрен способ вывода точки на экран.
http://www.develprog.ucoz.ru/Pixel.rar (14 kb)
В примере рассмотрен способ вывода линий на экран.
http://www.develprog.ucoz.ru/Lines.rar (15kb)
В примере рассмотрен способ вывода треугольника на экран
http://www.develprog.ucoz.ru/Triangle.rar (15 kb)

Все примеры подробно закомментированы.
Вложения
Тип файла: rar Pixel.rar (13.8 Кб, 223 просмотров)
Тип файла: rar Lines.rar (14.9 Кб, 177 просмотров)
Тип файла: rar Triangle.rar (14.6 Кб, 199 просмотров)

Последний раз редактировалось Kostia; 24.03.2008 в 15:53.
Kostia вне форума Ответить с цитированием
Старый 24.03.2008, 15:03   #3
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

Kostia, большая просьба - прикрепи к форуму архивы. спасибо.
Alar вне форума Ответить с цитированием
Старый 24.03.2008, 16:59   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Урок 3. Текстура.
Простой пример для введение работы с текстурами
http://www.develprog.ucoz.ru/Texture1.rar (64 kb)
Пример охватывающий различные аспекты работы с текстурами
http://www.develprog.ucoz.ru/Texture2.rar (73 kb)
Вложения
Тип файла: rar Texture1.rar (61.1 Кб, 198 просмотров)
Тип файла: rar Texture2.rar (73.5 Кб, 167 просмотров)
Kostia вне форума Ответить с цитированием
Старый 25.03.2008, 11:24   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Урок 4. Куб.
В примере приведен способ работы в пространственных координатах
http://www.develprog.ucoz.ru/Square.rar (17 kb)
Вложения
Тип файла: rar Square.rar (16.2 Кб, 209 просмотров)
Kostia вне форума Ответить с цитированием
Старый 26.03.2008, 16:38   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Урок 5. Загрузка модели из *.x с наложенной на нее текстурой.
http://www.develprog.ucoz.ru/mesh.rar (76 kb)
В следующий раз приведу примеры работы с освещением(Точечный, направленный и прожекторный источники света).
Если у кого примеры не запускаются или вы не можете понять код, задавайте вопросы, разберемся вместе.
Изображения
Тип файла: jpg screen.jpg (10.7 Кб, 315 просмотров)
Вложения
Тип файла: rar mesh.rar (75.7 Кб, 227 просмотров)

Последний раз редактировалось Kostia; 27.03.2008 в 04:31.
Kostia вне форума Ответить с цитированием
Старый 27.03.2008, 08:26   #7
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Урок 6. Освещение.
Как я и обещал, этот урок будет посвящен созданию освещения. Вот свежеиспеченный пример точечного типа освещения.
http://www.develprog.ucoz.ru/light1.rar (115 kb)
Изображения
Тип файла: jpg screen.jpg (22.4 Кб, 261 просмотров)
Вложения
Тип файла: rar light1.rar (114.6 Кб, 153 просмотров)
Kostia вне форума Ответить с цитированием
Старый 27.03.2008, 13:16   #8
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Продолжаю приводить примеры для работы с освещением, этот пример показывает работу с направленным источником света.
http://www.develprog.ucoz.ru/light2.rar (112 kb)
Кстати, задавайте вопросы, я не пишу пояснения, потому что ни кто не задал еще ни одного вопроса, а это значит, что все понятно.
Изображения
Тип файла: jpg screen.jpg (25.7 Кб, 239 просмотров)
Вложения
Тип файла: rar light2.rar (111.2 Кб, 132 просмотров)
Kostia вне форума Ответить с цитированием
Старый 27.03.2008, 14:12   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Последний тип освещения - это прожекторный источник.
http://www.develprog.ucoz.ru/Light3.rar (115 kb)
Изображения
Тип файла: jpg screen.jpg (7.0 Кб, 223 просмотров)
Вложения
Тип файла: rar Light3.rar (115.6 Кб, 134 просмотров)
Kostia вне форума Ответить с цитированием
Старый 31.03.2008, 12:23   #10
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
Сообщение Матрицы

Урок 7. Матрицы.
Матрицы переноса(положение в пространстве)

1 0 0 0
0 1 0 0
0 0 1 0
x y z 1

Матрица вращения по оси x

1 0 0 0
0 cos(a) sin(a) 0
0 -sin(a) cos(a) 0
0 0 0 0

Матрица вращения вокруг оси y

cos(a) 0 -sin(a) 0
0 1 0 0
sin(a) 0 cos(a) 0
0 0 0 1

Матрица повороты вокруг оси z

cos(a) sin(a) 0 0
-sin(a) cos(a) 0 0
0 0 1 0
0 0 0 1

Матрица масштабирования

a 0 0 0
0 b 0 0
0 0 c 0
0 0 0 1

Функции для работы с матрицами

Операция сдвига:

function D3DXMatrixTranslation(
out mOut: TD3DMatrix;
x,
y,
z: single): PD3DMatrix; stdcall; external d3dx9mathDLL;

Функции для вращения

function D3DXMatrixRotationX(
out mOut: TD3DMatrix;
angle: single;
):PD3DMatrix; stdcall; external d3dx9mathDLL;

function D3DXMatrixRotationY(
out mOut: TD3DMatrix;
angle: single;
):PD3DMatrix; stdcall; external d3dx9mathDLL;

function D3DXMatrixRotationZ(
out mOut: TD3DMatrix;
angle: single;
):PD3DMatrix; stdcall; external d3dx9mathDLL;

Для масштабирования предназначена функция

function D3DXMatrixScaling(
out mOut: TD3DMatrix;
sx,sy,sz: single
):PD3DMatrix; stdcall; external d3dx9mathDLL;

Функция для перемножения матриц

function D3DXMatrixMultiply(
out mOut: TD3DMatrix;
const m1,m2: TD3DMatrix;
):PD3DMatrix; stdcall; external d3dx9mathDLL;

Для того что применить несколько трансформаций для одного объекта(повернуть по нескольким ося и масштабирование), нужно правильно перемножить матрицы.

Пример для наглядности:
Код:
var
  WorldMatrix, //Результирующая матрица 
  WorldMatrixX, //Матрица поворота по оси x
  WorldMatrixY, //Матрица поворота по оси y
  WorldMatrixZ, //Матрица поворота по оси z
  WorldMatrixS: TD3DXMatrix; // Матрица масштабирования
begin
  {приведем матрицы к виду
     1 0 0 0
     0 1 0 0
     0 0 1 0
     0 0 0 1
  }
  D3DXMatrixIdentity(WorldMatrix);
  D3DXMatrixIdentity(WorldMatrixX);
  D3DXMatrixIdentity(WorldMatrixY);
  D3DXMatrixIdentity(WorldMatrixZ);
  D3DXMatrixIdentity(WorldMatrixS);
  //выполним трансформацию
  D3DXMatrixRotationX(WorldMatrixX,angle);
  D3DXMatrixRotationY(WorldMatrixY,angle);
  D3DXMatrixRotationZ(WorldMatrixZ,angle);
  D3DXMatrixScaling(WorldMatrixS,0.5,0.5,1);
  //перемножим матрицы
  D3DXMatrixMultiply(WorldMatrix,WorldMatrixX,WorldMatrixY);
  D3DXMatrixMultiply(WorldMatrix,WorldMatrix,WorldMatrixZ);
  D3DXMatrixMultiply(WorldMatrix,WorldMatrix,WorldMatrixS);
  // x y z
  WorldMatrix._41:=0;
  WorldMatrix._42:=0;
  WorldMatrix._43:=10;
end;
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Direct3D: создание карт и ландшафтов challengerr Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 02.05.2009 02:15
Перспектива в Direct3D Ulex Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 11.03.2008 01:04
вопрос по использованию конструкции if zetrix Microsoft Office Excel 0 31.10.2006 07:52