FVF:自由顶点格式,是指用户可以在D3D定义的顶点格式中,自行决定适合程序的顶点格式。
D3D7.0版本导入了自由顶点格式(Flexible Vertex Format),用户可以自由定义自己的顶点结构,在D3D8版本中需要使用顶点着色器,也就必须使用自由顶点格式。
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
表现用户顶点结构体相关信息地FVF值
结构体由x,y,z,rhw值和diffuse颜色值组成。
T&L(多边形转换与光源处理)
T&L(Transform and Lighting多边形转换与光源处理)是DX7版本的功能,在画面中绘制多边形需要顶点和矩阵的乘法,这就是转换(Transform)。顶点和光源之间需要进行光照(Lighting)运算,Direct7以前这种多边形转换和光照处理是由CPU负责的,绘图卡仅起到画面绘制多边形的作用。多边形转换与光源处理技术的开发可以使显卡承担这种运算。NVIDIA图形芯片显卡(TNT之后的GEFORCE系列)可以支持T&L。
渲染管道(Rendering Pipeline):
从最初的局部坐标系到最终坐标系的变换过程。P40
向量点乘(在书中翻译为标量积,dot product):p.q = |p||q|cosQ,
只有余弦在0~90和270~360才为正,利用余弦的这个特点,求得相对于人眼的视线向量和垂直于物体的面的法线向量(face-normal vector)的标量积值,只有当该值为正数时,使用的才是背面剔除(backface-culling)。
可编程纹理(procedural texture)
多重纹理(multi texture),指多层纹理、多张纹理。简单地说,绘制一个多边形的时候,通过多层纹理的混合、重叠才能实现,临时保存这些纹理的领域称为纹理层(texture stage),Direct3D中共有8个纹理层。Direct3D最多允许使用8层纹理,但事实上,受绘图卡硬件的限制,一般只使用2~4层纹理。
P161
g_pd3dDevice->SetSamplerState(1,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
//1号纹理层的放大滤镜
以前的DirectX8.0X是调用SetTextureStageState()函数来指定缩小和放大滤镜的,DirectX9后变为SetSamplerState()函数。纹理层间的合成需要调用SetTextureStageState()函数,进行阶段内纹理像素的相关处理时,需要调用SetSamplerState()函数.
法线帖图(normal mapping),是指使用具有法线向量值(而非RGB颜色值)的纹理进行特殊帖图的技术。法线帖图在纹理像素中存储法线向量值,而非RGB颜色值,通过该纹理的法线向量和光源的运算,实现像素单位的光照,而非顶点单位的光照。
单像素光照(per pixel lighting)技术.
法线帖图的类型:
根据法线向量的基准坐标系(coordinate system),法线帖图可以划分为对象代间法线帖图(object space normal map)和切线空间法线帖图(tangent space normal map)两类。
对象空间法线帖图是指法线向量基准坐标系为3D对象空间坐标系的帖图,也就是说3D对象的原点就是法线向量的原点。该技术的优点是比较直观,大部分硬件都支持对象空间法线帖图。
向量->RGB
例如:单位向量(x,y,z),想要将其变换为RGB值的话,可以采用多种变换方法,将ARGB分别变换为8位,这样ARGB分别具有了8位值,总共就是32位DWORD值.
V(x,y,z)为单位向量,x,y,z值分别位于(0,1)之间,变换结果值为0~255之间,也就是说,需要设置(1~0)、(1~255)的函数。具体如下:
R=(DWORD)(127*x+128);
G=(DWORD)(127*y+128);
B=(DWORD)(127*z+128);
Color = ((R<<16)|(G<<8)|B)
“低多边形 + 法线帖图 = 高多边形”
摄像机旋转(rotation)
X,y,z轴中,不能进行z轴旋转的处理(这是因为一般性的FPS(Doom,Unreal,Quake等第一人称射击游戏类游戏一般不进行Z轴旋转。
对于y轴旋转而言,将向量vView与y轴旋转矩阵(Mrotation)相乘,然后加上vEye值得到的位置就是新的vNewDst(相当于vLookAt)顶点,由生成的vNewDst和vUp,vEye值诱导摄像机矩阵就可以了。
P273
D3D中有利用三个点求得平面方程式的函数。
D3DXPLANE * D3DXPlaneFromPoints(
D3DXPLANE * pOut,
CONST D3DXVECTOR3 * pV1,
CONST D3DXVECTOR3 * pV2,
CONST D3DXVECTOR3 * pV3
);
Ax+by+cz+d = 0 点在平面上
Ax+by+cz+d > 0 点在平面前方
Ax+by+cz+d = 0 点在平面后方
四叉树就是使用四个子节点递归地将空间(一般是二维空间)进行分割的方法。
八叉树是对三维空间进行分割。
图像投影:
图像投影(image projection)技巧是将二维图像投影到三维网络上的技巧。这可以说是渲染管道的逆变换,渲染管道将三维网络变成二维图像,图像投影与其相反是将二维图像投影到三维空间。准确地说不是投影到三维空间中而是将二维图像投影到二维纹理空间。而且图像是以光源为圆点进行投影,所以需要以光源为中心的坐标变换。
图像投影技巧的算法如下:
(1) 创建三维空间网络变换矩阵,变换中使用以光源为中心的光源坐标系(matWorld2Light).
(2) 创建将光源计算成摄像机位置的投影矩阵(matTexProj)。
(3) 求出对象变换矩阵(matWorld)*光源坐标系矩阵(matWorld2Light)*光源投影矩阵(matTexProj)(matTexTransform)。
(4) 绘制网格,这时使用matTexTransform矩阵在光源坐标系中求出顶点的投影坐标。
(5) 投影坐标系是裁剪坐标系,所以具有-1~+1的值,将这些值变换为纹理坐标系的0~1的值,这时要将y轴的方向改为反方向。
(6) 将扩散帖图纹理与投影图像纹理调制混合,输出到网络中。
注:在程序中处理1~3过程,在顶点着色器中处理4~6过程会更加方便。