初來乍到,這里速度好快啊,作為好的開始,貼一段我的代碼
請大家多提意見
// ----------------------------------------------------------------------------------
// 功能: 創建窗口、初始化D3D對象和設備.
// 返回: HRESULT
// ----------------------------------------------------------------------------------
HRESULT CItemD3D_Manager::InitD3D()
{
HRESULT hr;
// 創建窗口
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! 窗口創建失敗! " );
return false ;
}
m_pD3DWnd -> ShowWindow(SW_HIDE);
// 創建D3D對象
if (NULL == (m_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
AfxMessageBox( " ERROR! D3D對象創建失敗! " );
return false ;
}
D3DCAPS9 d3DCaps;
D3DDEVTYPE d3DDevType = D3DDEVTYPE_HAL; // 默認使用硬件加速
if ( FAILED( m_pD3D -> GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, & d3DCaps ) ) )
{
AfxMessageBox( " 不支持硬件加速,請參照幫助嘗試打開硬件加速功能,\n如若顯卡不支持硬件加速,建議進行顯卡升級。\n下面系統將采用軟件模擬硬件加速,速度會非常慢! " );
if ( FAILED( m_pD3D -> GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, & d3DCaps ) ) )
{
AfxMessageBox( " 不支持軟件加速,無法進行相關演示! " );
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;
// 創建D3D設備
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE displayMode;
hr = m_pD3D -> GetAdapterDisplayMode( D3DADAPTER_DEFAULT, & displayMode );
::ZeroMemory( & d3dpp, sizeof (d3dpp));
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferCount = 1 ; // 僅需要一個備份緩沖區
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, // 指定設備類型為HAL
m_pD3DWnd -> m_hWnd, // Direct3D窗口的句柄
behavior_flags, // 軟件頂點處理
& d3dpp,
& m_pDevice) ) )
{
AfxMessageBox( " ERROR! D3D設備創建失敗! " );
return hr;
}
// 設置渲染狀態 ------------------------->
// 啟用Z緩存,允許消隱處理
m_pDevice -> SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
// 關閉“挑選”功能,允許渲染背面
m_pDevice -> SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
// 打開環境光照
m_pDevice -> SetRenderState( D3DRS_AMBIENT, RGB( 255 , 255 , 255 ) );
// 打開光照處理
m_pDevice -> SetRenderState( D3DRS_LIGHTING, TRUE );
// 自動對法線矢量進行歸一化處理
m_pDevice -> SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
m_pDevice -> SetRenderState( D3DRS_SPECULARENABLE, true );
m_pDevice -> SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
// 啟用材質阿爾法混合
m_pDevice -> SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );
// <--------------------------設置渲染狀態
return true ;
}