度值的设置。
下面的示例代码指定了最大各项异性值为4。
g_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC); g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); g_device->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 4);
最大各项异性程度值D3DSAMP_MAXANISOTROPY为1时,表示禁用各项异性过滤。一般说来,其值越大,图像效果越好,计算量越大,速度越慢。需要注意的是,在设置最大各项异性之前,应调用IDirect3D9::GetDeviceCaps()函数,查询当前设备支持的Direct3D特性,获取当前设备支持的最大各项异性度的取值范围 //线性纹理
SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); //最近点采样
SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ POINT); SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT); //各向异性纹理过滤
SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC );
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ ANISOTROPIC);
5.退出Dirent3D程序,清除所有初始化时创建的COM对象
调用Release()使引用计数器减一;最后计数器为零时才调用delete();
五.三种顶点数据处理
D3DCREATE_HARDWARE_VERTEXPROCESSING D3DCREATE_SOFTWARE_VERTEXPROCESSING D3DCREATE_MIXED_VERTEXPROCESSING
一次只能给设备指定一种处理方式,软件顶点处理提供一种确保支持的顶点处理能力,包括无限制的光源数量和可编程的顶点渲染器的完全支持。在使用HAL设备时,在任一时刻都可以在软件和硬件顶点处理之间进行切换,HAL是一种同时支持软件、硬件顶点处理的设备类型,对软件顶点处理的唯一要求就是顶点缓冲区必须位于系统内存
//只指定给硬件设备 //处理能力固定 //软硬件切换使用
六.Direct3d表面
表面代表显示内存中的一块线性区域,尽管可以位于系统内存,但通常是位于显卡的显存
中。
前台缓冲区:是由显卡传送到显示器用于显示器显示的一块内存,程序不能对其进行任何
操作。
后台缓冲区:在程序中可以直接操作的一块内存区域,不能用于图形显示。 表面反转:将后台缓冲区的内容提交到前台缓冲区进行显示的过程。
交换链:一个或者多个后台缓冲区的集合,可以按照顺序逐个提交到前台缓冲区。
七.Direct3D坐标系和基本图元
1.三维笛卡尔坐标系根据z轴相对于x、y的方向又分为左手坐标系跟右手坐标系。在空间几何中常用右手坐标系,而在Direct3D中用的是左手坐标系。 2.使用顶点缓冲区绘制图形
顶点缓冲区是用来保存顶点数据的内存缓冲区,可以保存任意类型的顶点数据,并可以进行坐标变换,光照处理以及裁剪等操作。根据图形显示的需要,顶点缓冲区的顶点可以包含顶点坐标、颜色、法线向量、纹理坐标等属性,这些属性可以用灵活顶点格式FVF来描述。使用SetFVF()来声明当前实用的灵活顶点格式。灵活顶点格式使应用程序只使用它需要的顶点数据,这样可以节省系统内存空间,较小系统带宽。
3.使用索引缓冲区进行绘制
将所有的顶点数据存放在顶点缓冲区,在索引缓冲区建立索引,避免了重复,最后通过索引缓冲区跟顶点缓冲区共同绘制图形。
创建完顶点缓冲区跟索引缓冲区后,要将索引数据复制到索引缓冲区,这时需要Lock()和Unlock(),即在操作前锁定索引缓冲区,复制完后解锁。
4.渲染状态
设备渲染状态控制direct3d设备的光栅化组件的行为,通过改变渲染状态属性可以控制使用
何种着色模式,如何进行雾化及其他光栅化操作。Direct3d调用SetRenderState()来设置渲染状态。
着色模式:1. 平面着色模式;2. 戈劳德着色模式。一次只能使用一种着色模式,默认为戈劳德着色模式。
矩阵操作
//向量规格化
D3DXVECTOR3 *WINAPI D3DXVec3Normalize( D3DXVECTOR3 *pOut, //输出单位向量
CONST D3DXVECTOR3 *pV //输入的向量 ); //单位矩阵
D3DXMATRIX *D3DXMatrixIdentity(
D3DXMATRIX *pOut ); //矩阵转置
D3DXMATRIX *WINAPI D3DXMatrixTranspose(
D3DXMATRIX *pOut, CONST D3DXMATRIX *pM ); //逆矩阵
D3DXMATRIX *WINAPI D3DXMatrixInverse(
D3DXMATRIX *pOut,
FLOAT *pDeterminant, //通常忽略第二个参数都设置为0 CONST D3DXMATRIX *pM );
//设置变换矩阵
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 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 D3DXMatrixScaling(
D3DXMATRIX *pOut, //输出矩阵 FLOAT sx, //X 轴上的缩放量 FLOAT sy, //Y 轴上的缩放量 FLOAT sz //Z 轴上的缩放量 );
//*组合变换,两个矩阵相乘
D3DXMATRIX *WINAPI D3DXMatrixMultiply(
D3DXMATRIX *pOut,
//输出变换矩阵
//输入矩阵
CONST D3DXMATRIX *pM1, //输入矩阵 CONST D3DXMATRIX *pM2 );
//计算两个3-D向量叉乘。向量的外积或者向量积,用右手法则判断,拇指指向结果向量 //通过前进向量和斜坡的法线向量做差乘,计算出右方向的向量,再由右方向和斜坡//法线做差成得出需要的平行斜面向上的向量
D3DXVECTOR3 *D3DXVec3Cross(
D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); 参数: pOut
[in, out] 指向 D3DXVECTOR3 结构的操作结果。 pV1
[in] 指向 D3DXVECTOR3 结构的源向量。 pV2
[in] 指向 D3DXVECTOR3 结构的源向量。 返回值:
指向D3DXVECTOR3 结构的两个向量叉乘结果。
这个函数返回两个向量叉乘结果。 例子说明如下: D3DXVECTOR3 v;
v.x = pV1->y * pV2->z - pV1->z * pV2->y; v.y = pV1->z * pV2->x - pV1->x * pV2->z; v.z = pV1->x * pV2->y - pV1->y * pV2->x; *pOut = v;
//向量的点乘,求得向量的夹角余弦值,又称内积