none
Как установить directx sdk 2010 RRS feed

  • Вопрос

  • Здраствуйте, помогите пожалуйсто, у меня стоит Microsoft Visual C++ Professional 2010, я скачал с сайта microsoft directx sdk 2010, установил, а что дальше? как его подключить к Microsoft Visual C++ ?
    23 декабря 2010 г. 11:20

Ответы

  • Да. Только свой путь к DirectX укажи.

    На всякий случай напомню (но это и в 2008 было также): во время работы с DirectX иногда прийдется подключать lib файлы. Их необходимо добавлять там же в свойствах проекта в Configuration Properties -> Linker -> Command Line. Например, чтобы использовать Direct3D 9-ой версии необходимо вписать d3d9.lib d3dx9.lib. Чтобы использовать DirectInput: dinput8.lib. И так далее.

    Например, так:

    http://s44.radikal.ru/i106/1012/dd/123cd98cf2fb.png

    • Помечено в качестве ответа Abolmasov Dmitry 23 декабря 2010 г. 16:08
    23 декабря 2010 г. 14:00
  • В свойствах проекта укажи пути к папке inclide и lib (x64 или x86) из установленного DirectX SDK.

    (т.е.:  Project -> <имя проекта> Properties -> Configuration Properties -> VC++ Directories)

    Далее, во время работы с DirectX иногда прийдется подключать lib файлы. Их необходимо добавлять там же в свойствах проекта в Configuration Properties -> Linker -> Command Line. Например, чтобы использовать Direct3D 9-ой версии необходимо вписать d3d9.lib d3dx9.lib. Чтобы использовать DirectInput: dinput8.lib. И так далее.

    В справке для каждой функции есть информация о том, какой .lib и .h необходимо подключить.

    • Предложено в качестве ответа Skimin0k 23 декабря 2010 г. 16:04
    • Помечено в качестве ответа Abolmasov Dmitry 23 декабря 2010 г. 16:08
    23 декабря 2010 г. 11:52

  • Кстати, раз вы используете winApi для создания окна, прийдется перед подключением windows.h добавить строчку (нововведение в VS2010):

    #define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows

    #include <windows.h>
    • Помечено в качестве ответа Abolmasov Dmitry 23 декабря 2010 г. 16:09
    23 декабря 2010 г. 16:03

