分享
 
 
 

DirectX 图形接口指南(3)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

指南二:演示顶点(Render Vertex)

Microsoft Direct3D 写的应用程序使用顶点(Vertex)构造几何物体。每一个三维空间 (3D) 场景包括一个或几个这样的几何物体。Vertices 例程构造简单的物体,一个三角形,并且将它绘制到显示屏上。

本指南说明如何采用以下步骤从顶点构造一个三角形:

·第一步:定义一个自定义顶点类型

·第二步:设置顶点缓冲

·第三步:绘制至显示屏

注意:Vertices 示例程序的路径为:

(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut02_Vertices.

Vertices 程序的示例代码与 CreateDevice 的代码大部分相同。本“演示顶点(Render Vertex)”指南仅仅关注于那些独特的,关于顶点的代码而不包括初始化 Direct3D,处理 Microsoft Windows 消息,绘图,与清理等工作。如要得到有关这些任务的信息,请参考 指南一:创建设备。

第一步:定义一个自定义顶点类型

Vertices 例程使用三个顶点构造一个 2D 的三角形。这里提及了顶点缓冲的概念,这是用于保存和演示大量顶点的 Microsoft Direct3D 对象。通过指定一个自定义的顶点结构和相应的可变向量格式 (FVF),顶点能够采用很多方法定义。本 Vertices 例程使用的顶点格式定义于以下代码片断中。

struct CUSTOMVERTEX

{

FLOAT x, y, z, rhw; // The transformed position for the vertex.

DWORD color; // The vertex color.

};

上面的结构体说明了自定义顶点类型的格式。下一步是定义 FVF 以描述顶点缓冲区中的顶点内容。以下代码片段定义了一个 FVF 并符合此上建立的自定义顶点类型。

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

可变顶点格式标记描述了使用中的自定义顶点类型。前述示例代码使用了 D3DFVF_XYZRHW 和 D3DFVF_DIFFUSE 标志,这将告诉顶点缓冲,自定义顶点类型包含一组转换过的点坐标并紧跟着一个颜色参数。

现在自定义向量格式和 FVF 已经被指定好了,下一步将使用顶点填充顶点缓冲区,请参看:第二步:设置顶点缓冲 。

注意:Vertices 例程中的顶点是转换过的。用另一句话说,它们已经在 2D 窗口坐标系下。这意味着座标点 (0,0) 位于左上角,且正的 x 半轴向右,正的 y 半轴向下。这些顶点同样也是光照过的,这说明它们的着色不通过 Direct3D 照明而由它们自己的颜色代替。

第二步:设置顶点缓冲

现在自定义顶点格式已经完成,初始化顶点的时候到了。 Vertices 例程创建了必需的 Microsoft Direct3D 对象之后调用本程序内部定义的函数 InitVB() 进行这个工作。以下代码段将初始化三个自定义顶点的值。

CUSTOMVERTEX g_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, },

};

前述代码片段采用三角形的三个顶点填充三个Vertex并指定了每个顶点的散射光的颜色。第一个顶点位于 (150,50) ,散射红色 (0xffff0000)。第二个顶点位于 (250,250) ,为绿色 (0xff00ff00)。第三点位于 (50,250) 并散射蓝绿色 (0xff00ffff)。每一点都具有相同的 0.5 Z值及 1.0 的 RHW 参数。关于这些矢量格式的其它信息见 SDK: Transformed and Lit Vertices。

下一步将调用 IDirect3DDevice8::CreateVertexBuffer 创建顶点缓冲区,如以下代码段所示:

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),

0 /* Usage */, D3DFVF_CUSTOMVERTEX,

D3DPOOL_DEFAULT, &g_pVB ) ) )

return E_FAIL;

