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                //远平截面的距离
     );

posted @ 2013-07-01 16:23  雨霖林  阅读(2374)  评论(0编辑  收藏  举报