Все ответы

  • В свойствах проекта укажи пути к папке inclide и lib (x64 или x86) из установленного DirectX SDK.

    (т.е.:  Project -> <имя проекта> Properties -> Configuration Properties -> VC++ Directories)

    Далее, во время работы с DirectX иногда прийдется подключать lib файлы. Их необходимо добавлять там же в свойствах проекта в Configuration Properties -> Linker -> Command Line. Например, чтобы использовать Direct3D 9-ой версии необходимо вписать d3d9.lib d3dx9.lib. Чтобы использовать DirectInput: dinput8.lib. И так далее.

    В справке для каждой функции есть информация о том, какой .lib и .h необходимо подключить.

    • Предложено в качестве ответа Skimin0k 23 декабря 2010 г. 16:04
    • Помечено в качестве ответа Abolmasov Dmitry 23 декабря 2010 г. 16:08
    23 декабря 2010 г. 11:52
  • Вот я зашел в свойства нашел там Каталоги VC++

    http://s014.radikal.ru/i328/1012/5f/8d4f6d07f433.jpg

    А дальше что делать? Где указывать пути к папке inclide и lib?

    23 декабря 2010 г. 12:08
  • Для "Каталогов Включения" добавляешь запись include (Например c:\Program Files\Microsoft DirectX SDK (August 2009)\Include\)

    Для "Каталогов библиотек" добавляешь запись lib (x64 или x86 в зависимости от твоей ОС) (Например c:\Program Files\Microsoft DirectX SDK (August 2009)\Lib\x86\)

    23 декабря 2010 г. 12:13
  • Тоесть мне надо заменить уже имеющиея директории на c:\Program Files\Microsoft DirectX SDK (August 2009)\Include\   ?

    И есче, можете объяснить какие директории менять, и на что...

    23 декабря 2010 г. 12:16
  • Заменять ничего не надо, нужно просто добавить к уже имеющимся. Лучше, чтобы вы добавили их в начало списка
    23 декабря 2010 г. 12:28
  • Вот в этом то и вся проблема я уже 2-й день немогу новую строку туда добавить, в 2008 версии была кнопка добавить, а в 2010 ее нету, как показано у меня на скриншоте...
    23 декабря 2010 г. 12:30
  • У меня это выглядит вот так. Извини за задержку, перезагружался...

    http://s008.radikal.ru/i304/1012/15/a7416a5cb9bc.jpg

     

    23 декабря 2010 г. 12:57
  • А что добовлять туда только Include ? или есче что то надо?
    23 декабря 2010 г. 13:26
  • Кроме этого больше ничего:

    http://s53.radikal.ru/i142/1012/25/16b76c48558d.jpg

     

    23 декабря 2010 г. 13:44
  • Тоесть если я правильно понял, я должен зайти каталоги включения и каталоги библиотек, там нажать изменить, и добавить строки как у вас и все будет работать?
    23 декабря 2010 г. 13:53
  • Да. Только свой путь к DirectX укажи.

    На всякий случай напомню (но это и в 2008 было также): во время работы с DirectX иногда прийдется подключать lib файлы. Их необходимо добавлять там же в свойствах проекта в Configuration Properties -> Linker -> Command Line. Например, чтобы использовать Direct3D 9-ой версии необходимо вписать d3d9.lib d3dx9.lib. Чтобы использовать DirectInput: dinput8.lib. И так далее.

    Например, так:

    http://s44.radikal.ru/i106/1012/dd/123cd98cf2fb.png

    • Помечено в качестве ответа Abolmasov Dmitry 23 декабря 2010 г. 16:08
    23 декабря 2010 г. 14:00
  • А неподскажите что это за библиотека...

    #include "..\..\common\dxfunc.h"

    Я чет негде ее найти немогу

    23 декабря 2010 г. 14:06
  • Я думаю, эта библиотека не относится к DirectX SDK. У меня ее тоже нет. Скорее всего она пользовательская. Если укажете источник, через который вы на нее вышли, возможно удастся помочь.
    23 декабря 2010 г. 14:13
  • В книге Искуство програмирования игр на С++ она используется
    23 декабря 2010 г. 14:14
  • К книге Фленова так же прилагался диск, на котором располагались исходники и данный заголовочный файл. Это его собственный файл.

    Содержимое файла dxfunc.h:

    #ifndef _DXFUNC_H_
    #define _DXFUNC_H_
    
    #include "d3d9.h"
    #include "d3dx9.h"
    
    // Функция инициализации Direct3D
    HRESULT DX3DInit(IDirect3D9 **ppiD3D9, 
            IDirect3DDevice9 **ppiD3DDevice9,
            HWND hWnd, 
    				DWORD iWidth,
    				DWORD iHeight,
    				BOOL bFullScreen
    				);
    
    HRESULT DX3DInitZ(IDirect3D9 **ppiD3D9, 
            IDirect3DDevice9 **ppiD3DDevice9,
            HWND hWnd, 
    				DWORD iWidth,
    				DWORD iHeight,
    				BOOL bFullScreen
    				);
    
    DWORD LoadMesh(char *filename, IDirect3DDevice9 *ppiD3DDevice9,
    			  ID3DXMesh **ppMesh,
    			  LPDIRECT3DTEXTURE9 **pMeshTextures,
    			  char *texturefilename, 
    			  D3DMATERIAL9 **pMeshMaterials
    			  );
    
    bool LoadTexture(DWORD* text_buf, int iWidth, int iHeight, 
    				 char* filename);
    
    #endif
    

    Содержимое файла dxfunc.cpp

    #include "dxfunc.h"
    
    
    // Функция инициализации Direct3D
    HRESULT DX3DInit(IDirect3D9 **ppiD3D9, 
            IDirect3DDevice9 **ppiD3DDevice9,
            HWND hWnd, 
    				DWORD iWidth,
    				DWORD iHeight,
    				BOOL bFullScreen)
    {
     // Инициализация 
     if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
      return E_FAIL;
    
     // Заполняем основные параметры представления
     D3DPRESENT_PARAMETERS d3dpp;
     ZeroMemory(&d3dpp, sizeof(d3dpp));
    
     d3dpp.BackBufferWidth = iWidth;
     d3dpp.BackBufferHeight = iHeight;
    
     // Запрос на отображение в полноэкранном режиме
     int iRes;
     if (!bFullScreen)
       iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
     else
    	 iRes = IDYES;
    
    
     if(iRes == IDYES)
     {
       //////////////////////////////////////////////////////////
    	 // Полноэкранный режим
       //////////////////////////////////////////////////////////
    	 // Установка параметров полноэкранного режима
       d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
    	 d3dpp.SwapEffect    = D3DSWAPEFFECT_FLIP;
    	 d3dpp.Windowed     = FALSE;
       d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
       d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
     } 
     else 
     {
       //////////////////////////////////////////////////////////
    	 // Оконный режим
       //////////////////////////////////////////////////////////
    	 RECT wndRect;
       RECT clientRect;
    	 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);
    
    	 // Получить формат пикселя
    	 D3DDISPLAYMODE d3ddm;
    	 (*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
    
    	 // Установка параметров
    	 d3dpp.BackBufferFormat = d3ddm.Format;
    	 d3dpp.SwapEffect    = D3DSWAPEFFECT_DISCARD;
    	 d3dpp.Windowed     = TRUE;
     }
     
     DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;
    
     // Создать 3D устройство
     HRESULT hRes;
     if(FAILED(hRes = (*ppiD3D9)->CreateDevice(
    	 D3DADAPTER_DEFAULT, 
    	 D3DDEVTYPE_HAL, hWnd, Flags, 
    	 &d3dpp, ppiD3DDevice9)))
    	 return hRes;
    
     // Установить перспективу
     float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight;
     D3DXMATRIX matProjection;
     D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 0.001f, 1000.0f);
     (*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);
    
     (*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);
    
     return S_OK;
    }
    
    HRESULT DX3DInitZ(IDirect3D9 **ppiD3D9, 
            IDirect3DDevice9 **ppiD3DDevice9,
            HWND hWnd, 
    				DWORD iWidth,
    				DWORD iHeight,
    				BOOL bFullScreen)
    {
     // Инициализация 
     if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
      return E_FAIL;
    
     // Заполняем основные параметры представления
     D3DPRESENT_PARAMETERS d3dpp;
     ZeroMemory(&d3dpp, sizeof(d3dpp));
    
     d3dpp.BackBufferWidth = iWidth;
     d3dpp.BackBufferHeight = iHeight;
     d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
     d3dpp.EnableAutoDepthStencil = TRUE;
     
     // Запрос на отображение в полноэкранном режиме
     int iRes;
     if (!bFullScreen)
       iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
     else
    	 iRes = IDYES;
    
     if(iRes == IDYES)
     {
       //////////////////////////////////////////////////////////
    	 // Полноэкранный режим
       //////////////////////////////////////////////////////////
    	 // Установка параметров полноэкранного режима
       d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
    	 d3dpp.SwapEffect    = D3DSWAPEFFECT_FLIP;
    	 d3dpp.Windowed     = FALSE;
       d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
       d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
     } 
     else 
     {
       //////////////////////////////////////////////////////////
    	 // Оконный режим
       //////////////////////////////////////////////////////////
    	 RECT wndRect;
       RECT clientRect;
    	 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);
    
    	 // Получить формат пикселя
    	 D3DDISPLAYMODE d3ddm;
    	 (*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
    
    	 // Установка параметров
    	 d3dpp.BackBufferFormat = d3ddm.Format;
    	 d3dpp.SwapEffect    = D3DSWAPEFFECT_DISCARD;
    	 d3dpp.Windowed     = TRUE;
     }
     
     DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;
    
     // Создать 3D устройство
     HRESULT hRes;
     if(FAILED(hRes = (*ppiD3D9)->CreateDevice(
    	 D3DADAPTER_DEFAULT, 
    	 D3DDEVTYPE_HAL, hWnd, Flags, 
    	 &d3dpp, ppiD3DDevice9)))
    	 return hRes;
    
     // Установить перспективу
     float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight;
     D3DXMATRIX matProjection;
     D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 1.0f, 5000.0f);
     (*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);
    
     (*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, TRUE);
    
     return S_OK;
    }
    
    DWORD LoadMesh(char *filename, IDirect3DDevice9 *ppiD3DDevice9,
    			  ID3DXMesh **ppMesh,
    			  LPDIRECT3DTEXTURE9 **pMeshTextures,
    			  char *texturefilename, 
    			  D3DMATERIAL9 **pMeshMaterials
    			  )
    {
    	LPD3DXBUFFER pD3DXMtrlBuffer;
    	DWORD dwNumMaterials;
    
    	D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM,
    		ppiD3DDevice9, NULL, &pD3DXMtrlBuffer, NULL, &dwNumMaterials, ppMesh);
    
    	D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
    
    	(*pMeshTextures) = new LPDIRECT3DTEXTURE9[dwNumMaterials];
    	(*pMeshMaterials) = new D3DMATERIAL9[dwNumMaterials];
    
    	for( DWORD i=0; i<dwNumMaterials; i++ )
    	{
    		// Копируем материал
    		(*pMeshMaterials)[i] = d3dxMaterials[i].MatD3D;
    
    		// Создаем текстуру
    		if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
    			d3dxMaterials[i].pTextureFilename, &(*pMeshTextures)[i])))
    			if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
    				texturefilename, &(*pMeshTextures)[i])))
    				(*pMeshTextures)[i] = NULL;
    	}
    
    //	(ID3DXMesh *)(*ppMesh)->OptimizeInplace(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL);
    	return dwNumMaterials;
    }
    
    bool LoadTexture(DWORD* text_buf, int iWidth, int iHeight, char* filename)
    {
      HANDLE hFile = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);    
    	if(hFile == INVALID_HANDLE_VALUE) 
    		return FALSE;
    
    	BITMAPFILEHEADER bmpfilehdr; 
    	DWORD dwRead;
    	if(!ReadFile(hFile, &bmpfilehdr, sizeof(bmpfilehdr), &dwRead, NULL))
    		return FALSE;
      
    	char* ptr=(char*)&bmpfilehdr.bfType;
    	if (*ptr!='B' || *++ptr!='M')
    		return FALSE;
    
    	BITMAPINFOHEADER bmpinfohdr;
    	if(!ReadFile(hFile, &bmpinfohdr, sizeof(bmpinfohdr), &dwRead, NULL))
    		return FALSE;
    
    	if (bmpinfohdr.biCompression!=BI_RGB)
    		return 0;
    
    	int iImageSize=bmpinfohdr.biSizeImage;
    	if (iImageSize==0)
    		iImageSize=((iWidth*4+3) & ~3)*iHeight;
    
    	BYTE* buf=new BYTE[iImageSize];
    	if(!ReadFile(hFile, buf, iImageSize, &dwRead, NULL))
    		return FALSE;
    
      if (bmpinfohdr.biBitCount!=24)
    		return FALSE;
    
    	int bytesgiven=(iWidth*3+3) & ~3;
    	DWORD* btSurf = text_buf;
    	BYTE* imagebits = (BYTE*)(&buf[(iHeight-1)*bytesgiven]);
    
    	for (int i=0; i<iHeight; i++)
    	{
    		RGBTRIPLE* tlImage=(RGBTRIPLE*)imagebits;
    		for (int p=0; p<iWidth; p++)
    		{
    			*btSurf = (DWORD)((tlImage->rgbtBlue) | (tlImage->rgbtGreen << 8) | 
    				      (tlImage->rgbtRed << 16) | (0xFF << 24));
    			tlImage++;
    			btSurf++;
    		}
    		imagebits -= bytesgiven;
    	}
    
    	delete [] buf;
    	return TRUE;
    }
    
    Рекомендую создать их в проекте

    23 декабря 2010 г. 14:26
  • А как это сохранить как библиотеку и в проект засунуть?
    23 декабря 2010 г. 14:28
  • Создаешь в своем проекте новый .h файл с именем dxfunc.h. Копируешь в него содержимое.

    Создаешь в своем проекте новый .cpp файл с именем dxfunc.cpp. Копируешь в него содержимое.

    Заменяешь #include "..\..\common\dxfunc.h" на #include "dxfunc.h"

    23 декабря 2010 г. 14:35
  • А dxfunc.cpp это что?
    23 декабря 2010 г. 14:58
  • Мне кажется рано вы полезли в изучение directx, вам сначало нужно основы c++ изучить, cpp  - файл кода, выше приведено, что там должно быть, читайте внимательнее. В проект добавляется аналогично .h файлу.
    Для связи [mail]
    23 декабря 2010 г. 15:12
  • dxfunc.cpp - файл, прилагающийся к dxfunc.h. Содержит непосредственно код функций, объявленных dxfunc.h. Код вынесен в cpp файл для того, чтобы не засорять .h файл.
    23 декабря 2010 г. 15:35
  • Вылетает ошибка: http://s012.radikal.ru/i319/1012/39/3d7462d41797.jpg

    Что нетак?

    23 декабря 2010 г. 15:42
  • У вас в проекте присутствует файл stdafx.h?
    23 декабря 2010 г. 15:46
  • вот

    #include <windows.h>
    #include "d3d9.h"
    #include "d3dx9.h"
    #include "dxfunc.h"

    подключил все что надо, может я неправильно создал dxfunc.h, я нажал добавить новый элемент сделал 2 файла .h и .cpp и закинул в них код указанный выше, затем сохранил их..

    23 декабря 2010 г. 15:49
  • Добавил есче stdafx.h, ошибок стало есче больше
    23 декабря 2010 г. 15:51
  • Ладно, спасибо за помощь за подключение derectx,далье сам попробую разобраться
    23 декабря 2010 г. 15:55
  • Тогда лучше удалите его и отключите в свойствах проекта его использование:

    http://s44.radikal.ru/i104/1012/e6/62d527f01d0f.png

    И опишите возникшие ошибки после этого

    23 декабря 2010 г. 15:58
  • Happyyyy , не забудьте нажать на кнопку 'Пометить как ответ' для тех ответов, которые помогли вам :) Медали пользователя Медали пользователя Медали пользователя Медали пользователя Медали пользователя
    Для связи [mail]
    23 декабря 2010 г. 16:01

  • Кстати, раз вы используете winApi для создания окна, прийдется перед подключением windows.h добавить строчку (нововведение в VS2010):

    #define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows

    #include <windows.h>
    • Помечено в качестве ответа Abolmasov Dmitry 23 декабря 2010 г. 16:09
    23 декабря 2010 г. 16:03