DirectX函数总结2

来源:互联网 发布:亚裔 美国 知乎 编辑:程序博客网 时间:2024/05/17 01:17
 

                                      12

----------------------- Page 13-----------------------

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

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

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

HRESULTInitVBAndIB()

{

    //顶点数据

    CUSTOMVERTEXg_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(inti=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;

    }

    //顶点索引数组

    WORDg_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};

=================================================================
==============
                                     DirectX
=================================================================
==============

创建索引缓冲
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) ))

    {

                                        13

----------------------- Page 14-----------------------

        returnE_FAIL;

    }

    //创建索引缓冲区

    if( FAILED(g_pd3dDevice->CreateIndexBuffer(24*sizeof(WORD),

                                                0, D3DFMT_INDEX16, //索引类型

                                                D3DPOOL_DEFAULT,&g_pIB,NULL) ))

    {

        returnE_FAIL;

    }
=================================================================
==============
                                    DirectX
=================================================================
==============

保存顶点索引值

    //填充顶点缓冲区

    VOID*pVertices;

    if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices),(void**)&pVertices,0) ) )

        returnE_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 )) )

        returnE_FAIL;

    memcpy(pIndices,g_Indices,sizeof(g_Indices));

    g_pIB->Unlock();
=================================================================
==============
                                    DirectX
=================================================================
==============

    图形绘制
HRESULT SetIndices(

     IDirect3DIndexBuffer9 *pIndexData //使用的索引缓冲区指针
    );

HRESULT DrawIndexedPrimitive(

     D3DPRIMITIVETYPE Type,                 //基本图元类型

     INT BaseVertexIndex,                   //顶点缓冲区的起始位置

     UINT MinIndex,                         //相对于BaseVertexIndex的最小索引

     UINT NumVertices,                      //绘制的顶点数目,第一个顶点的位置

     UINT StartIndex,                       //索引缓冲区的起始位置

                                       14

----------------------- Page 15-----------------------

     UINT PrimitiveCount                   //绘制的基本图元数量
    );

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

// Desc:渲染图形

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

VOIDRender()

{

    //清空后台缓冲区

    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);

    }
=================================================================
==============
                                   DirectX
=================================================================
==============

                         D3D
                         DD33DD中的图形学

D3D
DD33DD中的向量

    D3DXVECTOR3
    DD33DDXXVVEECCTTOORR33表示三维向量;

        *
        **向量相等

            1.通过“==”来判断向量是否相等,具体如下:
            D3DXVECTOR3  U(1.0F,0.0F,1.0F);

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

            If(u==v)return true;

            If(u!=v)return false;

            2.判断浮点时应该定义一个“EPSILON”变量,如果两个浮点之间的差距小于

            EPSILON就认为两个浮点数相等,具体如下:
            const  float  EPSILON = 0.001f;

                                      15

----------------------- Page 16-----------------------

    bool  Equals(float 1hs,float rhs)

    {

         Return fabs(1hs - rhs)<EPSILON;

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

    功能

*D3D
**DD33DD向量模的计算

    表示向量长度:
    FLOAT  D3DXVec3Length

    (

         CONST D3DXVECTOR3  *PV             //需要求模的向量
    )

    例:
    D3DVECTOR3  v(1.0f,2.0f,3.0f);

    Float  magnitude = D3DXVec3Length(&v);

*
**向量规格化
 D3DXVECTOR3 *WINAPI D3DXVec3Normalize(

            D3DXVECTOR3 *pOut,                   //输出单位向量

            CONST D3DXVECTOR3 *pV                //输入的向量
);

*
**向量加法
D3DVECTOR3  U(2.0F,0.0F,1.0F);

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

D3DVECTOR3  SUM = U + V;

*
**向量减法
D3DVECTOR3  U(2.0F,0.0F,1.0F);

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

D3DVECTOR3  SUM = U - V;

*
**数乘
D3DVECTOR3  U(2.0F,0.0F,1.0F);

D3DVECTOR3  scaledVec = U * 10.0f;

*
**点乘

FLOAT D3DXVec3Dot(
CONST  D3DVECTOR3  *PV1;

CONST  D3DVECTOR3  *PV2;

例:
D3DVECTOR3  U(2.0F,0.0F,1.0F);

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

                                  16

----------------------- Page 17-----------------------

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

=================================================================
==============
                                   DirectX
=================================================================
==============

D3D
DD33DD中的矩阵

    *
    **矩阵乘法
    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);
=================================================================
==============
                                   DirectX
=================================================================
==============

                                      17

----------------------- Page 18-----------------------

D3D
DD33DD中的平面

        平面的描述

        D3D中的平面

        点与平面之间的关系

        平面的构造

        平面单位化

        平面变换
=================================================================
==============
                                   DirectX
=================================================================
==============

D3D
DD33DD中的射线

    射线与平面相交判断
=================================================================
==============
                                   DirectX
=================================================================
==============

D3D
DD33DD中的图形变换
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轴上的缩放量
);

*旋转变换

                                      18

----------------------- Page 19-----------------------

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                  //输入矩阵
);

=================================================================
==============
                                   DirectX
=================================================================
==============

                                      19

----------------------- Page 20-----------------------

                                   纹理

从磁盘文件获取纹理
HRESULT  WINAPI  D3DXCreateTextureFromFile(

      LPDIRECT3DDEVICE9       pDevice,       //Direct3D设备指针
                LPCTSTR     SrcFile,        //纹理图形文件
     LPDIRECT3DTEXTURE9      *ppTexture      //存储Direct3D纹理的指针地址
);

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

设置当前要渲染的纹理
HRESULT  SetTexture(

                DWORD      Stage,        //多级纹理的索引,从0-7,单层纹理取0
     IDirect3DBaseTexture9        *pTexture      //Direct3D的纹理接口指针
);
=================================================================
==============
                                   DirectX
=================================================================
==============

设置纹理的渲染状态
HRESULT  SetTextureStageState(

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

第二个参数D3DTEXTURESTAGESTATETYPE  Type取值:
typedef enum _D3DTEXTURESTAGESTATETYPE {

     D3DTSS_COLOROP = 1,                       //纹理层的颜色混合方式
     D3DTSS_COLORARG1 = 2,                          //颜色混合的第一个参数

                                      20

----------------------- Page 21-----------------------

     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;
=================================================================
==============
                                   DirectX
=================================================================
==============

设置纹理采样属性
HRESULT  SetSamplerState(

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

第二个参数D3DSAMPLERSTATETYPE  Type取值:
D3DSAMP_MAGFILTER                   //处理放大过滤
D3DSAMP_MINFILTER                //处理缩小过滤
D3DSAMP_MIPFILTER                //多纹理过滤
D3DSAMP_MIPMAPLODBIAS            //多级纹理级数偏移值,初始值为0
D3DSAMP_MAXMIPLEVEL                        //最大多纹理级别,初始值为0
D3DSAMP_MAXANISOTROPY            //各向异性,初始为1
第三个参数Value取值:
D3DTEXF_NONE                       //不使用特殊的采样方式
D3DTEXF_POINT                     //最近点采样
D3DTEXF_LINEAR                    //线性纹理采样
D3DTEXF_ANISOTROPIC               //各向异性纹理采样
=================================================================
==============
                                   DirectX

                                      21

----------------------- Page 22-----------------------

=================================================================
==============

从一张纹理图形中生成多级纹理
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纹理指针存放地址
);
=================================================================
==============
                                   DirectX
=================================================================
==============

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

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

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