CreateVertexBuffer 的头两个参数告诉 Direct3D 新顶点缓冲区预计的大小和用法。紧跟的两个参数指定新缓冲区的矢量格式及存储位置。这里的向量格式是 D3DFVF_CUSTOMVERTEX,就是例程先前定义的 FVF 值。D3DPOOL_DEFAULT 标记告诉 Direct3D 在最合适的位置创建此顶点缓冲区。最后一个参数返回创建完成的顶点缓冲区对象地址。

创建了顶点缓冲区之后,如以下代码段所示,开始采用自定义格式的顶点填充缓冲区中的数据。

VOID* pVertices;

if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )

return E_FAIL;

memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );

g_pVB->Unlock();

首先调用 IDirect3DVertexBuffer8::Lock 锁定顶点缓冲区。函数第一个参数是锁定顶点数据的偏移量,按字节计算。第二个参数是需锁定的顶点数据长度,同样按字节计算。第三个参数是一个 BYTE 类型指针的地址,用于返回指向顶点数据的地址。第四个参数告知顶点缓冲区如何锁定数据。

通过使用 memcpy,顶点被复制到顶点缓冲区里。将顶点放入缓冲区之后,调用一次 IDirect3DVertexBuffer8::Unlock 以解锁顶点缓冲区。这个锁定——解锁机制是必需的,因为正在使用的顶点缓冲区可能位于设备内存中。

现在顶点缓冲区已经填入顶点,绘制到显示的时候到了,见描述:第三步:绘制至显示屏 。

第三步:绘制至显示屏

现在缓冲区已经填入顶点,现在需要把它绘制到显示屏上。在绘制到屏幕之前,先将背景清除为蓝色并调用 BeginScene。

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

g_pd3dDevice->BeginScene();

从顶点缓冲区绘制顶点数据需要一些步骤。首先,你需要设置流数据源;在当前情况下,使用第 0 个流 。流的数据源是通过调用 IDirect3DDevice8::SetStreamSource 设置的。

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

SetStreamSource 的第一个参数告诉 Microsoft Direct3D 设备设置数据流的索引。第二个参数是绑定在该数据流上的顶点缓冲区。第三个参数是数据单元的大小,用字节数表示。在上面的示例代码中,将使用CUSTOMVERTEX 的大小作为数据单元的大小。

下一步通过调用 IDirect3DDevice8::SetVertexShader 使 Direct3D 了解使用中的顶点处理器(Vertex Shader)。就整体而言,自定义顶点处理器是一种高级的话题,但是在绝大多数情况下顶点处理器仅仅等于 FVF 代码。这能够让 Direct3D 知道处理中的顶点类型。以下代码片段将FVF设置为当前顶点处理器:

g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );

SetVertexShader() 唯一的参数是当前设置的顶点处理器的句柄。这个参数的值可以是从IDirect3DDevice8::CreateVertexShader 返回的句柄,或者是 FVF 代码。在这儿,使用的参数是定义为 D3DFVF_CUSTOMVERTEX 的 FVF 代码。

关于顶点处理器的更多信息,请见 SDK: Vertex Shader 一章。

下一步使用 IDirect3DDevice8::DrawPrimitive 绘制顶点缓冲区中的顶点,见以下代码片段:

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

DrawPrimitive 接受的第一个参数是一个标记,它通知 Direct3D 绘制哪种类型的物件(Primitive)。本例程使用 D3DPT_TRIANGLELIST 标记指定为三角形序列。第二个参数是第一个顶点的索引。第三个参数通知绘制的物件的数目。本例子只画一个三角形,这个值为 1。

关于不同种类物件的更多信息,可见 SDK: 3-D Primitive

最后的一步是结束场景并立即将后背缓冲提交为前景缓冲。这些写在以下代码片段中:

g_pd3dDevice->EndScene();

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

当后背缓冲被提交为前景缓冲后,客户窗口将显示出一个三个点颜色各异的三角形。

本指南已经指导你如何使用顶点构造几何外形了。指南三:使用矩阵 将介绍矩阵的概念以及如何使用它们。

(指南三:使用矩阵 见本文第四部分)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有