zoukankan      html  css  js  c++  java
  • 【转贴】DXUT 框架入门 1

    CD3DApplication 框架类已经光荣的退役了,取而代之的是DXUT*系列函数。在这篇文章中将要简单介绍DXUT框架的应用。
    最近的directx 下载地址 , 这里面包含了64位操作系统库以及directx10等等,directx10 的程序例子只能运行在windows vista 上面。尽管可以编译,但缺少directx3d10 运行库. 在安装sdk之后,别忘记安装Redist目录中最新的directx运行库。
    在vc.net->tools->options中配置头文件以及库文件地址。

    使用dxut框架进行directx设计时,拷贝directx sdk 安装目录\Samples\C++\中的Common文件内容到你的程序目录下(如下图)。

    创建一个名为dxut 的windows apllication 空工程,然后在vc solution explorer 中项目下加入common目录(添加存在文件,注意dxsound两个文件没有加入),然后添加一个源文件main.cpp

    然后在vc solution explorer 中项目上点右键进入项目属性页(property pages)加入附加的common目录作为附加头文件搜索目录,同样在属性页的 linker->input->addtional dependencies 中加入 dxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.lib comctl32.lib 等链接库

    main.cpp 源文件内容如下:

    #include  < dxstdafx.h >
    // --------------------------------------------------------------------------------------
    //  当Directx3D设备被创建后,这个回调函数马上被调用,因为D3DPOOL_MANAGED资源在设备被销毁后
    //  需要重新装载,这里是最佳创建D3DPOOL_MANAGED资源的地方,创建的资源应在 OnDestroyDevice 
    //  函数中销毁 。
    // --------------------------------------------------------------------------------------
    HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9 *  pd3dDevice,  const  D3DSURFACE_DESC *  pBackBufferSurfaceDesc,  void *  pUserContext )
    {
     
    return  S_OK;
    }

    // --------------------------------------------------------------------------------------
    //  当direct3d设备被复位后,这个函数立即被调用,这里最好放置D3DPOOL_DEFAULT 资源代码,因为这
    //  这些资源在设备丢失后需要重新装载。在这里创建的资源应该在OnLostDevice 函数中释放
    // --------------------------------------------------------------------------------------
    HRESULT CALLBACK OnResetDevice( IDirect3DDevice9 *  pd3dDevice,  const  D3DSURFACE_DESC *  pBackBufferSurfaceDesc,  void *  pUserContext )
    {
     
    return  S_OK;
    }

    // --------------------------------------------------------------------------------------
    //  在Direct3D设备进入lost状态后在IDirect3DDevice9::Reset 调用之前调用此函数,在OnResetDevice 
    //  中创建的资源必须在这里释放,通常包括所有的D3DPOOL_DEFAULT 资源,
    // --------------------------------------------------------------------------------------
    void  CALLBACK OnLostDevice(  void *  pUserContext )
    {

    }

    // -------------------------------------------------------------------------------------- 
    // 这个回调函数在每帧的开始被调用,这个在你的程序中用来处理场景更新最好的位置,但不能包含实际的
    // 场景渲染调用,渲染工作应该放在OnFrameRender 回调函数中。常用于矩阵转换、摄像机等操作。
    // --------------------------------------------------------------------------------------
    void  CALLBACK OnFrameMove( IDirect3DDevice9 *  pd3dDevice,  double  fTime,  float  fElapsedTime,  void *  pUserContext )
    {
    }

    // --------------------------------------------------------------------------------------
    // 此回调函数在每Frame最后被调用,在场景上执行所有的渲染调用,当窗口需要重绘(处理WM_PAINT消
    // 息)时此函数也会被调用(此时不调用OnFrameMove),在此函数返回后,DXUT将调用
    // IDirect3DDevice9::Present 来显示翻转链中下一个缓冲区内容。
    // --------------------------------------------------------------------------------------
    void  CALLBACK OnFrameRender( IDirect3DDevice9 *  pd3dDevice,  double  fTime,  float  fElapsedTime,  void *  pUserContext )
    {
     HRESULT hr;
     V( pd3dDevice
    -> Clear( 0 , NULL, D3DCLEAR_TARGET  |  D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0 0 0 0 ),  1.0f 0 ) );
     
    if (SUCCEEDED(pd3dDevice -> BeginScene()))
     
    {
      
    // 更新图像
      pd3dDevice -> EndScene();
     }

    }

    // -------------------------------------------------------------------------------------- 
    // 此回调函数在direct3d设备被销毁时调用,通常发生在程序终止,在OnCreateDevice 中创建的资源,要
    // 在这里释放,通常包含所有的D3DPOOL_MANAGED资源
    // IDirect3DDevice9::Present 来显示翻转链中下一个缓冲区内容。
    // --------------------------------------------------------------------------------------
    void  CALLBACK OnDestroyDevice(  void *  pUserContext )
    {
     
    }

    INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, 
    int  )
    {
     
    //  设置回调函数,这些函数允许DXUT通知应用程序更换设备,用户输入和窗口消息。
     
    //  回调函数是可选的,因此你要做的仅是设置你感兴趣的事件的回调函数。
     DXUTSetCallbackDeviceCreated( OnCreateDevice );
     DXUTSetCallbackDeviceReset( OnResetDevice );
     DXUTSetCallbackDeviceLost( OnLostDevice );
     DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
     DXUTSetCallbackFrameRender( OnFrameRender );
     DXUTSetCallbackFrameMove( OnFrameMove );

     
    //  初始化DXUT并创建想要的Win32窗口和应用程序的Direct3D设备。调用这些
     
    //  可选函数中的每一个,此外它们允许你设置几个选项来控制框架的行为。
     DXUTInit( TRUE, TRUE, TRUE );
     
    // directx 编码是unicode环境,所以字符串之前要加 L 。
     DXUTCreateWindow( L " Welcome to topameng.spaces.live.com "  );
     DXUTCreateDevice( D3DADAPTER_DEFAULT, TRUE, 
    640 480  );
     
    //  通过DXUT来处理消息循环并分派渲染调用。当在空闲时间和处理窗口消息的
     
    //  时间间隔时,框架将调用OnFrameMove和OnFrameRender回调函数。
     DXUTMainLoop();
     
    return  DXUTGetExitCode();
    }

    direct3d Memory Pools(内存池)
    表面和其它一些D3D资源被放在多种内存池中。内存池的种类由D3DPOOL枚举类型的一个成员来指定。它可以为下列几种:
    1.D3DPOOL_DEFAULT——表示D3D将根据资源的类型和用途把它们放在最合适的地方。这有可能是显存、AGP内存或者系统内存中。值得注意的是,这种内存池中的资源必须要在IDirect3DDevice9::Reset被调用之前消毁掉,然后必须重新初始化。
    2.D3DPOOL_MANAGED——资源将由D3D管理并且按设备的需要来指定放在显存还是放在AGP内存中,同时备份这些资源到系统内存中。当应用程序访问和改变资源,也会对系统内存造成影响。
    3.D3DPOOL_SYSTEMMEM——指定资源放在系统内存中。
    4.D3DPOOL_SCRATCH——规定资源放在系统内存中,它与D3DPOOL_SYSTEMMEM不同之处在于使用这个参数使图形设备不能访问本内存池的资源,但资源可以被复制出去。
    也可以打开direct sdk 安装目录Samples\C++\Direct3D\EmptyProject  例子,基本和上面是相同的


  • 相关阅读:
    SCILAB简介[z]
    UG OPEN API编程基础 2约定及编程初步
    Office 2003与Office 2010不能共存的解决方案
    UG OPEN API 编程基础 3用户界面接口
    NewtonRaphson method
    UG OPEN API编程基础 13MenuScript应用
    UG OPEN API编程基础 14API、UIStyler及MenuScript联合开发
    UG OPEN API编程基础 4部件文件的相关操作
    UG OPEN API编程基础 1概述
    16 UG Open的MFC应用
  • 原文地址:https://www.cnblogs.com/flying_bat/p/877262.html
Copyright © 2011-2022 走看看