DirectX入门知识点(1)

1.Direct3D通常创建2~3个表面组成一个集合,即为交换链,通常由IDirect3DSwapChain接口来表示。我们不必去了解它更详细的细节。我们也很少去管理它,通常Direct3D会自己去管理。所以我们只要大概的了解一下它就可以了。

交换链以及页面切换技巧被用在使两帧动画之间过度更平滑。

在Front Buffer中的表面将用来在屏幕上显示。显示器不能即时显示Front Buffer中表示的图像;通常情况下,它是每六十分之一秒刷新显示一次,即刷新率为60赫兹。应用程序的帧率经常与监视器的刷新率不同步(比如应用程序的渲染帧速度可能比显示器的刷新速度快)。然而,我们不能在显示器显示完成当前帧之前就更新有下一帧动画的Front Buffer内容,但是我们又不想让程序停止渲染而去等待显示器显示。因此,我们渲染另一个屏幕表面Back Buffer。当监视器将Front Buffer显示出来后,Front Buffer就被放到交换链的末端,即变成图中的Back Buffer,而Back Buffer就会变成交换链中的Front Buffer。这个过程就叫做presenting。(是否就对应了IDirect3DDevice::Present(NULL, NULL, NULL, NULL))。

注:在实际使用过程中,发现,不能多次调用Present,因为这会影响帧率。常用的做法是,在做完了所有准备工作后,只用调用一次。


2.为顶点格式声明的FVF组合标志的顺序必须要和顶点结构的顺序一一对应。
例如:
struct NormalTexVertex
{
       float _x, _y, _z; // 位置
       float _nx, _ny, _nz; // 法线向量
       float _u, _v; // 纹理坐标
};
则声明FVF格式为
#define FVF_NORMAL_TEX  (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)


3.光照定义在世界坐标系中,但必须变换到视图坐标系才可使用


4.Direct3D中默认顶点以顺时针方向(在观察坐标系中)形成的三角形为正面,以逆时针方向形成的三角形为背面。
正面多边形挡住了在它后面的背面多边形,Direct3D将通过消除(即删除多余的处理过程)背面多边形来提高效率,这种方法就叫Backface Culling。
如果我们不想使用默认绘制状态,我们可以通过改变D3DRS_CULLMODE来改变渲染状态:
Device->SetRenderState(D3DRS_CULLMODE, Value);
Value可以是如下一个值:
D3DCULL_NONE——完全不使用背面消除
D3DCULL_CW——消除顺时针方向环绕的三角形
D3DCULL_CCW——消除逆时针方向环绕的三角形,这是默认值。


5.我们删除那些超出了可视体范围的几何图形的过程就叫做裁剪(Clipping)


6.投影变换的实质就是定义可视体,并将可视体内的几何图形投影到投影窗口上去。
Aspect参数为投影平面的宽高比例值,由于最后都为转换到屏幕上,所以这个比例一般设为屏幕分辨率的宽和高的比值(而在DXSDK中则经常会看到MS会推荐D3DX_PI/4和1:1作为投影变换矩阵的Fov和Aspect数值,但是在实际的编程中,却不太这么做,至少我个人大多数都是使用屏幕分辨率的宽高比和D3DX_PI/2)。如果投影窗口是个正方形,而我们的显示屏一般都是长方形的,这样转换后就会引起拉伸变形。


7.视口变换(Viewport Transform)主要是转换投影窗口到显示屏幕上。通常一个游戏的视口就是整个显示屏,但是当我们以窗口模式运行的时候,也有可能只占屏幕的一部分或在客户区内。视口矩形是由它所在窗口的坐标系来描述的。
posted @ 2009-09-06 14:08  芈希有  阅读(607)  评论(0编辑  收藏  举报