DirectX 3D图形与动画程序设计第104-108页异常
DirectX 3D图形与动画程序设计第104-108页错误
那段代码无法正确执行,还有一个全局变量定义后一直没用
程序执行后无法实现书中的效果!~
D3DRECT g_ClentRect;这个变量一直未使用 ,全部代码如下
那段代码无法正确执行,还有一个全局变量定义后一直没用
程序执行后无法实现书中的效果!~
D3DRECT g_ClentRect;这个变量一直未使用 ,全部代码如下
- C/C++ code
#include<d3dx9.h> #pragma comment(lib,"d3dx9.lib") #pragma comment(lib,"winmm.lib") LPDIRECT3D9 g_pD3D =NULL; LPDIRECT3DDEVICE9 g_pd3dDevice =NULL; LPDIRECT3DVERTEXBUFFER9 g_pVB =NULL; HWND g_Wnd =NULL; D3DRECT g_ClentRect; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ)|(D3DFVF_DIFFUSE)//书上的代码不正确,编译不过, //-------------------------------------- // Desc:顶点结构 //-------------------------------------- struct CUSTOMVERTEX { D3DXVECTOR3 position; DWORD color; }; //-------------------------------------- // Desc:设置世界矩阵 //-------------------------------------- VOID SetupWorldMatrice(){ //建立一个绕X轴动态旋转的世界矩阵 D3DXMATRIX matWorld; UINT iTime = timeGetTime() % 1000; FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f; D3DXMatrixIdentity(&matWorld); D3DXMatrixRotationX(&matWorld,fAngle); //设置世界矩阵 g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld); } //-------------------------------------- // Desc:设置观察矩阵和投影矩阵 //-------------------------------------- VOID SetupViewandProjMatrices() { //建立并设置观察矩阵 D3DXVECTOR3 vEyePt(0.0f,3.0f,-5.0f); D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f); D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f); D3DXMATRIX matView; D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec); g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView); //建立并设置投影矩阵 D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH(&matView,D3DX_PI/4,1.0f,1.0f,100.0f); g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj); } //-------------------------------------- // Desc:设置视区 //-------------------------------------- VOID SetupViewPort() { RECT rect; GetClientRect(g_Wnd,&rect); D3DVIEWPORT9 vp; vp.X =0; vp.Y =0; vp.Width =rect.right; vp.Height =rect.bottom; vp.MinZ =0.0f; vp.MaxZ =1.0f; g_pd3dDevice->SetViewport(&vp); } //-------------------------------------- // Desc:初始化Direct3D //-------------------------------------- HRESULT InitD3D(HWND hWnd){ if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed=TRUE; d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat=D3DFMT_UNKNOWN; if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,//D3DDEVTYPE_HAL创建失败!硬件不支持! D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pd3dDevice))) { return E_FAIL; } //设置剔除模式为不剔除任何表面(正面和反面) g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); //关闭光照处理,默认情况下启用光照处理 g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE); //设置观察和投影矩阵 SetupViewandProjMatrices(); //设置视区 SetupViewPort(); return S_OK; } //-------------------------------------- // Desc:创建场景图形 //-------------------------------------- HRESULT InitGeometry() { //创建顶点缓冲区 if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX), 0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&g_pVB,NULL))) { return E_FAIL; } //填充顶点缓冲区 CUSTOMVERTEX* pVertices; if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0))) return E_FAIL; for(DWORD i=0;i<50;i++) { FLOAT theta = (2*D3DX_PI * i)/(50-1); pVertices[2*i+0].position = D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta)); pVertices[2*i+0].color= 0xffffff00; pVertices[2*i+1].position = D3DXVECTOR3(sinf(theta),1.0f,cosf(theta)); pVertices[2*i+1].color=0xffffff00; } g_pVB->Unlock(); return S_OK; } //-------------------------------------- // Desc:释放对象资源 //-------------------------------------- VOID Cleanup(){ if(g_pVB != NULL) g_pVB->Release(); if(g_pd3dDevice != NULL) g_pd3dDevice->Release(); if(g_pD3D != NULL) g_pD3D->Release(); } //-------------------------------------- // Desc:渲染图形 //-------------------------------------- VOID Render(){ g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0); if(SUCCEEDED(g_pd3dDevice->BeginScene())) { SetupWorldMatrice(); //在后台缓冲区绘制图形 g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2*50-2); //结束在后台缓冲区绘制图形 g_pd3dDevice->EndScene(); } g_pd3dDevice->Present(NULL,NULL,NULL,NULL); } //-------------------------------------- // Desc:消息处理 //-------------------------------------- LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg) { case WM_DESTROY: Cleanup(); PostQuitMessage(0); return 0; case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: Cleanup(); PostQuitMessage(0); break; } } return DefWindowProc(hWnd,msg,wParam,lParam); } //-------------------------------------- // Desc:程序入口 //-------------------------------------- INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT){ WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L, GetModuleHandle(NULL),NULL,NULL,NULL,NULL, L"DxPro",NULL}; RegisterClassEx(&wc); HWND hWnd = CreateWindow(L"DxPro",L"DxPro", WS_OVERLAPPEDWINDOW,200,100,500,500, GetDesktopWindow(),NULL,wc.hInstance,NULL); g_Wnd = hWnd; if(SUCCEEDED(InitD3D(hWnd))) { if(SUCCEEDED(InitGeometry())) { ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd); MSG msg; ZeroMemory(&msg,sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); } } } } UnregisterClass(L"ClassName",wc.hInstance); return 0; }