Microsoft DirectX 8 (C++)
________________________________________________________________ Microsoft DirectX Graphics C/C++ Tutorials Tutorial 2: Rendering Vertices ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CopyRight:1995-2000 Microsoft Corporation. All rights reserved. 翻译:FireAngel fireangel@yesky.com 陕西咸阳 OICQ:65667466 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程 2: 渲染顶点 用 Microsoft Direct3D 编写的程序使用顶点来绘制几何图形。每一个 3-D 场景都包含了一个或多个几何图形。顶点的例程创建了最简单的图形,一个三角形,并且把它渲染和显示到屏幕上。
第一步: 定义一个自定义顶点类型 第二步: 设置顶点缓冲 第三步: 渲染
说明: 顶点的例程的路径是: (SDK 的跟目录)\Samples\Multimedia\Direct3D\Tutorials\Tut02_Vertices 顶点的例程中的代码和创建设备的例程中的代码几乎是一样的。渲染顶点的函数是这个例程中唯一有关顶点的代码,并且在这个例程中并没有改动有关初始化D3D,处理 Microsoft Windows 的消息,渲染,或是关闭的代码。如果你想得到有关这些部分的详细信息,清参阅 教程 1: 创建设备。
第一步: 定义一个自定义顶点类型 顶点的例程用三个顶点渲染了一个 2-D 的三角形。先介绍一下顶点缓冲。顶点缓冲是一种用来存储和渲染顶点的 Microsoft Direct3D 对象。我们可以用很多种规定顶点结构和与之对应的可变顶点格式(FVF)的方法来定义顶点。顶点例程中的顶点格式由下面一段代码定义。
struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // 变换后顶点的坐标。 DWORD color; // 顶点的颜色。 };
以上的结构规定了自定义顶点的格式。下一步应该做的是定义用来描述顶点缓冲中的顶点的FVF(可变顶点格式)。下面的代码定义了一个和上面的自定义顶点结构相对应得 FVF。
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
Flexible vertex format (FVF) flags (可变顶点格式标志) 描述了怎样的顶点正在被使用。上面这一段代码例子使用了 D3D_XYZRHW 和 D3DFVF_DIFFUSE 标志,这两个标志告诉了顶点缓冲自定义顶点类型是一个变换后的点后面跟上一个颜色分量。
现在自定义顶点格式和 FVF 都确定了, 下一步应该像 第二步: 设置顶点缓冲 中描述的那样向顶点缓冲里放顶点了。
说明: 在顶点例程中的顶点是变换过了的。简单的说,它们已经是在 2-D 窗口坐标系中了。也就是说, (0,0)点就是窗口的左上角,而 X轴的正方向是右, Y轴的正方向是下。同时,这些顶点还是亮的,这说明它们没有使用 Direct3D 的灯光而是使用了由它们的颜色支持的光影效果。
第二步: 设置顶点缓冲 现在,自定义顶点格式已经定义了,是初始化顶点的时候了。顶点例程在建立了必须的 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, }, };
这一段代码给那三个顶点附上三角形顶点的值,并且规定了每一个顶点所要发出的光的颜色。第一个顶点在(150,150)并且发出红色(0xffff0000)的光。第二个顶点在(250,250)并且发出绿色(0xff00ff00)的光。第三个顶点在(50,250)并且发出蓝绿色(0xff00ffff)的光。这些点中的每一个点都有一个被设为0.5的深度值和被设为1.0的 RHW 值。如果想得到更多有关这种顶点格式的信息,请看 变换过的和发光的顶点(Transformed and Lit Vertices) 一段。
下一步应该像下面这段代码一样调用 IDirect3DDecive8::CreateVertexBuffer 来建立顶点缓冲了。
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0 /* 用途 */, 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 复制到顶点缓冲中了。在顶点数据都在顶点缓冲中之后,代码调用了 IDirect3DVertexBuffer::Unlock 来解除对顶点缓冲的锁定。程序被要求做这样的锁定和解锁过程是因为顶点缓冲有可能在设备内存(译者:现阶段也就是指显存)中。 现在,顶点缓冲中已经填充了顶点,是渲染的时候了,请看 第三步: 渲染
第三步: 渲染到屏幕 顶点缓冲中已经填充了顶点,是渲染屏幕的时候了。渲染到屏幕首先要清空后缓冲成蓝色(译者:就是用蓝色做背景色),然后再调用 BeginScene 函数。
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L ); g_pd3dDevice->BeginScene();
渲染顶点缓冲中的顶点数据需要几个步骤。首先,你需要设置一个流资源;这样,你应该使用 stream 0。这个流资源应该调用 IDirect3DDevice8::SetStreamSource 来规定。
g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
SetStreamSource 的第一个参数告诉 Microsoft Direct3D 设备数据流的资源。第二个参数是要被绑定到数据流资源的顶点缓冲。第三个参数是每一个单元(component)的大小,按字节计算。在上面这段代码中,CUSTOMVERTEX 的大小被用作单元的大小。 下一步是调用 IDirect3DDevice8::SetVertexShader 来让 Direct3D 知道要用怎样的顶点阴影模式。总的来说,自定义顶点阴影是一个高级问题,但是大多数情况顶点阴影只是一个 FVF 码。这使得 Direct3D 知道正在处理怎样的顶点。下面这一段代码设置了顶点阴影。
g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX ); SetVertexShader 的唯一的一个参数是要使用的顶点阴影的句柄。这个参数的值可以由 IDirect3DDevice8::CreateVertexShader 返回,或者是一个 FVF 码。在这儿,程序使用了已被事先定义的 D3DFVF_CUSTOMVERTEX。 如果想了解有关顶点阴影的更多信息,请参阅: 顶点阴影(Vertex shaders) 一章。
下一步因该做的是,调用 IDirect3DDevice8::DrawPrimitive 来渲染顶点缓冲中的顶点。如下:
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
DrawPrimitive 所接受的第一个参数,是要渲染的基本类型的标志。在这个例子中使用了 D3DPT_TRIANGLELIST 这个标志来说明要渲染的是一个三角形带(TRIANGLELIST)。函数的第二个参数是要读取得第一个顶点的索引值。第三个参数用来说明有多少个基本类型要渲染。因为本程序只有一个三角形要画,所以这个值被设为1。 (译者:上一段中的 基本类型,原文为:primitive,在 D3D 中用来说明顶点所构成的三角形之间的关系,有 D3DPT_POINTLIST, D3DPT_LINELIST, D3DPT_LINESTRIP, D3DPT_TRIANGLELIST, D3DPT_TRIANGLESTRIP, D3DPT_TRIANGLEFAN 这几种类型。) 像要了解更多中的基本类型,请参阅:3-D Primitive(3-D 基本类型) 一章。 最后一步,应该结束场景并显示后缓冲。具体操作如下:
g_pd3dDevice->EndScene(); g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
在后缓冲被显示后,客户窗口(client window)显示了一个有三个颜色不同的顶点的三角形。 这一章教程为你说明了怎样使用顶点来渲染几何图形。 教程 3: 使用材质 将介绍采制的概念和怎样使用材质。
(教程 2 结束)
________________________________________________________________ Built on Wednesday, October 04, 2000 翻译于:2001年6月12日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CopyRight:1995-2000 Microsoft Corporation. All rights reserved. 翻译:FireAngelfireangel@yesky.com 陕西咸阳 OICQ:65667466 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|