初來(lái)乍到,這里速度好快啊,作為好的開(kāi)始,貼一段我的代碼
請(qǐng)大家多提意見(jiàn)
// ----------------------------------------------------------------------------------
// 功能: 創(chuàng)建窗口、初始化D3D對(duì)象和設(shè)備.
// 返回: HRESULT
// ----------------------------------------------------------------------------------
HRESULT CItemD3D_Manager::InitD3D()
{
HRESULT hr;
// 創(chuàng)建窗口
CRect wndRect( 0 , 0 , 1024 , 768 );
m_pD3DWnd = new CItemD3D_Wnd( this );
if ( NULL == ( m_pD3DWnd -> CreateEx(
0 , AfxRegisterWndClass( 0 ,NULL,NULL,NULL),
" D3DITEM " , WS_CHILD | WS_VISIBLE & ~ WS_BORDER, wndRect,
CPage::s_pRightView, 0 , NULL) ) )
{
AfxMessageBox( " ERROR! 窗口創(chuàng)建失敗! " );
return false ;
}
m_pD3DWnd -> ShowWindow(SW_HIDE);
// 創(chuàng)建D3D對(duì)象
if (NULL == (m_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
AfxMessageBox( " ERROR! D3D對(duì)象創(chuàng)建失敗! " );
return false ;
}
D3DCAPS9 d3DCaps;
D3DDEVTYPE d3DDevType = D3DDEVTYPE_HAL; // 默認(rèn)使用硬件加速
if ( FAILED( m_pD3D -> GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, & d3DCaps ) ) )
{
AfxMessageBox( " 不支持硬件加速,請(qǐng)參照幫助嘗試打開(kāi)硬件加速功能,\n如若顯卡不支持硬件加速,建議進(jìn)行顯卡升級(jí)。\n下面系統(tǒng)將采用軟件模擬硬件加速,速度會(huì)非常慢! " );
if ( FAILED( m_pD3D -> GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, & d3DCaps ) ) )
{
AfxMessageBox( " 不支持軟件加速,無(wú)法進(jìn)行相關(guān)演示! " );
return false ;
}
d3DDevType = D3DDEVTYPE_REF;
}
bool hardware_process_enable = (d3DCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ? true : false );
DWORD behavior_flags;
behavior_flags = hardware_process_enable ?
D3DCREATE_HARDWARE_VERTEXPROCESSING : D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// 創(chuàng)建D3D設(shè)備
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE displayMode;
hr = m_pD3D -> GetAdapterDisplayMode( D3DADAPTER_DEFAULT, & displayMode );
::ZeroMemory( & d3dpp, sizeof (d3dpp));
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferCount = 1 ; // 僅需要一個(gè)備份緩沖區(qū)
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 生成16 bit的Z緩存
if (m_bFullScreen)
{
d3dpp.Windowed = FALSE;
d3dpp.BackBufferWidth = displayMode.Width;
d3dpp.BackBufferHeight = displayMode.Height;
d3dpp.BackBufferFormat = displayMode.Format;
}
else
{
d3dpp.Windowed = TRUE;
d3dpp.BackBufferFormat = displayMode.Format;
}
if ( FAILED( hr = m_pD3D -> CreateDevice(
D3DADAPTER_DEFAULT, // 使用缺省的顯卡
d3DDevType, // 指定設(shè)備類型為HAL
m_pD3DWnd -> m_hWnd, // Direct3D窗口的句柄
behavior_flags, // 軟件頂點(diǎn)處理
& d3dpp,
& m_pDevice) ) )
{
AfxMessageBox( " ERROR! D3D設(shè)備創(chuàng)建失敗! " );
return hr;
}
// 設(shè)置渲染狀態(tài) ------------------------->
// 啟用Z緩存,允許消隱處理
m_pDevice -> SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
// 關(guān)閉“挑選”功能,允許渲染背面
m_pDevice -> SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
// 打開(kāi)環(huán)境光照
m_pDevice -> SetRenderState( D3DRS_AMBIENT, RGB( 255 , 255 , 255 ) );
// 打開(kāi)光照處理
m_pDevice -> SetRenderState( D3DRS_LIGHTING, TRUE );
// 自動(dòng)對(duì)法線矢量進(jìn)行歸一化處理
m_pDevice -> SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
m_pDevice -> SetRenderState( D3DRS_SPECULARENABLE, true );
m_pDevice -> SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
// 啟用材質(zhì)阿爾法混合
m_pDevice -> SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );
// <--------------------------設(shè)置渲染狀態(tài)
return true ;
}