我的InitD3D()

这段代码展示了如何创建窗口并初始化Direct3D对象和设备。首先创建窗口,然后通过Direct3DCreate9函数创建D3D对象。接着,根据全屏或窗口模式设置D3DPRESENT_PARAMETERS,并创建D3D设备。最后,设置渲染状态,包括启用Z缓存、光照处理和材质混合等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//----------------------------------------------------------------------------------
// 功能:    创建窗口、初始化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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值