Шустрый

Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006
Репутация: нет Всего: нет
|
Код | #include <windows.h> #include <mmsystem.h> #include <d3d9.h> #include <d3dx9.h>
#pragma comment (lib, "winmm.lib") #pragma comment (lib, "d3d9.lib") #pragma comment (lib, "d3dx9.lib")
LPDIRECT3D9 pDirect3D = NULL; LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; LPDIRECT3DVERTEXBUFFER9 pVerBuff = NULL; LPDIRECT3DINDEXBUFFER9 pIndexBuff = NULL;
HWND hWnd; WNDCLASS WndClass; MSG Msg;
HRESULT InitD3D(HWND hWnd); HRESULT InitObj(); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void KillD3D(); void Render(); void Matrix();
struct CUSTOMVERTEX { float x,y,z; DWORD color; }; int D3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_DIFFUSE);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { char sxClNm[]="Hello, World!"; WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); WndClass.lpszMenuName = 0; WndClass.lpszClassName = sxClNm; RegisterClass(&WndClass); hWnd = CreateWindowEx(NULL,sxClNm,"DirectX Test",WS_OVERLAPPEDWINDOW, 100,100,640,480,NULL,NULL, hInstance, NULL); if(SUCCEEDED(InitD3D(hWnd))){ InitObj(); ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); while(Msg.message!=WM_QUIT) { if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE)){ TranslateMessage(&Msg); DispatchMessage(&Msg); } else Render(); } } return Msg.wParam; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { case WM_PAINT: Render(); return 0; case WM_DESTROY: KillD3D(); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,Message,wParam,lParam); }
HRESULT InitD3D(HWND hWnd) { if(NULL==(pDirect3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; D3DDISPLAYMODE Display; if(FAILED(pDirect3D->GetAdapterDisplayMode(NULL,&Display))) return E_FAIL; D3DPRESENT_PARAMETERS pDirect3DParameter; ZeroMemory(&pDirect3DParameter,sizeof(pDirect3DParameter)); pDirect3DParameter.Windowed = TRUE; pDirect3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD; pDirect3DParameter.BackBufferFormat = Display.Format; pDirect3DParameter.EnableAutoDepthStencil = TRUE; pDirect3DParameter.AutoDepthStencilFormat = D3DFMT_D16; if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pDirect3DParameter,&pDirect3DDevice))) return E_FAIL; pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW); pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE); pDirect3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); return S_OK; }
void Render() { if(pDirect3DDevice==NULL) return; pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),0,0); pDirect3DDevice->BeginScene(); Matrix(); pDirect3DDevice->SetStreamSource(0,pVerBuff,0,sizeof(CUSTOMVERTEX)); pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice->SetIndices(pIndexBuff); pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12); pDirect3DDevice->EndScene(); pDirect3DDevice->Present(NULL,NULL,NULL,NULL); }
void KillD3D() { pDirect3DDevice->Release(); pDirect3D->Release(); pVerBuff->Release(); //pIndexBuff->Release(); }
HRESULT InitObj() { CUSTOMVERTEX vertex[] = { {1.0f,-1.0f,1.0f,0x00000fff}, {-1.0f,-1.0f,1.0f,0xff000fff}, {-1.0f,1.0f,1.0f,0x00000fff}, {1.0f,1.0f,1.0f,0x00000fff},
{1.0f,-1.0f,-1.0f,0x00000fff}, {-1.0f,-1.0f,-1.0f,0xff000fff}, {-1.0f,1.0f,-1.0f,0x00000fff}, {1.0f,1.0f,-1.0f,0x00000fff} }; const unsigned short index[]={ 0,1,2, 2,3,0, 0,3,7, 7,4,0, 4,7,6, 6,5,4, 5,6,2, 2,1,5, 3,2,6, 6,7,3, 0,1,5, 5,4,0 }; if(FAILED(pDirect3DDevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&pVerBuff,NULL))) return E_FAIL; VOID* pBV; if(FAILED(pVerBuff->Lock(0,sizeof(vertex),(void**)&pBV,0))) return E_FAIL; memcpy(pBV,vertex,sizeof(vertex)); pVerBuff->Unlock();
if(FAILED(pDirect3DDevice->CreateIndexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFMT_INDEX16, D3DPOOL_DEFAULT,&pIndexBuff,NULL))) return E_FAIL; VOID* pBI; pIndexBuff->Lock(0,sizeof(index),(void**)&pBI,0); memcpy(pBI,index,sizeof(index)); pIndexBuff->Unlock(); return S_OK; }
void Matrix() { D3DXMATRIX MxWorld; D3DXMATRIX MxView; D3DXMATRIX MxProj;
UINT time = timeGetTime()%5000; float angle = time*(2.0f*D3DX_PI)/5000.0f; D3DXMatrixRotationY(&MxWorld,angle); pDirect3DDevice->SetTransform(D3DTS_WORLD,&MxWorld);
D3DXMatrixLookAtLH(&MxView,&D3DXVECTOR3(0.0f,3.0f,-8.0f), &D3DXVECTOR3(0.0f,0.0f,0.0f), &D3DXVECTOR3(0.0f,1.0f,0.0f)); pDirect3DDevice->SetTransform(D3DTS_VIEW,&MxView);
D3DXMatrixPerspectiveLH(&MxProj,(1.0f+1.0f/3.0f),1.0f,1.0f,100.0f); pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MxProj); }
|
вот, как только врубаю zbuffer - ничего не чертится, отрубаю - всё норм. изучаю дайрект по книге станислава горнакова, может источник устарел и нужно как то другому делать?
|