DirectX 3D图形与动画程序设计第104-108页错误
那段代码无法正确执行,还有一个全局变量定义后一直没用
程序执行后无法实现书中的效果!~
D3DRECT g_ClentRect;这个变量一直未使用 ,全部代码如下
#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;}
#include <iostream> // 不是必须#include <windows.h>#include <d3d9.h>#include <mmsystem.h>using namespace std;#pragma comment(lib,"d3d9.lib")