Ладно. Открываем Microsoft Visual Studio 2008. Заходим в File->New->Project.
Выбираем Other Languages->Visual C++->Win32 Project (или просто
Visual C++->Win32 Project, если С++ - выбран как основной язык(у
меня основной - C#). Называем как-нибудь проект (например DxTest) Появится окошко. Жмём далее. Выбираем Windows Application, ставим галочку Empty Project, жмём Finish. Теперь создадим исходный файл:
- В окне Solution Explorer, кликаем правой кнопкой на папке Source Files
- Выбираем Add->New item
- В открывшемся окне выбираем C++ File и вводим имя(например main.cpp)
Новый исходный файл откроется для редактирования. Допишем в начало кода такие строки:
#include <windows.h> //подключение стандартной библиотеки виндовс #include <d3d9.h> #include <d3dx9.h> //включаемые файлы DirectX
Для работы с DirectX в настройках проекта нужно указать пути к
файлам и подключить библиотеки.(Для разработки на директе нужен DirectX
SDK). Для этого:
- Заходим Project->DxTest Properties...
- Разкрываем Configuration Properties->C\C++->General
- В поле Additional Include Dependencies добавляем путь {папка DirectX SDK}\Includes
- Сворачиваем С\С++
- Идём Linker->General
- В Additional Library Dependencies добавляем путь {папка DirectX SDK}\Lib\x86
- Идём Linker->Input и в Additional Dependencies добавляем d3d9.lib и d3dx9.lib.
Теперь напишем главную функию. Для начала сам вид:
int WinMain(HINSTANCE hInstance,HINSTANCE hPrevinst, LPSTR cmdline,int showcmd) { //Код программы return 0; }
Теперь нужно создать главное окно приложения, в которое будем производить визуализацию. Напишем это функцией. Для начала - объявим глобальные переменные:
HWND mWnd; //Дескриптор окна IDirect3DDevice9* dev; //устройство Direct3D
Теперь напишем функцию создания окна: bool CreateRenderWindow(int Width, int Height) { WNDCLASSEX wcl; ZeroMemory(&wcl,sizeof(wcl)); wcl.cbSize=sizeof(wcl); //размер структуры wcl.hInstance=GetModuleHandle(0); wcl.hIcon=LoadIcon(0,IDI_ASTERISK); //значёк wcl.hIconSm=wcl.hIcon; wcl.hCursor=LoadCursor(0, IDC_ARROW); wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wcl.style=0; wcl.lpszClassName=L"MyDXWndClass"; //имя класса окна wcl.lpfnWndProc=WndProc; //функция обработки сообщений RegisterClassEx(&wcl); //Регистрация класса окна mWnd=CreateWindowEx(0,L"MyDXWndClass",L"Form1",WS_OVERLAPPED
| WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,CW_USEDEFAULT,
CW_USEDEFAULT,Width,Height,0,0,GetModuleHandle(0),0); //создание окна return mWnd!=0; } Тут встречается такая строка: wcl.lpfnWndProc=WndProc; //функция обработки сообщений Нужно задать эту функцию. Её общий вид такой:
LRESULT WINAPI WndProc(HWND Wnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: { if(Wnd==mWnd) ExitProcess(0); }break; default: return DefWindowProc(Wnd,msg,wParam,lParam); } }
А большего нам и не нужно Итак, теперь нужно инициализировать Direct3D устройство. Для этого напишем такую функцию:
bool CreateDirect3DDevice(int Width, int Height) { IDirect3D9* dir; //этот интерфейс нужен для создания устройства dir=Direct3DCreate9(D3D_SDK_VERSION); //создание интерфейса Direct3D9. D3DPRESENT_PARAMETERS param; //параметры устройства ZeroMemory(¶m,sizeof(param)); //очищяем param.AutoDepthStencilFormat=D3DFMT_D16; //формат буфера глюбины - 16 бит param.EnableAutoDepthStencil=true;//включение буфера глубины/стенсильного буфера param.Windowed=true;//оконный режим param.SwapEffect=D3DSWAPEFFECT_DISCARD;//не помню, но так надо param.BackBufferFormat=D3DFMT_UNKNOWN;//формат back-буффера if(!CreateRenderWindow(800,600)) return false; return
!FAILED(dir->CreateDevice(0,D3DDEVTYPE_HAL,mWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,¶m,&dev));
//создание устройства с заданными параметрами } Если не понятны назначения и параметры функций - кури справку. Теперь программируем в основном коде программы. В начале вызываем Функцию создания окна и устройства:
if(!CreateDirect3DDevice(800,600)) return -1;
Теперь создадим чё-нить, что будем отображать. В DirectX есть такая
полезная вещь, как Mesh. Она позволяет удобно рисовать объекты Также можно создавать примитивы. Создадим чайник. Для этого есть функция D3DXCreateTeapot()
ID3DXMesh *te; D3DXCreateTeapot(dev,&te,0);//создаём чайник
Дальше устанавливаем стандартные настройки(материал, проэкция и свет)
D3DMATRIX pr; D3DXMatrixPerspectiveFovLH((D3DXMATRIX*)&pr,3.1415/4,800.0f/600.0f,0.1,100); //считаем матрицу проэкции dev->SetTransform(D3DTS_PROJECTION,&pr);//устанавливаем матрицу проэкции
dev->SetRenderState(D3DRS_ZENABLE,true); //Включаем Z-буффер, для управлений глубиной прорисовки объектов.
D3DMATERIAL9 mat; //создаём материал ZeroMemory(&mat,sizeof(mat)); mat.Diffuse.a=1; mat.Diffuse.r=1; //красный dev->SetMaterial(&mat); //устанавливаем тукущий материал D3DLIGHT9 l; //создаём свет ZeroMemory(&l,sizeof(l)); l.Type=D3DLIGHT_POINT;//точечное освещение l.Diffuse.a=1; l.Diffuse.r=1; l.Diffuse.g=1; l.Diffuse.b=1; //белый цвет l.Position=D3DXVECTOR3(2,5,-3); //позиция источника цвета l.Range=100; //диапазон l.Attenuation0=1; //... dev->SetLight(0,&l);//установка света dev->LightEnable(0,true);//включаем свет
dev->SetRenderState(D3DRS_LIGHTING,true);//включаем возможность освещения
Устанавливаем матрицу вида:
D3DMATRIX view;
D3DXMatrixIdentity((D3DXMATRIX*)&view); //устанавливаем матрицу
вида, т.к. камера у нас не двигается - ставим пустую матрицу. dev->SetTransform(D3DTS_VIEW,&view); //ставим
Всё, дальше лень комментировать, вобщем вот главный цикл. Что не понятно - спрашивай.
MSG msg; float r=0; while(true) { if(PeekMessage(&msg,0,0,0,PM_REMOVE))//обработка сообщений винды { TranslateMessage(&msg); DispatchMessage(&msg); } dev->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0,1,0);//очистка чёрным цветом
dev->BeginScene();//начало сцены
D3DMATRIX w; D3DXMatrixTranslation((D3DXMATRIX*)&w,0,0,5);//матрица мира. Ставим объек в позицию 0, 0, 5 D3DMATRIX rm; r+=0.01; D3DXMatrixRotationY((D3DXMATRIX*)&rm,r);//матрица поворота dev->SetTransform(D3DTS_WORLD,&w);//поворачиваем вокруг Y на r радиан
te->DrawSubset(0);//Рисуем чайник
dev->EndScene();//конец сцены
dev->Present(0,0,0,0);//выводим в окно }
Ну и собсно сам исходник:
Приложение: DxTest.rar(321Kb) Автор урока: Jack
Источник: http://igrostroenie.ru/forum/75-1680-1 |