2 Vertex

    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;

一个立方体的定义,每个面两个三角形

分别是顶点列表和顶点索引

这里要注意的是,顶点的描述顺序,用的是绕序(顺时针)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值