使用正交投影的Direct2D绘图基础部分
引用:http://hi.baidu.com/shallow_sleep/blog/item/84a1c7f42f12a5d0f3d38513.html
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
IDirect3D9* _d3d9; //全局变量
_d3d9=Direct3DCreate9(D3D_SDK_VERSION); D3DCAPS9 caps; _d3d9->GetDeviceCaps( D3DADAPTER_DEFAULT, //指定主显卡 D3DDEVTYPE_HAL, //指定设备内容 一般使用D3DDEVTYPE_HAL硬件加速. &caps); int vp=0; if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT) {//检测硬件是否支持变换和灯光的,如果支持,设定为用硬件(加速)处理 vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; } else { //如果不是,设定为用软件处理 vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; } //创建设备 D3DPRESENT_PARAMETERS d3dpp;d3dpp.BackBufferWidth = 800; //分辨率d3dpp.BackBufferHeight = 600;d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //像素格式d3dpp.BackBufferCount = 1;d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //抗锯齿:无d3dpp.MultiSampleQuality = 0; //抗锯齿等级d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //翻转方式:D3DSWAPEFFECT_DISCARD:一般用于全屏、每帧刷新; //D3DSWAPEFFECT_FLIP:双缓冲 //D3DSWAPEFFECT_COPY:从后缓冲拷贝 //D3DSWAPEFFECT_COPY_VSYNC:从后缓冲拷贝并垂直同步,防止画面撕裂d3dpp.hDeviceWindow = hWnd; //窗口句柄d3dpp.Windowed = false; //是否全屏d3dpp.EnableAutoDepthStencil = true; //是否有深度缓存和模板缓存d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; //深度缓存和模板缓存的格式 d3dpp.Flags = 0;d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //刷新频率d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; IDirect3DDevice9* device = 0;HRESULT hr = _d3d9->CreateDevice( D3DADAPTER_DEFAULT, // 主显卡 D3DDEVTYPE_HAL, // 设备格式:硬件加速 hWnd, // 窗口句柄 vp, // 顶点处理方式,刚测试过 &d3dpp, &device);if( FAILED(hr) ){ ::MessageBoxA(0, "CreateDevice() - FAILED", 0, 0); return 0;}
3. 恢复窗口
会在调整窗口时用到,可能还会在设备丢失时用到(不确定)。
void RestoreWindow(float w, float h){ //创建视口D3DVIEWPORT9 view;view.X = 0;view.Y = 0;view.Width = w;view.Height = h;view.MinZ = 0.0f;view.MaxZ = 1.0f;// 创建视口并添加到设备if (FAILED(g_pd3dDevice->SetViewport(&view))){ MessageBoxA(0,"Failed to create a viewport",0,0);};D3DXMATRIX Ortho2D;D3DXMATRIX Identity;//2D,所以使用正交投影;3D请查D3DXMatrixPerspectiveFovLHD3DXMatrixPerspectiveFovLH(&Ortho2D,w,h,0.0f,1.0f); D3DXMatrixIdentity(&Identity);g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D);g_pd3dDevice->SetTransform(D3DTS_WORLD, &Identity); g_pd3dDevice->SetTransform(D3DTS_VIEW, &Identity);//关闭光照,否则不定义法线则为黑色g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); }
4. 渲染
放在WM_PAINT消息中。
void Render(){ //清除屏幕 g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255,0,0,0), 1.0f, 0); //BeginScene和EndScene必须成对出现,不能嵌套 g_pd3dDevice->BeginScene(); // render game scene here g_pd3dDevice->EndScene(); //在后缓冲区复制最后翻转到前台显示 g_pd3dDevice->Present(NULL, NULL, NULL, NULL); }