正交投影的DIRECT2D绘图基础部分

时间:2022-04-25 04:38:03

使用正交投影的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);                                      }