Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125962
  • 博文数量: 44
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-07 23:06
文章分类

全部博文(44)

文章存档

2010年(6)

2009年(38)

我的朋友

分类:

2009-12-07 23:45:51

Tutorial 2: 渲染顶点(Rendering Vertices)

用Direct3D编写的应用程序使用顶点来画几图形。第个三维场景包含一个或多个几何图形,顶点例程工程创建几个简单的图形,一个三角形并且渲染显示出来。

这个教程展示如何使用顶点创建一个三角形,步骤如下:

Steps

Step 1 – 定义一个顶点类型(Defining a Custom Vertex Type)

Step 2 – 建立顶点缓存(Setting Up the Vertex Buffer)

Step 3 -渲染显示(Rendering the Display)

顶点工程代码几乎和CreateDevice工程代码相同,渲染顶点教程主要专注于顶点处理,不包括初始化Direct3D,处理系统消息,渲染或是关闭工作。



Step 1 – 定义一个顶点类型(Defining a Custom Vertex Type)

顶点例子工程使用三个顶点渲染一个2D三角形。这里介绍顶点缓冲的概念,顶点缓冲是一个Direct3D对象用来存储和处理顶点。顶点可以通过指定符合可变用户顶点格式的用户顶点结构的多种方式来定义。在Vertices工程中顶点格式显示如下:



struct CUSTOMVERTEX

{

   FLOAT x, y, z, rhw;
//顶点的位置

   DWORD color;  
//顶点颜色

};

上面的结构体指定用户顶点类型。下一步是定义可变顶点类型描述顶点缓存所包含的信息。下面的代码片断定义FVF以便和上面的用户顶点结构相一致:



#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE )



D3DFVF描述了使用了哪种类型的用户顶点结构,上面的代码使用了D3DFVF_XYZRHW 和D3DFVF_DIFFUSE标记,告诉顶点缓存用户顶点类型拥有可变的点和颜色成分。

现在用户顶点格式和可变顶点格式(FVF)都指定了,下一步是使用顶点来填充顶点缓存。



注意:Vertices sample工程中的顶点有所改变,换句话说,它们仍是2D窗口坐标,这意味着point(0,0)点在左上角并且下X轴是向右,正Y轴向下,这些顶点仍然有光,意思是他们没有使用Direct3D光照但他们支持自身的颜色。



Step2 – 建立顶点缓存

现在用户顶点工程已经定义了,是时候来初始化顶点了。Vertices工程在这些工作是在创建完成必要的Direct3D对象之后调用应用程序定义的函数InitVB().如下的代码片段初始化了三个用户顶点的数值。

CUSTOMVERTEX vertices[] =

{

       { 150.0f,   50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color        { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },        {   50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },};


以上代码片段使用三角形的顶点填充三个顶点并且指定顶点的颜色,第一个点在(150,50)并发出红色(0xffff0000),第二点在250,250处颜色为绿色,第三点在50,250处蓝色,第一个这些点都有0.5的深度值的RHW为1.0.下一步是调用IDirect3DDevice9::CreateVertexBuffer来创建一个顶点缓存如下代码片段:

if( FAILED( g_pd3dDevice -> CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))       
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices));

g_pVB -> Unlock();



顶点缓存第一次通过调用IDirect3DvertexBuffer9::Lock来锁定,第一个参数是要锁定的顶点数据从起始处的偏移量,以位计算。第二个参数是要锁定的顶点数据大小(位),第三个参数是一个BYTE类型指针指向顶点数据,第四个参数告诉顶点缓存如何锁定数据。

然后使用memcpy()将顶点复制到顶点缓存中,然后可以调用IDirect3DVertexBuffer9::Unlock()来解除锁定,这种锁定和解锁方法是必要的因为顶点缓存可能会在设备存储器中。

那么现在顶点缓存已经写入了顶点。是进修渲染和显示了。



Step 3- 渲染和显示(Rendering the Display)

现在已经把顶点数据定稿了顶点缓存,该是显示的时候了,渲染显示是从把后台缓存清空为蓝色开始的然后调用BeginScene()。



g_pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0F, 0L);

g_pd3dDevice -> BeginScene();



渲染顶点数据从顶点缓存需要几个步骤,第一你需要设定数据源,这时使用流0。数据流的指定通过调用IDirect3DDevice9::SetStreamSource()。



g_pd3dDevice -> SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));



第一个参数是流号第二个参数是指向顶点缓存的指针。第三个参数是从流开始的偏移量的顶点数据,在这里是0.最后一个参数是所有数据占的位数。

下一步是调用IDirect3DDevice9::SetFVF()来识别固定函数顶点着色。用户顶点着色是高级话题,但在这里的顶点着色仅仅是可变顶点格式(FVF)代码。下面的的代码片段是设定FVF。



g_pd3dDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);



对于SetFVF()唯一的参数是确定的顶点函数定义的顶点数据格式。

下一步是调用IDirect3DDevice9::DrawPrimitive()来处理顶点缓存中的顶点如下:

g_pd3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);



DrawPrimitive接受的第一个参数是一个标记为告诉Direct3D画什么样的图形,这里使用D3DPT_TRIANGLELSIT 来指定使用三角形带。第二个参数是第一个顶点的索引号,第三个参数表示要画的三角形个数,因为这个例子只画一个三角形所以值为1.

要查看更多关于基元的信息请查看 Primitives(Direct3D9)。



最后一步是结束场景绘制并将后台缓存显示到前台。代码如下:

g_pd3dDevice -> EndScene();

g_pd3dDevice -> Present( NULL, NULL, NULL, NULL);


在将后台缓存显示到前台后,窗户窗口会用三个不同色的点显示一个三角形。



这个教程已经向你展示了如何使用顶点来绘制一个几何图形,下一章将介绍矩阵的使用。
阅读(703) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~