我的InitD3D

初来乍到,这里速度好快啊,作为好的开始,贴一段我的代码请大家多提意见

     // ----------------------------------------------------------------------------------
    
//  功能:    创建窗口、初始化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 ;
    }

posted on 2007-05-15 17:03 hitmaen 阅读(863) 评论(0)  编辑 收藏 引用 所属分类: Directx


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(1)

随笔分类(9)

随笔档案(9)

OGRE

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