我的InitD3D()

来源:互联网 发布:手机淘宝编辑宝贝图片 编辑:程序博客网 时间:2024/05/22 05:34
//----------------------------------------------------------------------------------
// 功能:    创建窗口、初始化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;
}
 
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;
}