虽然有光盘,但还是全部在VS2005中手写了所有代码,书中的例子貌似大部分照搬了DirectX SDK Sample里的很多Samples,当然,个人觉得写的不错,也是逛书城后选中的三本三维开发书之一,挑的累哦,自己基础太差了,还有两本是:《游戏开发-剧本与角色创造》和《计算机图形学》(书为:精通DirectX 3D 图形动画程序设计/人民邮电出版社,ISBN:978-7-115-15971-7/TP)
全部源代码如下(部分注释是我看书后自己加的):
//============================================ //最简单的Direct3D程序 //============================================ #include <d3d9.h> //-------------------------------------------- //全局变量 //-------------------------------------------- LPDIRECT3D9 g_pD3D =NULL;//Direct3D对象 //g_pD3D是Direct3D接口指针 LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//Direct3D设备对象 //-------------------------------------------- //Desc:初始化Direct3D //-------------------------------------------- HRESULT InitD3D(HWND hWnd) ...{ //创建Direct3D对象,该对象用来创建Direct3D设备对象 if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; //设置D3DPRESENT_PARAMETERS结构,准备创建Direct3D设备对象) D3DPRESENT_PARAMETERS d3dpp;//创建Direct3D设备对象参数d3dpp ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed =TRUE;//窗口还是全屏幕 d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;//后台缓存复制到前台后,清除后台缓存 d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;//后台缓存格式和前台缓存格式相同 //创建Direct3D设备对象 if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL ,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))) //参数说明,按顺序:Adapter指定显卡序号,默认显卡,指定设备类型(HAL,硬件抽象层设备),窗口指针,软件运算方式) ...{ return E_FAIL; } return S_OK; } //---------------------------------------------- //Desc:释放创建对象 //---------------------------------------------- VOID Cleanup() ...{ //释放Direct3D设备对象 if (g_pd3dDevice!=NULL) g_pd3dDevice->Release();//对应COM计数器会减1 //释放Direct3D对象 if (g_pD3D!=NULL) g_pD3D->Release();//对应COM计数器会减1 } //---------------------------------------------- //Desc:渲染图形 //---------------------------------------------- VOID Render() ...{ //清空后台缓冲 g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,0,0),1.0f,0); //矩形数量;要清空的矩形区域,若值为NULL,则第一个参数为0;清空的内容:颜色缓冲区;清空颜色缓冲区后颜色缓冲区的值;颜色深度;模板值 if (SUCCEEDED(g_pd3dDevice->BeginScene())) ...{ //在后台缓冲区绘制图形 //结束在后台缓冲区绘制图形 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); return0; case WM_PAINT: Render(); ValidateRect(hWnd,NULL); return0; } 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"ClassName",NULL}; RegisterClassEx( &wc); //创建窗口 HWND hWnd=CreateWindow(L"ClassName",L"最简单的Direct3D程序",WS_OVERLAPPEDWINDOW,0,0,1024,768,NULL,NULL,wc.hInstance,NULL); //初始化Direct3D if (SUCCEEDED(InitD3D(hWnd))) ...{ //显示主窗口 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))//PeekMessage和GetMessage的区别 //PeekMessage过程中用来处理Render而GetMessage过门不入,不会抢系统控制权 ...{ TranslateMessage(&msg);//消息转换 DispatchMessage(&msg);//消息传递给窗口过程函数 } else ...{ Render();//渲染图形,渲染函数一般都是在程序空闲时调用的 } } } UnregisterClass(L"ClassName",wc.hInstance);//参数作用:要注销的类名字符串指针;应用程序句柄 return0; } //以上代码定义了一个具有最大,最小化按钮可调整大小的叠置式窗口。 //关于LRESULT //LRESULT Signed result of message processing. //This type is declared in WinDef.h as follows: //typedef LONG_PTR LRESULT; //关于LONG_PTR //LONG_PTR Signed long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic. //This type is declared in BaseTsd.h as follows: //#if defined(_WIN64) // typedef __int64 LONG_PTR; //#else // typedef long LONG_PTR; //#endif