的每个边绘制一条线
SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID) //面模式,D3D默认模式,对多边形的面进行填充
3). 设置全景图形抗锯齿:
SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE) //抗锯齿 SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE) //不抗锯齿 4). 设置剔除模式:
SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) //不剔除任何面,默认为剔除背面 5). 设置光照模式:
SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); //为整个场景设置环境光,ambientColor默认值为0
SetRenderState(D3DRS_SPECULARENABLE, TRUE); //激活镜面反射计算(D3D默认情况下关闭)
6). 启动/关闭深度测试:
SetRenderState( D3DRS_ZENABLE, TRUE ); //启用深度测试 7) 设置纹理过滤器 8)
SetRenderState( D3DRS_POINTSCALEENABLE, TRUE ); //打开缩放功能 9)
SetRenderState( D3DRS_POINTSCALE_A , FtoDW( 1.00f ));//设置因子,下同 SetRenderState( D3DRS_POINTSCALE_B , FtoDW( 1.00F )); SetRenderState( D3DRS_POINTSCALE_C , FtoDW( 1.00f )); 10)
SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));//设置点大小上限,下类似 SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));
SetRenderState( D3DRS_POINTSPRITEENABLE , TRUE ) ; //打开点精灵效果 SetRenderState( D3DRS_AMBIENT, 0xffffffff ); //设置环境光颜色开启 ALPHA混合效果 11)
设置混合因子:
源:SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA ); 目的:SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA); 第二个参数是 D3DBLEND的枚举结构。 typedef enum D3DBLEND
{
D3DBLEND_ZERO = 1, D3DBLEND_ONE = 2, D3DBLEND_SRCCOLOR = 3, D3DBLEND_INVSRCCOLOR = 4, D3DBLEND_SRCALPHA = 5, D3DBLEND_INVSRCALPHA = 6, D3DBLEND_DESTALPHA = 7, D3DBLEND_INVDESTALPHA = 8, D3DBLEND_DESTCOLOR = 9, D3DBLEND_INVDESTCOLOR = 10, D3DBLEND_SRCALPHASAT = 11, D3DBLEND_BOTHSRCALPHA = 12, D3DBLEND_BOTHINVSRCALPHA = 13, D3DBLEND_BLENDFACTOR = 14, D3DBLEND_INVBLENDFACTOR = 15, D3DBLEND_SRCCOLOR2 = 16, D3DBLEND_INVSRCCOLOR2 = 17, D3DBLEND_FORCE_DWORD = 0x7fffffff, } D3DBLEND, *LPD3DBLEND;
Source和Destination的默认方式分别为D3DBLEND_SRCALPHA和 D3DBLEND_INVSRCALPHA。
5.坐标变换
1)世界变换
我们在建立三维实体的数学模型时,通常以实体的某一点为坐标原点,比如一个球体,很自然就用球心做原点,这样构成的坐标系称为本地坐标系(Local Coordinates)。实体总是位于某个场景(World Space)中,而场景采用世界坐标系(World Coordinates),如图8所示,因此需要把实体的本地坐标变换成世界坐标,这个变换被称为世界变换(World Transformation)。
在Direct3D中,坐标变换通过一个4x4矩阵来实现,对于世界变换,只要给出实体在场景中的位置信息,就可以借助Direct3D函数得到变换矩阵,具体的计算步骤如下: ", 首先把实体放置在在世界坐标系原点,使两个坐标系重合;
", 在世界空间中,对实体进行平行移动,其对应的平移变换阵TT可由函数D3DXMatrixTranslation求得;
", 把平移后的实体沿自身的Z轴旋转一个角度(角度大于0,表示从Z轴的正向朝原点看去,旋转方向为顺时针;反之为逆时针,下同),对应的旋转变换阵TZ用D3DXMatrixRotationZ计算;
", 把实体沿自身的Y轴旋转一个角度,用D3DXMatrixRotationY求出变换阵TY; ", 把实体沿自身的X轴旋转一个角度,用D3DXMatrixRotationX求出变换阵TX;
", 最后对实体进行缩放,假设三个轴的缩放系数分别为sx、sy、sz,该操作对应的变换阵TS可由函数D3DXMatrixScaling求得;
", 最终的世界变换矩阵TW = TS·TX·TY·TZ·TT ,在Direct3D中,矩阵乘法用函数D3DXMatrixMultiply实现,注意相乘顺序为操作的逆序。
从以上描述中,我们很容易得出:实体的运动可以通过不断改变世界变换矩阵来实现。
2)视角变换,(观察矩阵)
实体确定后,接下来要确定观察者在世界坐标系中的方位,换句话说,就是在世界坐标系中如何放置摄像机。观察者(摄像机)所看到的景象,就是Direct3D窗口显示的内容。 确定观察者需要三个量: ", 观察者的点坐标;
", 视线方向,为一个矢量,不过Direct3D用视线上的一个点来替代,此时视线方向就是从观察者指向该目标点,这样表示更直观一些;
", 上方向,通俗地说,就是观察者的头顶方向,用一个矢量表示。
确定后,以观察者为原点,视线为Z轴,上方向或它的一个分量为Y轴(X轴可由左手法则得
出,为右方向),构成了视角坐标系,如图9所示。我们需要把实体从世界空间转换到视角空间,这个坐标变换被称为视角变换(View Transformation)
与世界变换相比,视角变换矩阵的获取要容易得多,只需调用一个函数D3DXMatrixLookAtLH,其输入参数就是决定观察者的那三个量。 D3DXMATRIX *WINAPI D3DXMatrixLookAtLH( D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye, CONST D3DXVECTOR3 *pAt, CONST D3DXVECTOR3 *pUp );
这个函数用来控制摄影机,用来控制视图矩阵的。 pEye眼睛的位置,观察的方向。
pAt是摄影机的前进和后退,向左或向右。向上或向下。 pUp是向上的方向。 详细说明 参数: pOut
[in, out] 指向 D3DXMATRIX 结构的返回结果的矩阵。 pEye
[in] 指向D3DXVECTOR3 结构的眼睛所有在位置向量。这个值会用来作平移。 pAt
[in] 指向 D3DXVECTOR3 结构的摄像机观察目标位置向量。 pUp
[in] 指向D3DXVECTOR3 结构的当前世界坐标系向上方向向量。通常用[0, 1, 0]向量。
3)投影变换
实体转换到视角空间后,还要经过投影变换(Projection Transformation),三维的实体才能显示在二维的计算机屏幕上。打个比方,如果把屏幕看做照相机中的胶卷,那么投影变换就相当于照相机的镜头。
Direct3D使用透视投影变换(Perspective Transformation),此时在视角空间中,可视区域是一个以视线为轴心的棱台(Viewing Frustum),如图10所示。想象一下你处在一个伸手不见五指的房间里,面前有一扇窗户,你可以透过窗户看到各种景物。窗户就是棱台的前裁剪平面,天空、远山等背景是后裁剪平面,其间的可视范围是景深。投影变换把位于可视棱台内的景物投影到前裁剪平面,由于采用透视投影,距离观察者远的对象会变小,从而更具有真实感。在Direct3D中,前裁剪平面被映射到程序窗口,最终形成了我们在屏幕上看到的画面。
透视投影变换由四个量决定: ", 前裁剪平面的宽度w; ", 前裁剪平面的高度h; ", 前裁剪平面到原点的距离z1; ", 后裁剪平面到原点的距离z2。
由于w、h用起来不是很直观,因此实际应用中,常用fov和aspect代替w、h,其中fov是Y方向上的可视角度,通常取π/4;aspect是前裁剪平面的高度与宽度之比,通常取1(由三角函数定义,易知h=2·z1·tg(fov/2),w=h/aspect)。用这四个量来调用函数D3DXMatrixPerspectiveFovLH,即可获得投影变换矩阵。
得到三个变换矩阵后,还需要调用方法IDirect3DDevice9::SetTransform把它们设置到渲染环境中,具体用法参见后面的例程。
//得到左手坐标系透视投影变换矩阵 D3DXMatrixPerspectiveFovLH( &matrixProj,
//[in,out] 指向D3DXMATRIX 结构的操作结果矩阵 //[in]观察时y 轴方向的角度(弧度),就是观察范围夹角
D3DX_PI/2.0f,