Навигация
Категории
C++,C#,C [19]
Уроки по средам разработки приложений с использованием C,C++,C#, а также .Net, DirectX, OpenGL и других
Delphi [14]
Уроки работы в среде программирования Delphi
Basic [13]
Уроки разработки приложений в среде Basic
DirectX [8]
Уроки по работе с DirectX, включая Direct3D и другие инструменты
Web [7]
Уроки по "Веб-программированию"
JavaScript [12]
Уроки по кодингу в Java и JavaScript
XNA [9]
Статьи и уроки программирование в среде XNA C++&C#
Профиль
Статистика
Rambler's Top100

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Locations of visitors to this page
Главная » Статьи » Программирование » C++,C#,C

Создание первого DirectX приложения на Visual C++
Ладно.
Открываем 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);
  }
}

А большего нам и не нужно wink Итак, теперь нужно инициализировать Direct3D устройство.
Для этого напишем такую функцию:

bool CreateDirect3DDevice(int Width, int Height)
{
  IDirect3D9* dir; //этот интерфейс нужен для создания устройства
  dir=Direct3DCreate9(D3D_SDK_VERSION); //создание интерфейса Direct3D9.
  D3DPRESENT_PARAMETERS param; //параметры устройства
  ZeroMemory(&param,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,&param,&dev)); //создание устройства с заданными параметрами
}

Если не понятны назначения и параметры функций - кури справку. Теперь программируем в основном коде программы.
В начале вызываем Функцию создания окна и устройства:

if(!CreateDirect3DDevice(800,600)) return -1;

Теперь создадим чё-нить, что будем отображать. В DirectX есть такая полезная вещь, как Mesh. Она позволяет удобно рисовать объекты smile
Также можно создавать примитивы. Создадим чайник. Для этого есть функция 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
Категория: C++,C#,C | Добавил: gforcer (13.11.2009) | Автор: Админ
Просмотров: 8012 | Комментарии: 4 | Теги: приложения, DirectX, Direct, , создание, dx, ++, прогарммирование, окна, c++ | Рейтинг: 4.0/1
Всего комментариев: 3
3 от туда  
0
В уроке хорошее начало но дальше хрень полная. Единственное что можно отсюда усвоить - как создать проект и пару заголовков функций. А куда под писать... зачем его туда писать, а можно ли его ваще туда не писать тут не сказано. Поэтому человек прочитавший эту статью может только, запарившись на половине, скопировать код себе в компилятор и увидеть кучу сообщений об ошибках. Судя по началу статья предназначена для людей первый раз столкнувшихся C++ DirectX, а во второй половине статьи говорится так, будто обучающийся уже 10 подобных проектов написал и сам всё догоняет. Нет информации для размышлении, просто сухой код... не сказано даже для чего мы какие то переменные подготавливаем.

2 Buldozer  
0
прогарммирование

Исправь ключевое слово.


1 gforcer  
0
Урок был любезно написан товарищем Jack с сайта Igrostroenie.ru

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Друзья сайта
Демотиваторы
Copyright Зямаев Денис © 2024