(1)数学基础

点积求夹角:点积不具有明显的几何意义,但根据点积公式可以方便地得到两向量的夹角。

叉积求法线:叉积得到的结果是同时垂直于两个向量的一个向量,叉积是有方向的,dx里面采用的是左手法则(取决于是采用左手坐标 系还是右手坐标系)。叉积只对于3D向量有意义。

矩阵乘法是矩阵在3D图形学中最重要的运算。可以使用矩阵对向量进行变换,一个矩阵代表一种变换,也可将几个变换进行组合。

单位矩阵就是对角线全为1的矩阵,单位矩阵具有乘法可交换的特性。

逆矩阵,部分方阵才有逆矩阵,定义为相乘等于单位矩阵。
矩阵的转置,交换矩阵的行和列。
四维矩阵可以表示3D中的所有变换,而像平移、透视投影、反射变换等一些变换无法用三维矩阵表示。为了让向量-矩阵相乘具有意义,一般也将三维中的向量扩展到四维。

将点放入1*4行向量时,w设为1,将向量放入1*4行向量时将w设为0。因为平移变换对点有意义,对向量无意义(可以从平移矩阵的特点中分析)。扩展后的4D向量称为齐次向量,一个3D向量对应无穷多个齐次向量。

求点到平面的最短距离的思路。

(2)D3D基本概念

HAL(Hardware abstract layer 硬件抽象层,由显卡所提供的一个代码集,位于D3D和显卡设备之间的一层)。
REF设备(reference rasterizer device 参考光栅化设备),它能以软件运算方式完全支持D3D API。

COM接口都有一个前缀I,如表面(surface)的COM接口为IDirect3DSurface9

swap Chain:D3D维护一个表面的集合,称为交换链,由D3D自己负责管理。

可以对表面进行多重采样,常用于进行全屏反走样,但多重采样会显著降低应用程序的运行速度。

深度缓存技术(depth buffering 或 z buffering):为了判定某一物体的哪些像素位于另一个物体之前,它会计算每个像素的深度值并进行深度测试,让处于同一位置的不同像素进行竞争,已选出应写入该位置的像素。一般24位的缓存格式已经够用。

z-buffering是设备的一个属性,用来存储深度信息,当D3D渲染一个场景到target surface的时候,它会使用depth-buffer surface上的数据,来决定被rasterized三角面片的pixel间的遮挡关系

始终优先考虑硬件顶点运算方式(图形卡支持变换和光照的硬件计算),速度快,且不占用CPU资源。

IDirect3D9接口用于获取系统图形设备的信息。
IDirect3DDevice9接口用于控制图形设备的软件接口。

顶点格式:一个顶点可以包含多个分量(如位置、颜色、发现、纹理坐标uv)。

FVF: Flexible Vertex Format

投影窗口(projection window):D3D定义它与平面z=1重合,位于视景体中的3D几何体通过投影映射到该区域中,便创建了3D场景的2D表示。一般将近裁剪面和投影平面合二为一。

应用程序帧率和刷新频率同步

D3D所提供的每一项性能都对应于结构D3DCAP9中的一个数据成员或某一位,在使用某个D3D特性时,需要query一下当前硬件是否支持该特性。下面的示例代码用来查询是否支持硬件定点光照:

D3DCAPS9 caps;
	d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
	int vp = 0;
	if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
	else
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

(3)绘制流水线
局部坐标系:建模坐标系
世界坐标系:全局坐标系,对局部坐标数据进行世界变换矩阵
  Device->SetTransform(D3DTS_WORLD, m);
观察坐标系:将摄像机变换至坐标原点,并使摄像机光轴沿着z轴的正方向。空间中的物体随摄像机一起变换。
  D3DXMatrixLookAtLH(pOut, Eye, At, Up);
  Device->SetTransform(D3DTS_VIEW, m);
背面消隐:
  绕序(winding order):三角形列表中三个顶点的指定顺序非常重要,我们称之为绕序。
  D3D认为顶点绕序为顺时针(观察坐标系)的三角形单元是正面朝向的,逆时针的为背面朝向的。
  Device->SetRenderState(D3DRS_CULLMODE, value);
光源也必须变换至观察坐标系再用。
裁剪(clipping):视景体外的三角形不绘制。
投影(projection):从n维变换为n-1维的过程称为投影。
  透视投影变换,从3D投影到2D的投影窗口。
  D3DXMatrixPerspectiveFovLH(pOut, fovY, Aspect, zn, zf);
  Aspect为宽高比例,也就是显示屏纵横两维尺寸的比率。
  Device->SetTransform(D3DTS_PROJECTION, m);
视口变换(viewport transform):
  从投影窗口到屏幕矩形区域(视口viewport)的变换。
  视口相对于窗口来描述,即使用窗口坐标来指定。
  D3DVIEWPORT9 vp = {x, y, Width, Height, MinZ, MaxZ};
  Device->SetViewport(&vp);
光栅化(rasterization):计算构成三角形单元的每个像素的颜色值。
  光栅化计算量非常大,应尽量借助专用通行卡的加速功能。光栅化的结果是显示屏上的一幅2D图像。