最近真的是忙得要死了,所有课都开了,要应付必修课,又要准备设计师考试,三头六臂都不够用了,还好每天还能勉强的抽点时间学D3D。今天早上梦到了猪和去学开飞机了,好兆头,只要努力就能够成功。
开始一时大意在创建注册窗口和创建窗口是把窗口名称搞错了,查了半天才弄出来,忙活得够呛了,还好最后翻查《Windows程序设计》解决了,还是电子书好,不用天天扛着。
以后要更加努力才行!
源代码(代码非原创,是书上敲的)
- //《3D游戏编程》金容俊/肖永亮
- //创建顶点缓冲区Vertex Buffer
- //所谓顶点缓冲就是指存储顶点D3D对象,用户可以使用FVF随意定义格式。
- //这里将要使用的顶点是完成变换和光源处理的顶点。
- #include <d3d9.h>
- //全局参数
- LPDIRECT3D9 g_pD3D = NULL; //创建D3D设备的D3D对象参数
- LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //渲染使用中的D3D设备
- LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //存储顶点的顶点缓冲
- //定义用户顶点的结构体
- struct CUSTOMVERTEX
- {
- FLOAT x, y, z, rhw; //顶点的变换坐标(具有rhw值是完成变换的顶点)
- DWORD color; //顶点的颜色
- };
- //表现用户顶点结构体信息的FVF
- //结构体由X, Y, Z, RHW值和Diffuse颜色组成
- #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
- //Direct3D初始化
- HRESULT InitD3D(HWND hWnd)
- {
- //创建一个用来创建设备的D3D对象
- 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_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
- {
- return E_FAIL;
- }
- //这里对设备状态信息进行处理
- return S_OK;
- }
- ///创建顶点缓冲,设置顶点缓冲
- ///顶点缓冲就是基本包含顶点数据的存储器块
- ///创建顶点缓冲之后,必须调用Lock()函数Unlock()函数来定义指针将顶点数据写入顶点缓冲
- HRESULT InitVB()
- {
- //渲染三角形的三个顶点声明
- CUSTOMVERTEX vertices[] =
- {
- //x, y, z, rhw, color
- {150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, },
- {250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
- { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
- };
- //创建顶点缓冲
- //分配存储三个用户顶点的存储器
- //指定存储FVF的数据格式
- if(FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
- D3DPOOL_DEFAULT, &g_pVB, NULL)))
- {
- return E_FAIL;
- }
- //将数据写入顶点缓冲
- //调用顶点缓冲的Lock()函数,定义指针
- VOID* pVertices;
- if(FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))
- return E_FAIL;
- memcpy(pVertices, vertices, sizeof(vertices));
- g_pVB->Unlock();
- return S_OK;
- }
- //删除初始化对象
- VOID Cleanup()
- {
- if(g_pVB != NULL)
- g_pVB->Release();
- if(g_pd3dDevice != NULL)
- g_pd3dDevice->Release();
- if(g_pD3D != NULL)
- g_pD3D->Release();
- }
- //绘图
- VOID Render()
- {
- //将后置缓冲清除,同时设置为蓝色(0,0,255)
- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0);
- //开始渲染
- if(SUCCEEDED(g_pd3dDevice->BeginScene()))
- {
- //绘制顶点缓冲的三角形
- //1.使包含顶点的缓冲绑定一个设备数据流
- g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
- //2.想D3D指定顶点着色信息,大多数情况下只指定FVF格式
- g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
- //3.调用输出几何的DrawPrimitive()函数
- g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
- //结束渲染
- g_pd3dDevice->EndScene();
- }
- //显示后置缓冲的动画
- g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
- }
- //窗口过程
- LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_DESTROY:
- Cleanup();
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hWnd, msg, wParam, lParam);
- }
- //程序的起始地址
- INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
- {
- //注册窗口类
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- TEXT("D3D Tutorial"), NULL };
- RegisterClassEx(&wc);
- //创建窗口 GetDesktopWindow()
- HWND hWnd = CreateWindow(TEXT("D3D Tutorial"), TEXT("D3D Tutorial 02:Vertices"),
- WS_OVERLAPPEDWINDOW, 100, 100, 640, 480,
- GetDesktopWindow(), NULL, wc.hInstance, NULL);
- //Direct3D初始化
- if(SUCCEEDED(InitD3D(hWnd)))
- {
- //顶点缓冲
- if(SUCCEEDED(InitVB()))
- {
- //显示窗口
- 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
- //如果没有需要处理的消息,调用Reader()函数
- Render();
- }
- }
- }
- //删除注册的类
- UnregisterClass(TEXT("D3D Tutorial"), wc.hInstance);
- return 0;
- }