3D世界的所有东西都是由多边形逼近形成的,同样一个模型用的多边形越多就越细致
构成就需要顶点,对于定点,首先要理解的是FVF(可塑顶点格式)
D3D中定义定点是按照我们的具体需求
有时候只需要坐标,有时候还需要颜色,纹理坐标等等其他量
为了让我们的device能认识我们定义的顶点,就要用D3DFVF定义的标志定义我们的FVF
举个栗子=。=
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // The transformed position for the vertex.
DWORD color; // The vertex color.
};
这一段,里面定义了坐标和颜色
那么FVF就要这样写
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
D3DFVF_XYZRHW 定义了顶点位置
D3DFVF_DIFFUSE 定义了顶点具有扩散的颜色
这里有一点点细节
D3DFVF_XYZRHW D3DFVF_XYZ D3DFVF_NORMAL
其中 rhd 和另外两个中任意一个都不能共存
D3DFVF_XYZRHW 代表已经转换过的顶点(转换过是说已经经过了3D坐标变换,可以直接光栅化)
D3DFVF_XYZ 表示没有经过转化的顶点,它需要经过变换,再定义了之后要设置渲染状态才能看到
D3DFVF_NORMAL表示顶点数据中包含法线向量,这个法向量用来计算光照(照射角度不同渲染效果不同),所以定义了这个格式之后一定要加光照才可以显示
还有一些在网上找到的区别
D3DFVF_XYZ默认的用户区中心坐标是(0,0),而D3DFVF_XYZRHW是左上角为(0,0)
用D3DFVF_XYZ默认的为非光照的,而D3DFVF_XYZRHW是高洛德光照。
RHW因为是已经变换过的状态,会被设置默认光照
还有,因为是固定管线渲染,在定义定点格式的时候要用固定的格式,定义顶点结构体是有固定的顺序的
D3DFVF_XYZ包含未经转换的顶点坐标
D3DFVF_XYZRHW包含经过转换的顶点坐标
D3DFVF_XYZW包含经过转换和裁剪的顶点坐标
D3DFVF_XYZB1………D3DFVF_XYZB5包含用于骨骼动画的顶点和顶点对骨骼的权重信息
D3DFVF_NORMAL包含法线信息
D3DFVF_PSIZE顶点信息指明绘制点的大小
D3DFVF_DIFFUSE包含漫反射的信息
D3DFVF_SPECULAR包含镜面反射的信息
D3DFVF_TEX0………D3DFVF_TEX8包含0-8个纹理坐标信息
这些是固定的顺序,可以不包含某一个,但是顺序不能颠倒
龙书里说灵活顶点格式标记和顶点结构体中变量的定义顺序要相同是错误的,顶点格式标记就是个与出来的常数,在处理的时候是直接从低位开始看每一位是否有值的
(见这些宏的定义,顺序是从低位开始,很多是同一种的不同设定)
#define D3DFVF_RESERVED0 0x001
#define D3DFVF_POSITION_MASK 0x400E
#define D3DFVF_XYZ 0x002
#define D3DFVF_XYZRHW 0x004
#define D3DFVF_XYZB1 0x006
#define D3DFVF_XYZB2 0x008
#define D3DFVF_XYZB3 0x00a
#define D3DFVF_XYZB4 0x00c
#define D3DFVF_XYZB5 0x00e
#define D3DFVF_XYZW 0x4002
#define D3DFVF_NORMAL 0x010
#define D3DFVF_PSIZE 0x020
#define D3DFVF_DIFFUSE 0x040
#define D3DFVF_SPECULAR 0x080
#define D3DFVF_TEXCOUNT_MASK 0xf00
#define D3DFVF_TEXCOUNT_SHIFT 8
#define D3DFVF_TEX0 0x000
#define D3DFVF_TEX1 0x100
#define D3DFVF_TEX2 0x200
#define D3DFVF_TEX3 0x300
#define D3DFVF_TEX4 0x400
#define D3DFVF_TEX5 0x500
#define D3DFVF_TEX6 0x600
#define D3DFVF_TEX7 0x700
#define D3DFVF_TEX8 0x800
在计算的时候看每一位的值来做判断
还有一些更加细致的见这篇文章http://blog.csdn.net/liminled/article/details/6674882
这些东西对几何变换的基础知识要求还是比较高的,要不然理解会出问题
3D世界的物体都是由无数个这样的顶点构成的,很重要的一点就是管理这些定点,渲染的时候最小单位是三角形
DX中管理它们用了一个很有意思的寻址
一个顶点列表,用来存所有的顶点,一个索引列表,用于以后的寻址
vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
vertices[1] = Vertex(-1.0f, 1.0f, -1.0f);
vertices[2] = Vertex( 1.0f, 1.0f, -1.0f);
vertices[3] = Vertex( 1.0f, -1.0f, -1.0f);
vertices[4] = Vertex(-1.0f, -1.0f, 1.0f);
vertices[5] = Vertex(-1.0f, 1.0f, 1.0f);
vertices[6] = Vertex( 1.0f, 1.0f, 1.0f);
vertices[7] = Vertex( 1.0f, -1.0f, 1.0f);
VB->Unlock();
// define the triangles of the cube:
WORD* indices = 0;
IB->Lock(0, 0, (void**)&indices, 0);
// front side
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 0; indices[4] = 2; indices[5] = 3;
// back side
indices[6] = 4; indices[7] = 6; indices[8] = 5;
indices[9] = 4; indices[10] = 7; indices[11] = 6;
// left side
indices[12] = 4; indices[13] = 5; indices[14] = 1;
indices[15] = 4; indices[16] = 1; indices[17] = 0;
// right side
indices[18] = 3; indices[19] = 2; indices[20] = 6;
indices[21] = 3; indices[22] = 6; indices[23] = 7;
// top
indices[24] = 1; indices[25] = 5; indices[26] = 6;
indices[27] = 1; indices[28] = 6; indices[29] = 2;
// bottom
indices[30] = 4; indices[31] = 0; indices[32] = 3;
indices[33] = 4; indices[34] = 3; indices[35] = 7;
一个立方体的定义,每个面两个三角形
分别是顶点列表和顶点索引
这里要注意的是,顶点的描述顺序,用的是绕序(顺时针)