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