初来乍到,这里速度好快啊,作为好的开始,贴一段我的代码请大家多提意见
// ----------------------------------------------------------------------------------
// 功能: 创建窗口、初始化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 ;
}