zoukankan      html  css  js  c++  java
  • Direct3D API函数

     DirectX 目录
    //
    // 1.D3D基本框架....................................1
    //
    //    创建D3D对象.................................. 2
    //
    //    获取显卡显示模式..............................2
    //
    //    创建D3D设备接口...............................2
    //
    //    开始渲染和结束渲染............................2
    //
    //    清空图形绘制区................................2
    //
    //    屏幕反转......................................2

    // 2.绘制基本图形...................................1
    //
    //      绘制基本图形 ...............................4
    //
    //      灵活定点格式(FVF)........................ 2
    //      基本图元的绘制..............................2
    //      创建顶点缓冲区..............................2
    //
    //      基本图元的绘制..............................2
    //
    //      保存顶点....................................2
    //
    //      设置渲染状态................................2
    //
    //      图形绘制....................................2
    //
    //      索引缓冲....................................4
    //
    //      顶点设置....................................2
    //
    //      创建索引缓冲区..............................2
    //
    //      保存顶点索引值..............................2
    //
    //      索引图形绘制................................2
    //
    //      D3D中的图形学...................................... 4
    //
    //      D3D中的向量........................................2
    //
    //      D3D中的矩阵........................................2
    //
    //      D3D中的平面........................................2
    //
    //      D3D中的射线........................................ 2
    //
    //      D3D中的图形变换......................................2


    // 3.纹理 ......................................... 4
    //
    //      从磁盘文件获取纹理.................................................2
    //      设置当前要渲染的纹理...............................................2
    //
    //      设置纹理的渲染状态.................................... 2
    //
    //      设置纹理采样属性..................................... 2
    //
    //      从一张纹理图形中生成多级纹理..............................2
    //
    //      包装纹理寻址......................................................2
    //      镜像纹理寻址......................................................2
    //      夹取纹理寻址......................................................2
    //      边框颜色纹理寻址.................................................. 2
    //      一次镜像纹理寻址.................................................. 2
    //      纹理包装.........................................................2

    // 4.光照..........................................4
    //
    //     D3D光照的基本实现....................................4
    //  
    //     顶点格式.......................................... 2
    //
    //     设置物体材质........................................2
    //
    //     添加光源.......................................... 2
    //
    //     激活光照运算........................................2


    // 5.摄像机 ........................................4
    //
    //     生成视图变换矩阵.............................2
    //     生成投影变换矩阵.............................2

    // 6.模型基础...................................... 4
    //
    //       ID3DXMesh接口基础..........................2
    //       ID3DXMesh接口相关..........................2
    //       应用.X文件.................................2

    //7.游戏中的基本特效 ............................... 4
    //
    //     检查硬件支持的深度缓冲区格式..............................2
    //
    //     激活深度测试........................................2
    //
    //     设置深度缓冲区更新....................................2
    //
    //     设置深度测试函数..................................... 2
    //
    //     激活Alpha混合......................................2
    //
    //     设置Alpha混合计算方式.................................2
    //
    //     设置Alpha混合系数................................... 2
    //
    //     激活Alpha测试......................................2
    //
    //     设置Alpha测试参考值..................................2
    //
    //     设置Alpha测试函数................................... 2
    //
    //     多边形填充模式...................................... 2
    //
    //     查询设备是否支持多重采样................................ 2
    //
    //     启用多重采样的全景图形反锯齿..............................2
    //
    //     设置多纹理混合方式....................................2
    //    
    //     激活雾化.......................................... 2
    //
    //     设置雾化计算方式..................................... 2
    //
    //     设置雾的颜色........................................2
    //
    //     设置雾的起始范围..................................... 2
    //
    //     指数雾化浓度........................................2
    //
    //     基于发散的雾化...................................... 2
    //
    //     创建2D字体........................................2
    //
    //     绘制字体.......................................... 2
    //
    //     创建3D文字网格...................................... 2

    // 8.游戏控制
    //
    //     DirectInput实现键盘控制
    //
    //     DirectInput实现鼠标控制
    //
    //     鼠标键选

    //9.游戏音乐音效....................................4


    /*创建DD33DD对象: */
     Direct3DCreate9(D3D_SDK_VERSION);

    /* 获取显卡显示模式:*/
     HRESULT GetAdapterDisplayMode(
          UINT    Adapter,        //指定显示卡序列号
          D3DDISPLAYMODE  *pMode  //存储显示模式的指针
         );

    /* 创建DD33DD 设备接口: */
    HRESULT CreateDevice(
      UINT     Adapter,             //显卡序列号
      D3DDEVTYPE       DeviceType,  //D3D设备类型
      HWND     hFocusWindow,        //所属窗口句柄
      DWORD      BehaviorFlags,     //设备进行3D运算方式
      D3DPRESENT_PARAMETERS    *pPresentationParameters,  //用于存储D3D设备相关信息的指针
      IDirect3DDevice9 **     ppReturnedDeviceInterface  //返回D3D设备接口指针的地址
      );

     //第二个参数DeviceType取值:
      D3DDEVTYPE_HAL      //硬件抽象层,通过显示硬件来完成图形渲染工作
      D3DDEVTYPE_REF      //参考光栅器,一般用于测试显卡不支持的D3D功能
      D3DDEVTYPE_SW      //用于支持第三方软件
     
    //第四个参数BehaviorFlags取值:
      D3DCREATE_SOFTWARE_VERTEXPROCESSING   //由D3D软件进行顶点运算(常用)

      D3DCREATE_FPU_PRESERVE    //激活双精度浮点运算或浮点运算异常检测,设置该项会降低系统性能
      D3DCREATE_MULTITHREADED   //保证D3D是多线程安全的,设置该项会降低系统性能
      D3DCREATE_MIXED_VERTEXPROCESSING      //由混合方式进行顶点运算
      D3DCREATE_HARDWARE_VERTEXPROCESSING   //由D3D硬件进行顶点运算
      D3DCREATE_PUREDEVICE                  //禁用D3D的Get*()函数,禁止D3D使用虚拟设备模拟顶点运算

    /*开始渲染和结束渲染: */
      BeginScene();           //开始渲染
     // ……
     //  实际的渲染工作
     //  ……
       EndScene();        //结束渲染
    //  注意:
    //   这两个函数必须成对出现,不允许交错和嵌套的发生,
    //   实际的渲染工作在这两个函数的中间进行。


    /* 清空图形绘制区: */
    HRESULT Clear(
     DWORD     Count,            //清除的矩形区域数量
     const D3DRECT     *pRects,            //清除的矩形区域数组指针
     DWORD     Flags,                //清除的缓冲区标志,指定清除哪一个缓冲区
     D3DCOLOR     Color,                //清除后重置的颜色
     float       Z,                //清除后重置的深度值,从0-1.0
     DWORD     Stencil               //重置的模板值
     );

    //第三个参数Flags取值(可任意组合):
     D3DCLEAR_STENCIL                //模板缓冲区
     D3DCLEAR_TARGET                 //颜色缓冲区
        D3DCLEAR_ZBUFFER                //深度缓冲区

    /*屏幕反转: */
    HRESULT Present(
     CONST RECT       *pSourceRect,       //复制源的矩形区域指针
     CONST RECT       *pDestRect,         //复制目的地的矩形区域指针
     HWND      hDestWindowOverride,       //D3D设备窗口句柄
     CONST RGNDATA        *pDirtyRegion   //最小更新区域指针
     );

    // 注意:
    //  除非D3D的交换链是用D3DSWAPEFFECT_COPY的标志创建,在大多数的情况下,
    //  此函数的各个参数都设置为NULL。

    //**************************************************************///

          //(2)绘制基本图形

    //**************************************************************///

    /*灵活定点格式(FVF) */
    /*D3D定义的FVF格式: */

     D3DFVF_XYZ                      //包含未经变换的顶点坐标
     D3DFVF_XYZRHW                   //包含经过变换的顶点坐标
     D3DFVF_XYZW                     //包含经过变换和裁剪的顶点坐标
     D3DFVF_NORMAL                   //包含法线信息
     D3DFVF_PSIZE                       //点精灵的大小
     D3DFVF_DIFFUSE                     //包含漫反射的颜色信息
     D3DFVF_SPECULAR                    //包含镜面反射的颜色信息
     D3DFVF_TEX0……D3DFVF_TEX8           //包含0-8个纹理坐标信息
     D3DFVF_XYZB1……D3DFVF_XYZB5   //包含顶点位置信息和影响顶点变换的权重信息,用于骨骼动画模型中
      
    // 根据D3D提供的灵活顶点格式,就可以定义自己的顶点结构体,例如,定义一个包含
    // 经过变换的坐标信息和漫反射颜色信息的顶点结构如下:

    //创建顶点对象
    LPDIRECT3DVERTEXBUFFER9 g_pVB  = NULL;     //顶点缓冲区对象

    //自定义顶点格式
    struct  CUSTOMVERTEX
    {
     FLOAT  x,y,z,rhw;    //经过变换的三维坐标
     DWORD  color;       //顶点漫反射颜色
    };
    #define D3DFVF_CUSTOMVERTEX(D3DFVF_XYZRHW| D3DFVF_DIFFUSE)

    //以下函数设置顶点数据
    CUSTOMVERTEX vertices[]=
    {
     { 100.0f,400.0f,0.5f,1.0f,0xffff0000,},
     { 300.0f, 50.0f,0.5f,1.0f,0xff00ff00,},
     { 500.0f,400.0f,0.5f,1.0f,0xff0000ff,},
    };

    /*基本图元的绘制 */
    HRESULT
    (
     D3DPRIMITIVETYPE  PrimitiveType, //基本图元类型
     UINT  StartVertex,               //起始顶点
     UINT  PrimitiveCount             //绘制图元的数量
     );

    //第一个参数PrimitiveType取值:
    D3DPT_POINTLIST              //点列集合(一组点的集合)
    D3DPT_LINELIST               //线列集合(一组线段的集合)
    D3DPT_LINESTRIP              //线带集合(首尾相连的线段的集合)
    D3DPT_TRIANGLELIST           //三角形列(一组三角形的集合)
    D3DPT_TRIANGLESTRIP          //三角形带 (首尾相连的三角形,有两个顶点重合)
    D3DPT_TRIANGLEFAN            //三角形扇(组成扇形的一组三角形)


    /*创建顶点缓冲区 */
    HRESULT CreateVertexBuffer(
      UINT Length,       //顶点缓冲区的大小,按字节数算
      DWORD Usage,       //顶点缓冲区属性
            DWORD FVF,         //灵活顶点格式
      D3DPOOL Pool,      //顶点缓冲区的内存类型
      IDirect3DVertexBuffer9** ppVertexBuffer,   //顶点缓冲区指针地址
      HANDLE* pSharedHandle                      //保留参数,置为0
      );

    //*Usage:参数Usage用于指定顶点缓冲区的属性,其取值可以设为0,或下面任意值的组合。

    D3DUSAGE_WRITEONLY       //只写属性,不能进行读操作,设置该属性可以提高系统性能
    D3DUSAGE_DYNAMIC        //指定顶点缓冲区要求使用动态内存
    D3DUSAGE_NPATCHES        //使用顶点缓冲区绘制N-patches曲线
    D3DUSAGE_POINTS          //指定顶点缓冲区存储原始点
    D3DUSAGE_RTPATCHES       //使用顶点缓冲区绘制高阶图元(high-orderprimitive)

    D3DUSAGE_SOFTWAREPROCESSING  //使用软件进行顶点运算,否则使用硬件计算


    //*Pool:参数Pool属于枚举类型D3DPOOL,指定顶点缓冲区资源的内存位置,如下:

    typedef enum _D3DPOOL {
     D3DPOOL__DEFAULT = 0,,   //默认值,顶点缓冲区尽可能存在于显存中
     D3DPOOL_MANAGED = 1,     //D3D资源管理器自动调度顶点缓冲区内存位置 
     D3DPOOL_SYSTEMMEM = 2,   //顶点缓冲区位于内存中
     D3DPOOL_SCRATCH = 3,     //定点缓冲区位于计算机临时内存中,只能进行内存加锁拷贝
     D3DPOOL_FORCE_DWORD = 0x7fffffff      //强制将此ENUM编译为32位,无其他意义
    } D3DPOOL;


    /*下面的函数创建了一个顶点缓冲区来保存一个三角形的顶点信息: */

    //创建顶点缓冲
    LPDIRECT3DDEVICE9 *g_pDevice = NULL;

    if(FAILED( g_pDevice->CreateVertexBuffer(
       UINT Length:3*sizeof(CUSTOMVERTEX),
       DWORD Usage:D3DUSAGE_WRITEONLY,
       DWORD FVF  :D3DFVF_CUSTOMVERTEX,
       D3DPOOL Pool:D3DPOOL_DEFAULT,
       ppVertexBuffer:& g_pVB,
       pSharedHandle:NULL)))
    {
     return E_FAIL;
    }

    /*保存顶点 */
    HRESULT Lock(
      UINT OffsetToLock,//加锁内存起始地址
         UINT SizeToLock,  //加锁内存大小
      VOID **ppbData,   //返回内存指针地址
      DWORD Flags       //加锁属性
         );

    //DWORD Flags:指定了顶点缓冲区的加锁属性,它可以取值为0,或者如下中的任意组合:

    D3DLOCK_DISCARD           //仅在动态缓冲区下使用,硬件丢弃原缓冲区并创建一个新的缓冲区
    D3DLOCK_NO_DIRTY_UPDATE  //在缺省状态下,对缓冲区加锁将会在该区域设置一个Dirty标志,该属性将不对该区域设置Dirty标志
    D3DLOCK_NOSYSLOCK            //在加锁的过程中系统可进行其他操作
    D3DLOCK_READONLY              //设置缓冲区位制度属性
    D3DLOCK_NOOVERWRITE         //尽在动态缓冲区下使用,保证不覆盖缓冲区数据,
                                //即向缓冲区中添加数据,允许在渲染时添加数据到缓冲区

    //以下代码保存了顶点
    //锁定顶点缓冲

    if(FAILED(g_pVertexBuffer->Lock(0,sizeof(Vertices))))
    {
     return E_FAIL;
    }

    /*//拷贝顶点信息 */
    memcpy(g_pVB, vertices,size(vertices));

    //解锁
        g_pVertexBuffer->Unlock();


    /*设置渲染状态*/
    HRESULT SetRenderState(
       D3DRENDERSTATETYPE State,    //需要渲染的状态
       DWORD Value                  //代表设置的渲染状态的值
       );


    //**************************************************************///

    //(3)图形绘制

    //**************************************************************///

    /**设置资源流 */
    HRESULT SetStreamSource(
       UINT StreamNumber,           //渲染数据流序号
       IDirect3DVertexBuffer9 *pStreamData,  //进行绑定的顶点缓冲区指针
       UINT OffsetInBytes,          //进行绑定连接的渲染数据流的起始位置
       UINT Stride                  //渲染数据流中一个顶点所占的内存的大小
       );

    // *设置顶点格式
    HRESULT SetFVF(DWORD FVF /*灵活顶点格式*/ );

    /**绘制基本图元 */
    HRESULT DrawPrimitive(
       D3DPRIMITIVETYPE PrimitiveType,        //绘制的图元类型
       UINT StartVertex,                      //绘制的起始顶点
       UINT PrimitiveCount                    //绘制的图元数量
       );

    // Desc:渲染图形
    VOID Render()
    {
     //清空后台缓冲区
      g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );

     //开始在后台缓冲区绘制图形
     if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
     {
      g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
      g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
      g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); //画一个三角形
      g_pd3dDevice->EndScene();//结束在后台缓冲区绘制图形
     }
     g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); //将在后台缓冲区绘制的图形提交到前台缓冲区显示
    }


    /*索引缓冲,顶点设置 */
    //下面代码片段设置了索引缓冲的值

    // Desc:全局变量

    LPDIRECT3DVERTEXBUFFER9 g_pVB       =NULL;// 顶点缓冲区对象

    LPDIRECT3DINDEXBUFFER9 g_pIB     =NULL;// 索引缓冲区对象

    // Desc:顶点结构和灵活顶点格式

    structCUSTOMVERTEX

     FLOAT x, y, z, rhw;      // 经过坐标转换的顶点位置
        DWORD color;             // 顶点漫反射颜色值
    };

    #define D3DFVF_CUSTOMVERTEX  (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

    // Desc:创建顶点缓冲区和索引缓冲区

    //-----------------------------------------------------------------------------

    HRESULT InitVBAndIB()
    {
     //顶点数据
     CUSTOMVERTEX g_Vertices[9];

     g_Vertices[0].x= 300;
     g_Vertices[0].y= 250;
     g_Vertices[0].z= 0.5f;
     g_Vertices[0].rhw=1.0f;
     g_Vertices[0].color= 0xffff0000;

     for(int i=0; i<8;i++)
     {
      g_Vertices[i+1].x= (float)(200*sin(i*3.14159/4.0))+ 300;
      g_Vertices[i+1].y=-(float)(200*cos(i*3.14159/4.0))+ 250;
      g_Vertices[i+1].z=0.5f;
      g_Vertices[i+1].rhw= 1.0f;
      g_Vertices[i+1].color= 0xff00ff00;
     }

     //顶点索引数组
     WORD g_Indices[]={ 0,1,2,0,2,3,0,3,4,0,4,5,0,5,6,0,6,7,0,7,8,0,8,1};
    }

    /*创建索引缓冲 */
    HRESULT CreateIndexBuffer(
      UINT Length,       //索引缓冲区大小,按字节数计算
      DWORD Usage,       //索引缓冲区属性,和顶点缓冲区相同
      D3DFORMAT Format,  //索引数组的元素格式,可以使16位或者32位
      D3DPOOL Pool,      //索引缓冲区内存位置
      IDirect3DIndexBuffer9** ppIndexBuffer,   //索引缓冲区指针地址
      HANDLE* pSharedHandle                    //保留参数,设为0
      );

    //Format:表示索引数组中的元素格式,他可以是16位整数或者32位的整数

    //创建顶点缓冲区

    if(FAILED(g_pd3dDevice->CreateVertexBuffer(9*sizeof(CUSTOMVERTEX),
       0, D3DFVF_CUSTOMVERTEX,
       D3DPOOL_DEFAULT,&g_pVB,NULL) ))
    {
     return E_FAIL;
    }

    //创建索引缓冲区

    if( FAILED(g_pd3dDevice->CreateIndexBuffer(24*sizeof(WORD),
       0, D3DFMT_INDEX16, //索引类型
       D3DPOOL_DEFAULT,&g_pIB,NULL) ))
    {
        return E_FAIL;
    }

    /*保存顶点索引值*/

    //填充顶点缓冲区

    VOID *pVertices;

     if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices),(void**)&pVertices,0) ) )
     {
         return E_FAIL;
     }

      memcpy(pVertices,g_Vertices,sizeof(g_Vertices));

      g_pVB->Unlock();


    //填充索引缓冲区

    VOID *pIndices;

    if(FAILED(g_pIB->Lock(0, sizeof(g_Indices),(void**)&pIndices,0 )) )
    {
        return E_FAIL;
    }
    memcpy(pIndices,g_Indices,sizeof(g_Indices));

    g_pIB->Unlock();


    /*图形绘制 */
    HRESULT SetIndices(
      IDirect3DIndexBuffer9 *pIndexData //使用的索引缓冲区指针
         );

    HRESULT DrawIndexedPrimitive(
       D3DPRIMITIVETYPE Type,                 //基本图元类型
       INT BaseVertexIndex,                   //顶点缓冲区的起始位置
       UINT MinIndex,                         //相对于BaseVertexIndex的最小索引
       UINT NumVertices,                      //绘制的顶点数目,第一个顶点的位置
       UINT StartIndex,                       //索引缓冲区的起始位置
       UINT PrimitiveCount                   //绘制的基本图元数量
       );

    // Desc:渲染图形

    //-----------------------------------------------------------------------------

    VOID Render()
    {
     //清空后台缓冲区
     g_pd3dDevice->Clear(0, NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);

     //开始在后台缓冲区绘制图形
     if( SUCCEEDED(g_pd3dDevice->BeginScene()))
     {
      //在后台缓冲区绘制图形

      g_pd3dDevice->SetStreamSource(0, g_pVB,0, sizeof(CUSTOMVERTEX));

      g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

      g_pd3dDevice->SetIndices(g_pIB); //设置索引缓冲区

      g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,9,0,8);

      //结束在后台缓冲区渲染图形

      g_pd3dDevice->EndScene();

     }

     //将在后台缓冲区绘制的图形提交到前台缓冲区显示

     g_pd3dDevice->Present(NULL,NULL,NULL,NULL);

    }


    //**************************************************************///

    //(4)D3D中的图形学

    //**************************************************************///

    /*DD33DD中的向量 */

    D3DXVECTOR3 //表示三维向量;

    //向量相等

    //1.通过“==”来判断向量是否相等,具体如下:

    D3DXVECTOR3  u(1.0F,0.0F,1.0F);

    D3DXVECTOR3  v(0.0F,1.0F,0.0F);
    if(u==v)
    {
     return true;
    }
    else if(u!=v)
    {
     return false;
    }


    //2.判断浮点时应该定义一个“EPSILON”变量,如果两个浮点之间的差距小于
    //EPSILON就认为两个浮点数相等,具体如下:
    const  float  EPSILON = 0.001f;
    bool  Equals(float 1hs,float rhs)
    {
     return fabs(1hs - rhs)<EPSILON;

    }  //完全不用在意这些事,因为D3DXVECTOR3的重载运算符已经完成了这些

    /*D3D向量模的计算 */

    //表示向量长度:
    float  D3DXVec3Length( CONST D3DXVECTOR3  *PV /*需要求模的向量*/ ) ;

     //例:
         D3DXVECTOR3  v(1.0f,2.0f,3.0f);
         float  magnitude = D3DXVec3Length(&v);

    //向量规格化
    D3DXVECTOR3 *WINAPI D3DXVec3Normalize(
        D3DXVECTOR3 *pOut,                   //输出单位向量
        CONST D3DXVECTOR3 *pV                //输入的向量
        );

    //向量加法
    D3DXVECTOR3  U(2.0F,0.0F,1.0F);

    D3DXVECTOR3  V(0.0F,-1.0F,5.0F);

    D3DXVECTOR3  SUM = U + V;

    //向量减法
    D3DXVECTOR3  U(2.0F,0.0F,1.0F);

    D3DXVECTOR3  V(0.0F,-1.0F,5.0F);

    D3DXVECTOR3  SUM = U - V;

    //数乘
    D3DXVECTOR3  U(2.0F,0.0F,1.0F);

    D3DXVECTOR3  scaledVec = U * 10.0f;

    //点乘

    float D3DXVec3Dot(
         CONST  D3DXVECTOR3  *PV1;
               CONST  D3DXVECTOR3  *PV2;      
               );

    //例:
    D3DXVECTOR3  U(2.0F,0.0F,1.0F);

    D3DXVECTOR3  V(0.0F,-1.0F,5.0F);

    float dot = D3DXVec3Dot(&u,&v);


    /*D3D中的矩阵 */

    //矩阵乘法
    D3DXMATRIX  A(/*…*/);

    D3DXMATRIX  B(/*…*/);

    D3DXMATRIX  C = A * B;

    //矩阵元素设置

    //1)使用”.”运算符
    D3DXMATRIX  A;
    A._11 = 1.0f;


    //2)使用()运算符
    D3DXMATRIX  M;
    M(0 , 0)  =  5.0f;

    //单位矩阵
    D3DXMATRIX *D3DXMatrixIdentity(
        D3DXMATRIX *pOut
        );
    D3DXMATRIX  M;
    D3DXMatrixIdentity(&M);

    //矩阵转置
    D3DXMATRIX *WINAPI D3DXMatrixTranspose(
         D3DXMATRIX *pOut,
         CONST D3DXMATRIX *pM
         );

    //逆矩阵
    D3DXMATRIX *WINAPI D3DXMatrixInverse(
          D3DXMATRIX *pOut,
          FLOAT *pDeterminant,  //通常忽略第二个参数都设置为0
          CONST D3DXMATRIX *pM
          );

    //例:
    D3DXMATRIX  A(/*…*/);

    D3DXMATRIX  B;

    D3DXMatrixInverse(&B,0,&A);


    //**************************************************************///

    //(5)D3D中的平面

    //**************************************************************///

    //     平面的描述
    //
    //     D3D中的平面
    //
    //     点与平面之间的关系
    //
    //     平面的构造
    //
    //     平面单位化
    //
    //     平面变换
    //
    //     D3D中的射线
    //
    //     射线与平面相交判断

    //D3D中的图形变换
    HRESULT SetTransform(
        D3DTRANSFORMSTATETYPE State,           //变换类型
        CONST D3DMATRIX* pMatrix               //变换矩阵
        );

    //参数State可以是一下任意类型:

    D3DTS_WORLD                         //世界变换
    D3DTS_VIEW                          //视图变换
    D3DTS_PROJECTION                        //投影变换

    //平移变换
    D3DXMATRIX *WINAPI D3DXMatrixTranslation(
            D3DXMATRIX *pOut,         //输出矩阵
            FLOAT x,                  //X轴上的平移量
            FLOAT y,                  //Y轴上的平移量
            FLOAT z                   //Z轴上的平移量
            );

    //缩放变换
    D3DXMATRIX *WINAPI D3DXMatrixScaling(
         D3DXMATRIX *pOut,             //输出矩阵
         FLOAT sx,                     //X轴上的缩放量
         FLOAT sy,                     //Y轴上的缩放量
         FLOAT sz                      //Z轴上的缩放量
         );

    //旋转变换
    D3DXMATRIX *WINAPI D3DXMatrixRotationX(  //绕X轴旋转
          D3DXMATRIX *pOut,             //输出矩阵
          FLOAT Angle                   //旋转角度
          );

    D3DXMATRIX *WINAPI D3DXMatrixRotationY(  //绕Y轴旋转
          D3DXMATRIX *pOut,             //输出矩阵
          FLOAT Angle                   //旋转角度
          );

    D3DXMATRIX *WINAPI D3DXMatrixRotationZ(  //绕Z轴旋转
          D3DXMATRIX *pOut,             //输出矩阵
          FLOAT Angle                   //旋转角度
          );

    D3DXMATRIX *WINAPI D3DXMatrixRotationAxis( //绕任意轴旋转
          D3DXMATRIX *pOut,             //输出矩阵
          CONST D3DXVECTOR3  *Pv       //旋转中心轴向量
          FLOAT Angle                   //旋转角度
          );

    //组合变换
    D3DXMATRIX *WINAPI D3DXMatrixMultiply(
          D3DXMATRIX *pOut,             //输出变换矩阵
          CONST D3DXMATRIX *pM1,         //输入矩阵
          CONST D3DXMATRIX *pM2          //输入矩阵
          );


    //**************************************************************///

    //(6)D3D纹理

    //**************************************************************///

    //从磁盘文件获取纹理
    HRESULT  WINAPI  D3DXCreateTextureFromFile(
     LPDIRECT3DDEVICE9       pDevice,       //Direct3D设备指针
     LPCTSTR     SrcFile,                   //纹理图形文件
     LPDIRECT3DTEXTURE9      *ppTexture     //存储Direct3D纹理的指针地址
     );

    //该函数支持的图形文件类型:bmp、dds、dib、jpg、png以及tga等。

    //设置当前要渲染的纹理
    HRESULT  SetTexture(
         DWORD      Stage,                 //多级纹理的索引,从0-7,单层纹理取0
         IDirect3DBaseTexture9  *pTexture  //Direct3D的纹理接口指针
         );

    //设置纹理的渲染状态
    HRESULT  SetTextureStageState(
       DWORD      Stage,      //当前设置的多级纹理的索引
       D3DTEXTURESTAGESTATETYPE        Type,       //纹理渲染状态的类型
       DWORD     Value      //纹理渲染状态的值,与类型相对应
       );

    //第二个参数 D3DTEXTURESTAGESTATETYPE  Type取值:
    typedef enum _D3DTEXTURESTAGESTATETYPE
    {
     D3DTSS_COLOROP = 1,               //纹理层的颜色混合方式
     D3DTSS_COLORARG1 = 2,             //颜色混合的第一个参数
     D3DTSS_COLORARG2 = 3,             //颜色混合的第二个参数
     D3DTSS_ALPHAOP = 4,               //指定纹理层的Alpha透明
     D3DTSS_ALPHAARG1 = 5,             //Alpha混合的第一个参数
     D3DTSS_ALPHAARG2 = 6,             //Alpha混合的第二个参数
     D3DTSS_BUMPENVMAT00 = 7,          //绘制凹凸纹理时
     D3DTSS_BUMPENVMAT01 = 8,          //绘制凹凸纹理时
     D3DTSS_BUMPENVMAT10 = 9,          //绘制凹凸纹理时
     D3DTSS_BUMPENVMAT11 = 10,         //绘制凹凸纹理时
     D3DTSS_TEXCOORDINDEX = 11,        //该纹理层使用的纹理坐标的索引
     D3DTSS_BUMPENVLSCALE = 22,        //绘制凹凸纹理的缩放参数
     D3DTSS_BUMPENVLOFFSET = 23,       //绘制凹凸纹理的平移参数
     D3DTSS_TEXTURETRANSFORMFLAGS = 24,//控制纹理坐标的转换标志
     D3DTSS_COLORARG0 = 26,            //指定混合过程的第三个颜色
     D3DTSS_ALPHAARG0 = 27,            //Alpha混合的第三个参数
     D3DTSS_RESULTARG = 28,            //颜色混合的结果输出寄存器
     D3DTSS_CONSTANT = 32,             //颜色混合的常量寄存器
     D3DTSS_FORCE_DWORD = 0x7fffffff   //强制转换为32位,用于占位

    } D3DTEXTURESTAGESTATETYPE;

    //设置纹理采样属性
    HRESULT  SetSamplerState(
           DWORD    Sampler,     //指定纹理采样属性的纹理层ID(0~7)
           D3DSAMPLERSTATETYPE   Type,       //纹理过滤类型
           DWORD    Value  //设置纹理采样属性值
           );

    //第二个参数D3DSAMPLERSTATETYPE  Type取值:
    typedef enum _D3DSAMPLERSTATETYPE
    {
         D3DSAMP_MAGFILTER                //处理放大过滤
         D3DSAMP_MINFILTER                //处理缩小过滤
         D3DSAMP_MIPFILTER                //多纹理过滤
         D3DSAMP_MIPMAPLODBIAS            //多级纹理级数偏移值,初始值为0
         D3DSAMP_MAXMIPLEVEL              //最大多纹理级别,初始值为0
         D3DSAMP_MAXANISOTROPY            //各向异性,初始为1
    }D3DSAMPLERSTATETYPE;

    //第三个参数Value取值:
    D3DTEXF_NONE                      //不使用特殊的采样方式
    D3DTEXF_POINT                     //最近点采样
    D3DTEXF_LINEAR                    //线性纹理采样
    D3DTEXF_ANISOTROPIC               //各向异性纹理采样


    //从一张纹理图形中生成多级纹理
    HRESULT  WINAPI  D3DXCreateTextureFromFileEx(
     LPDIRECT3DDEVICE9      pDevice,     //Direct3D设备指针
     LPCTSTR    pSrcFile,                //图形文件路径与文件名
     UINT   Width,                       //指定纹理宽度
     UINT   Height,                      //指定纹理高度
     UINT   MipLevels,                   //指定渐进纹理序列级数。设为0表示尽可能多
                                            //的生成纹理过滤序列,直到最小纹理的宽度和高度等于1
     DWORD    Usage,                     //纹理使用方式,一般为0
     D3DFORMAT    Format,                //指定纹理图形格式
     D3DPOOL    Pool,                    //纹理存放的内存类型,一般为0
     DWORD    Filter,                    //纹理过滤方式
     DWORD    MipFilter,                 //自动生成的纹理序列过滤方式
     D3DCOLOR    ColorKey,               //设置透明色
     D3DXIMAGE_INFO  *pSrcInfo,          //图形文件信息存放地址,可设为0
     PALETTEENTRY     *pPalette,         //调色板存储地址
     LPDIRECT3DTEXTURE9      *ppTexture  //创建的Direct3D纹理指针存放地址
     );

    //包装纹理寻址
    SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_WRAP);
    SetSamplerState(0 , D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);

    //镜像纹理寻址
    SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_MIRROR);
    SetSamplerState(0 , D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);

    //夹取纹理寻址
    SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP);
    SetSamplerState(0 , D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

    //边框颜色纹理寻址
    SetSamplerState(0 , D3DSAMP_BORDERCOLOR , 0xffff0000); //设置边框颜色
    SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_BORDER);
    SetSamplerState(0 , D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER;

    //一次镜像纹理寻址
    SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_MIRRORONCE);
    SetSamplerState(0 , D3DSAMP_ADDRESSV, D3DTADDRESS_MIRRORONCE);

    //纹理包装
    SetRenderState(D3DRS_WRAP0 , D3DWRAP_U|D3DWRAP_V); //设置在u和v方向上同时使用纹理包装


    //**************************************************************///

    //(6)D3D光照

    //**************************************************************///

    //D3D光照的基本实现
    //顶点格式
    struct  CUBE_CUSTOMVERTEX
    {
     FLOAT  x,y,z;              //顶点位置坐标
     FLOAT  tu,tv;              //纹理坐标
     FLOAT  nx,ny,nz;           //顶点法线
    };

    //定义顶点格式
    #define  CUBE_D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1|D3DFVF_NORMAL)

    //设置物体材质
    typedef  struct  _D3DMATERIAL9
    {
     D3DCOLORVALUE  Diffuse;                //漫反射
     D3DCOLORVALUE  Ambient;                //环境光
     D3DCOLORVALUE  Specular;               //镜面反射
     D3DCOLORVALUE  Emissive;               //物体本身发光强度
     float Power;               //镜面反射高光POWER越大,与周围亮度差距越大

    } D3DMATERIAL9;

    //表示完物体之后需要调用SetMaterial为当前渲染像素点设置材质
    HRESULT SetMaterial(
       CONST D3DMATERIAL9* pMaterial    //指向定义材质的指针
       );

    //漫反射:
    D3DMATERIAL9  mtrl;
        ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));
        mtrl.Diffuse.r  =  0.8f;
        mtrl.Diffuse.g  =  0.6f;
        mtrl.Diffuse.b  =  0.5f;
        mtrl.Diffuse.a  =  0.1f;

        m_pD3Ddevice->SetMaterial(&mtrl);  // m_pD3Ddevice为有效的D3D设备句柄

    //镜面反射:
    D3DMATERIAL9  mtrl;
        ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));
        mtrl. Specular.r  =  0.8f;
        mtrl. Specular.g  =  0.6f;
        mtrl. Specular.b  =  0.5f;
        mtrl.Diffuse.a  =  0.1f;

        m_pD3Ddevice->SetMaterial(&mtrl);  // m_pD3Ddevice为有效的D3D设备句柄

        //进行镜面反射计算时,需要先打开镜面反射的计算,默认情况下镜面反射为关闭
        m_pD3Ddevice->SetRenderstate(D3DRS_SPECULARENABLE,TRUE);


    //添加光源类型
    typedef enum _D3DLIGHTTYPE
    {
     D3DLIGHT_POINT = 1,                   //点光源
     D3DLIGHT_SPOT = 2,                    //聚光灯
     D3DLIGHT_DIRECTIONAL = 3,             //直射光(或平行光)
     D3DLIGHT_FORCE_DWORD = 0x7fffffff

    } D3DLIGHTTYPE;

    //光源属性
    typedef struct _D3DLIGHT9
    {
     D3DLIGHTTYPE Type;                //光源类型
     D3DCOLORVALUE Diffuse;            //光源颜色
     D3DCOLORVALUE Specular;
     D3DCOLORVALUE Ambient;
     D3DVECTOR Position;               //光源位置
     D3DVECTOR Direction;              //光源方向
     float Range;                      //光源范围
     float Falloff;                    //光源内外锥形衰退
     float Attenuation0;               //光源衰减系数
     float Attenuation1;
     float Attenuation2;
     float Theta;                      //聚光灯内部锥形角度
     float Phi;                        //聚光灯外部锥形角度
    } D3DLIGHT9;


    //激活光照运算的渲染状态

    //m_pDevice为有效的D3D设备句柄
      m_Device->SetRenderState(D3DRS_LIGHTING,TRUE);

    //指定光源
    HRESULT SetLight(
         DWORD Index,   //取值0-7表示设置光源的序号值
         CONST D3DLIGHT9 *pLight //指向一个表示特定光源的指针
         );

    // m_pD3Ddevice为有效的D3D设备句柄,d3dLight为有效的光源指针
     m_pD3Ddevice->SetLight(0,&d3dLight);

    //激活光源
    HRESULT LightEnable
    (
          DWORD Index,       //指定需要激活的光源的序号值
          BOOL Enable        //是否激活指定的光源
     );

    // m_pD3Ddevice为有效的D3D设备句柄,d3dLight为有效的光源指针
    m_pD3Ddevice->SetLight(0,&d3dLight);
    m_pD3Ddevice->LightEnable(0,TRUE);


    //**************************************************************///

    //(7)D3D摄像机

    //**************************************************************///

    //生成视图变换矩阵

    D3DXMATRIX  *WINAPI  D3DXMatrixLookAtLH(
         D3DXMATRIX     *pOut, //输出用于视图变换的矩阵
         CONST D3DXVECTOR3      *pEye,          //摄像机的位置
         CONST D3DXVECTOR3      *pAt,//视点(摄像机朝向的位置)
         CONST D3DXVECTOR3      *pUp //摄像机的正方向
         );

    //生成投影变换矩阵
    D3DXMATRIX *WINAPI D3DXMatrixPerspectiveFovLH(
                  D3DXMATRIX   *pOut,        //输出用于投影变换的矩阵
                  FLOAT     fovy,            //摄像机镜头的夹角(在Y轴上的成像角度)
                  FLOAT     Aspect,          //平截台体的纵横比
                  FLOAT     zn,              //近平截面的距离
                  FLOAT     zf                //远平截面的距离
         );

  • 相关阅读:
    [基础架构]PeopleSoft都有哪些进程运行在进程服务器上
    [基础架构]PeopleSoft Process Scheduler 重要文件说明
    .NET Core微服务之基于Consul实现服务治理
    .net core3.1 Filter四种注入方式和异常过滤器
    ASP.NET Core配置监听URLs的六种方式
    Asp.Net Core中JWT刷新Token解决方案
    ASP.NET Core-ActionFilter实现依赖注入(ServiceFilterAttribute 、TypeFilterAttribute) 【转】
    asp.net core 3.1配置log4net
    使用 Certbot 安装 Letsencrypt 证书
    使用新版 winsw 注册 windows 系统服务无法启动及停止问题
  • 原文地址:https://www.cnblogs.com/zhousan/p/3165085.html
Copyright © 2011-2022 走看看