#include <stdafx.h> ///Подключил .h Файлы
#include <windows.h>
#include <d3d9.h>
#include <d3dx9math.h>
IDirect3D9 *D3dObject; /////Всё по стандартному
IDirect3DDevice9 *D3dDevice;
IDirect3DVertexBuffer9 *D3dVertexBuffer;
D3DXMATRIX M_world; /////Матрицы....
D3DXMATRIX M_cam;
D3DXMATRIX M_pro;
D3DXVECTOR3 cam(0.0f,-100.0f,0.0f); ////Векторы камер
D3DXVECTOR3 at(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
struct Vertex ////Структура Нашего "Куба" ))
{
float x, y, z,rhw;
DWORD color;
};
Vertex cube[] = ////Собственно сам кубик))
{
// лицевая грань
{20, 20, 4, D3DCOLOR_XRGB(0,0,0)},
{ 60, 20, 4, D3DCOLOR_XRGB(0,0,0)},
{ 40, 40, 4, D3DCOLOR_XRGB(0,0,0)}
};
#define CUSTOM_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) ////Эти...Как их там... ИКС_ИГРЕК_ЗЕД проекции и Цвет
LRESULT __stdcall MainWindowProc /////Всё по стандартному
(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
int __stdcall WinMain /////Всё по стандартному
(
HINSTANCE instance,
HINSTANCE previousInstance,
LPSTR commandLine,
int commandShow
)
{
WNDCLASS wc; /////Всё по стандартному
ZeroMemory(&wc, sizeof(wc)); /////Всё по стандартному
wc.style = CS_HREDRAW | CS_VREDRAW; /////Всё по стандартному
wc.hInstance = instance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = "mywndclass";
wc.lpfnWndProc = MainWindowProc;
if( !RegisterClass(&wc) )
return 0;
HWND AppWnd = CreateWindow /////Всё по стандартному
(
"mywndclass",
"d3d test",
WS_OVERLAPPEDWINDOW,
40, 40, 500, 500,
NULL,
NULL,
instance,
NULL
);
if( !AppWnd ) /////Всё по стандартному
return 0;
D3dObject = Direct3DCreate9(D3D_SDK_VERSION); /////Всё по стандартному
if( !D3dObject )
return 0;
D3DPRESENT_PARAMETERS d3dpp; /////Всё по стандартному
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; /////Всё по стандартному
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
HRESULT res; /////Всё по стандартному
res = D3dObject -> CreateDevice /////Создаём девайс
(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AppWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&D3dDevice
);
if( res != D3D_OK )/////Всё подчищяем
{
D3dVertexBuffer->Release();
D3dDevice -> Release();
D3dObject -> Release();
return 0;
}
ShowWindow(AppWnd, commandShow); /////Всё по стандартному
UpdateWindow(AppWnd);
MSG msg; /////Обработка сообщений
while( GetMessage(&msg, NULL, 0, 0) > 0 )
{
DispatchMessage(&msg);
}
D3dVertexBuffer -> Release();
D3dDevice -> Release();
D3dObject -> Release();
return msg.wParam;
}
LRESULT __stdcall MainWindowProc /////Всё по стандартному
(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
switch(msg) /////Всё по стандартному
{
case WM_PAINT:
D3DXMatrixLookAtLH(&M_cam,&cam,&at,&up); /////Камера
D3DXMatrixPerspectiveFovLH(&M_pro,D3DX_PI/4,1,1,250); /////Перспектива
D3dDevice->SetTransform(D3DTS_WORLD,&M_world); /////Всё по стандартному
D3dDevice->SetTransform(D3DTS_VIEW,&M_cam); /////Всё по стандартному
D3dDevice->SetTransform(D3DTS_PROJECTION,&M_pro); /////Всё по стандартному
D3dDevice -> CreateVertexBuffer/////Буффер
(
3 * sizeof(Vertex),
0,
CUSTOM_FVF,
D3DPOOL_DEFAULT,
&D3dVertexBuffer,
NULL
);
void *p;
D3dVertexBuffer -> Lock(0, 0, &p, 0);/////Заполнение
CopyMemory(p, cube, 3 * sizeof(Vertex));
D3dVertexBuffer -> Unlock();
D3dDevice -> Clear/////Всё по стандартному
(
0,
NULL,
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(255,255,255),
1,
0
);
D3dDevice -> BeginScene();/////Начинем
D3dDevice -> SetStreamSource(0, D3dVertexBuffer, 0, sizeof(Vertex));/////Поток
D3dDevice -> SetFVF(CUSTOM_FVF);
D3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);/////рисуем
D3dDevice -> EndScene();/////КОНЧАЕМ))))
D3dDevice -> Present(NULL, NULL, NULL, NULL);/////Смотрим))
RECT wndRect;/////Сам не знаю на*иг это здалось ))
GetClientRect(hwnd, &wndRect);
ValidateRect(hwnd, &wndRect);
return 0;
case WM_DESTROY: /////Дестрой он и в Африке Дестрой ))
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);/////Всё по стандартному
}
Матрицы
Проблема в том , что не работают матрицы, или ещё что то, не могу понять.
Код:
А ещё ,при правке
Код:
#define CUSTOM_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
в
Код:
#define CUSTOM_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
и изменении сруктуры следовательно,не отображается треугольник.
Во первых
Код:
D3DXVECTOR3 cam(0.0f,-100.0f,0.0f);
переправил на
Код:
D3DXVECTOR3 eye( 0, -100, -150);
И второе
Код:
D3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);
переправил на
Код:
D3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 3);
Поясняю.В первом случии переместил вектор камеры по Z координате на 100 единиц назад.
А во втором случии переправил кол.рисуемых примитив с 1-го до 3-ёх.
Вот и вся ошибка)
Цитата: karimchik
Код:
D3DXVECTOR3 cam(0.0f,-100.0f,0.0f);
переправил на
Код:
D3DXVECTOR3 eye( 0, -100, -150);
И чему вас эти чудовищные ошибки научили?
По книги в листинге именно такие координаты!
И тем более была ещё одна ошибка,моя , по отрисовки 3-ёх примитив, а не одной.
Цитата: karimchik
... по отрисовки 3-ёх примитив....
Эх, сильно сказано! вмемориз...
Цитата:
Эх, сильно сказано! вмемориз...
Не понял ,что такое "вмемориз..."))
А так ,проблема разрешена)
Ну и славненько. Прикроем этот безполезняк.