direct3D学习笔记(3)

2019-03-09 20:49

的每个边绘制一条线

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,


direct3D学习笔记(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:德镇市2013年八年级下期中试卷及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: