typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; /* FullScreen_RefreshRateInHz must be zero for Windowed mode */ UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; } D3DPRESENT_PARAMETERS;
| 成員 |
說明 |
| BackBufferWidth BackBufferHeight |
后備緩存區所需要的寬度和高度。 如果使用全屏模式,則必須使用顯示器所支持的分辨率(使用EnumAdapterMode獲取各種分辨率) 如果使用窗口模式,默認使用0。 |
| BackBufferFormat |
后備緩沖區使用的顏色模式。即顏色深度和格式。 如果使用全屏模式,可以使用設備支持的任何顏色模式。使用CheckDeviceType方法來檢查。 如果使用窗口模式,則必須使用當前窗口使用的顏色模式。可以使用D3DFMT_UNKOWN,系統會自動獲取該值。 |
| BackBufferCount |
后備緩沖區的數目。可以為0,1,2,3. 通常一個后備緩沖區就足夠了。 |
| MultiSampleType |
多重采樣類別,用於圖形反鋸齒。使用1X – 16X。 注意,使用高級別的多重采樣類別的話,會消耗更多的圖形顯存。 |
| SwapEffect |
指定系統如何將后台緩沖區的內容復制到前台緩沖區,從而在屏幕上顯示。它的值有: D3DSWAPEFFECT_DISCARD:清除后台緩存的內容 D3DSWAPEEFECT_FLIP:保留后台緩存的內容。當緩存區>1時。 D3DSWAPEFFECT_COPY: 保留后台緩存的內容,緩沖區=1時。 一般情況下使用D3DSWAPEFFECT_DISCARD |
| hDeviceWindow |
指定進行渲染的窗口。 |
| Windowed |
指定窗口模式。True = 窗口模式;False = 全屏模式 |
| EnableAutoDepthStencil |
指定是否需要DirectX自動管理深度緩沖(用於關於每個像素點的深度信息)。3D場景應該開啟深度測試。 |
| AutoDepthStencilFormat |
深度緩沖的格式。一般使用D3DFMT_D16,即深度值用16位二進制表示。位數越多,場景繪制得越精確,相應內存消耗更多。 |
| Flags |
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER表示鎖定后備緩沖區。一般情況下不使用。默認為0. |
| FullScreen_RefreshRateInHz |
指定屏幕刷新率。 如果使用全屏模式的話,使用屏幕支持的任意頻率(使用EnumAdapterModes獲取)。值為0表示使用默認刷新率。 如果使用窗口模式的話,值必須為0,表示使用桌面刷新率。 |
| FullScreen_PresentationInterval |
指定后備緩沖區與前台緩沖區的交換頻率。一般情況下使用D3DPRESENT_INTERVAL_DEFAULT. D3DPRESENT_INTERVAL_DEFAULT: 窗口模式一定得用該選項! D3DPRESENT_INTERVAL_IMMEDIATE: VSync關閉,立即更新~ D3DPRESENT_INTERVAL_ONE:等待一個垂直掃描周期才更新,有助於減少剪斷和撕裂效果。 D3DPRESENT_INTERVAL_TWO ~ FOUR:分別等待相應個數周期才更新! |
創建Device代碼段:
bool CApp::InitD3D() { IDirect3D9 *d3d=0; d3d=Direct3DCreate9(D3D_SDK_VERSION); if (d3d==NULL) { MessageBox(m_hwnd,_T("Direct3DCreate9 ERROR!"),_T("ERROR"),MB_OK); return false; } D3DDEVTYPE d3dt=D3DDEVTYPE_HAL; D3DCAPS9 caps; d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,d3dt,&caps); int vp=0; if (caps.DevCaps& D3DDEVCAPS_HWTRANSFORMANDLIGHT) { vp=D3DCREATE_HARDWARE_VERTEXPROCESSING; }else { vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING; } D3DPRESENT_PARAMETERS d3dpp; d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8; d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8; d3dpp.EnableAutoDepthStencil=true; d3dpp.Flags=0; d3dpp.hDeviceWindow=m_hwnd; d3dpp.Windowed=m_bWindowed; d3dpp.MultiSampleQuality=0; d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE; if (m_bWindowed)//窗口模式 { d3dpp.BackBufferCount=1; d3dpp.BackBufferHeight=0; //窗口模式,默認使用0 d3dpp.BackBufferWidth=0; //窗口模式,默認使用0 d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT; //窗口模式一定得用 D3DPRESENT_INTERVAL_DEFAULT ! d3dpp.FullScreen_RefreshRateInHz=0;//顯示器刷新率,窗口模式該值必須為0 d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //指定系統如何將后台緩沖區的內容復制到前台緩沖區 D3DSWAPEFFECT_DISCARD:清除后台緩存的內容 }else { //全屏模式 d3dpp.BackBufferCount=2; d3dpp.BackBufferHeight=m_height;//可以用 GetSystemMetrics(SM_CXSCREEN) 獲得屏幕寬 d3dpp.BackBufferWidth=m_width; //可以用 GetSystemMetrics(SM_CYSCREEN) 獲得屏幕高 d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE; d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;//顯示器刷新率,窗口模式該值必須為0 d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP; //D3DSWAPEEFECT_FLIP:保留后台緩存的內容。當緩存區>1時。 } HRESULT hr=0; hr=d3d->CreateDevice(D3DADAPTER_DEFAULT,d3dt,m_hwnd,vp,&d3dpp,&m_device); if (FAILED(hr)) { MessageBox(m_hwnd,_T("CreateDevice ERROR"),_T("ERROR"),MB_OK); safe_release(d3d); return false; } return true; }
另外創建窗口的style風格也不一樣:
//創建窗口 if (m_bWindowed)//窗口模式 { m_hwnd=CreateWindowEx(NULL,_T("DXCLASSNAME"),lpcwTitle, (WS_OVERLAPPEDWINDOW|WS_VISIBLE)&~WS_THICKFRAME,0,0, m_width,m_height,NULL,NULL,hinstance,NULL); }else { //全屏模式 m_hwnd=CreateWindowEx(NULL,_T("DXCLASSNAME"),lpcwTitle, (WS_EX_TOPMOST|WS_VISIBLE|WS_POPUP),0,0, m_width,m_height,NULL,NULL,hinstance,NULL); }

