//----------------------------------------------------------------------------------
// 功能: 创建窗口、初始化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;
}
// 创建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;
// 功能: 创建窗口、初始化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;
}
// 创建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.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, // 指定设备类型为HAL
m_pD3DWnd->m_hWnd, // Direct3D窗口的句柄
D3DCREATE_SOFTWARE_VERTEXPROCESSING,// 软件顶点处理
&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 );
//m_pDevice->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
// <--------------------------设置渲染状态
return true;
}
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, // 指定设备类型为HAL
m_pD3DWnd->m_hWnd, // Direct3D窗口的句柄
D3DCREATE_SOFTWARE_VERTEXPROCESSING,// 软件顶点处理
&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 );
//m_pDevice->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
// <--------------------------设置渲染状态
return true;
}













