Инициализация Direct3D MVS2008
У меня возникла проблема и как камень перегородила дорогу на моем пути :mad:
Цель: осваиваю азы и пытаюсь создать устройство, как я понял просто для отоброжения окна
Использую: MVS 2008 и Microsoft DirectX 9 SDK (June 2010)
Проблема: Выдает две ошибки и понятия не имею, что и как исправить:
1>
Код:
dxfunc.obj : error LNK2019: unresolved external symbol _D3DXMatrixPerspectiveFovLH@20 referenced in function "long __cdecl DX3DInit(struct IDirect3D9 * *,struct IDirect3DDevice9 * *,struct HWND__ *,unsigned long,unsigned long,int)" (?DX3DInit@@YAJPAPAUIDirect3D9@@PAPAUIDirect3DDevice9@@PAUHWND__@@KKH@Z)
2>
Код:
dxfunc.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "long __cdecl DX3DInit(struct IDirect3D9 * *,struct IDirect3DDevice9 * *,struct HWND__ *,unsigned long,unsigned long,int)" (?DX3DInit@@YAJPAPAUIDirect3D9@@PAPAUIDirect3DDevice9@@PAUHWND__@@KKH@Z)
Я пока что только пытаюсь освоить как программировать в DirectX, но в итоге что бы я не делал, в конце я прихожу к этим ошибкам :(
В самом коде ошибок нет, но на всякий случай выкладываю:
Код:
#include <windows.h> //В программировании для Windows необходим только один заголовочный файл с именем windows.h.
#include "d3d9.h"
#include "d3dx9.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.1f, 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_D16;
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, 2.0f, 1000.0f);
(*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);
(*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK;
}
IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDevice = NULL;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int iCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = fnMessageProcessor;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);
wndclass.hbrBackground = (HBRUSH) GetStockObject (DKGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Window Class"; // Имя класса
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(RegisterClassEx(&wndclass) == 0)
{
// Сбой программы, выход
exit(1);
}
hWnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
"Window Class", // Имя класса
"Create Window Example", // Текст заголовка
WS_OVERLAPPEDWINDOW,
0,
0,
320,
200,
NULL,
NULL,
hInstance,
NULL);
if(DX3DInit(&pD3D, &pD3DDevice, hWnd, 800, 600, FALSE)!=S_OK)
{
MessageBox(hWnd, "Ошибка инициализации DirectX", "ERROR", MB_OK);
return FALSE;
}
ShowWindow(hWnd, iCmdShow);
while(GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
LRESULT CALLBACK fnMessageProcessor (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch(iMsg)
{
case WM_CREATE:
return(0);
case WM_PAINT:
return(0);
case WM_DESTROY:
PostQuitMessage(0);
return(0);
default:
return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
}
#include "d3d9.h"
#include "d3dx9.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.1f, 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_D16;
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, 2.0f, 1000.0f);
(*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);
(*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK;
}
IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDevice = NULL;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int iCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = fnMessageProcessor;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);
wndclass.hbrBackground = (HBRUSH) GetStockObject (DKGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Window Class"; // Имя класса
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(RegisterClassEx(&wndclass) == 0)
{
// Сбой программы, выход
exit(1);
}
hWnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
"Window Class", // Имя класса
"Create Window Example", // Текст заголовка
WS_OVERLAPPEDWINDOW,
0,
0,
320,
200,
NULL,
NULL,
hInstance,
NULL);
if(DX3DInit(&pD3D, &pD3DDevice, hWnd, 800, 600, FALSE)!=S_OK)
{
MessageBox(hWnd, "Ошибка инициализации DirectX", "ERROR", MB_OK);
return FALSE;
}
ShowWindow(hWnd, iCmdShow);
while(GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
LRESULT CALLBACK fnMessageProcessor (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch(iMsg)
{
case WM_CREATE:
return(0);
case WM_PAINT:
return(0);
case WM_DESTROY:
PostQuitMessage(0);
return(0);
default:
return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
}
oshibki, pokazivauschie otsutstvie podklucheniya DLL cherez LIB fail.
Ili v nastroikax proekta zadaetsya - Project/Properties/Linker/Input/Additional Dependencies
ili pragma comment.
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
Izuchai literaturu 'Osnovi C,C++'
Но немогу понять меня ввело в заблуждение, что подключение
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
тоже самое, что если в ручную добавить их Tools-options-Project and Solutions-и указать либы и инклуды, что я как бэ и сделал, но почему то не работает или это просто я не так понял на одном из форумов...