D3D教程-2:渲染顶点



Microsoft DirectX 8 (C)

________________________________________________________________
Microsoft DirectX Graphics C/C Tutorials
Tutorial 2: Rendering Vertices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CopyRight:1995-2000 Microsoft Corporation. All rights reserved.
翻译:[email protected]      陕西咸阳  OICQ:65667466
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

教程 2: 渲染顶点
  用 Microsoft Direct3D 编写使用顶点来绘制几何图形个 3-D 场景都包含了个或多个几何图形顶点例程创建了最简单图形,个 3角形,并且把它渲染和显示到屏幕上

步: 定义个自定义顶点类型
第 2步: 设置顶点缓冲
第 3步: 渲染

介绍说明: 顶点例程路径是:
  (SDK 跟目录)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut02_Vertices
  顶点例程中代码和创建设备例程中代码几乎是渲染顶点是这个例程中唯有关顶点代码,并且在这个例程中并没有改动有关化D3D,处理 Microsoft Windows 消息,渲染,或是关闭代码如果你想得到有关这些部分详细信息,清参阅 教程 1: 创建设备


步: 定义个自定义顶点类型
  顶点例程用 3个顶点渲染了个 2-D  3角形先介绍下顶点缓冲顶点缓冲是种用来存储和渲染顶点 Microsoft Direct3D 对象我们可以用很多种规定顶点结构和和的对应可变顶点格式(FVF)思路方法来定义顶点顶点例程中顶点格式由下面段代码定义

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // 变换后顶点坐标
    DWORD color;        // 顶点颜色
};

  以上结构规定了自定义顶点格式步应该做是定义用来描述顶点缓冲中顶点FVF(可变顶点格式)下面代码定义了个和上面自定义顶点结构相对应得 FVF

# D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

Flexible vertex format (FVF) flags (可变顶点格式标志) 描述了怎样顶点正在被使用上面这段代码例子使用了 D3D_XYZRHW 和 D3DFVF_DIFFUSE 标志,这两个标志告诉了顶点缓冲自定义顶点类型是个变换后点后面跟上个颜色分量

  现在自定义顶点格式和 FVF 都确定了, 下步应该像 第 2步: 设置顶点缓冲 中描述那样向顶点缓冲里放顶点了

介绍说明: 在顶点例程中顶点是变换过了简单说,它们已经是在 2-D 窗口坐标系中了也就是说, (0,0)点就是窗口左上角,而 X轴正方向是右, Y轴正方向是下同时,这些顶点还是亮,这介绍说明它们没有使用 Direct3D 灯光而是使用了由它们颜色支持光影效果


第 2步: 设置顶点缓冲
  现在,自定义顶点格式已经定义了,是化顶点时候了顶点例程在建立了必须 Microsoft Direct3D 对象后中定义 InitVB 来作这下面段代码化了 3个自定义顶点

CUSTOMVERTEX g_Vertices =
{
    { 1500f,  500f, 05f, 10f, 0xffff0000, }, // x, y, z, rhw, color
    { 2500f, 2500f, 05f, 10f, 0xff00ff00, },
    {  500f, 2500f, 05f, 10f, 0xff00ffff, },
};

  这段代码给那 3个顶点附上 3角形顶点值,并且规定了每个顶点所要发出颜色个顶点在(150,150)并且发出红色(0xffff0000)第 2个顶点在(250,250)并且发出绿色(0xff00ff00)第 3个顶点在(50,250)并且发出蓝绿色(0xff00ffff)这些点中个点都有个被设为0.5深度值和被设为1.0 RHW 值如果想得到更多有关这种顶点格式信息,请看 变换过和发光顶点(Transformed and Lit Vertices) 

  下步应该像下面这段代码 IDirect3DDecive8::CreateVertexBuffer 来建立顶点缓冲了

( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*(CUSTOMVERTEX),
                                             0 /* 用途 */, D3DFVF_CUSTOMVERTEX,
                                             D3DPOOL_DEFAULT, &g_pVB ) ) )
     E_FAIL;
   
  CreateVertexBuffer 前两个参数向 Direct3D 描述了新顶点缓冲所要求空间大小和用途后两个参数规定了顶点格式和顶点缓冲位置这里所用顶点格式是 D3DFVF_CUSTOMVERTEX, 这种FVF是由前面代码所规定D3DPOOL_DEFAULT 标志告诉 Direct3D 在内存中创建这个顶点缓冲最合适最后个参数是要创建顶点缓冲地址
  创建好个顶点缓冲的后就应该向下面这样向缓冲填充顶点了

VOID* pVertices;
( FAILED( g_pVB->Lock( 0, (g_Vertices), (BYTE**)&pVertices, 0 ) ) )


     E_FAIL;
memcpy( pVertices, g_Vertices, (g_Vertices) );
g_pVB->Unlock;

  顶点缓冲首先被用 IDirect3DVertexBuffer8::Lock 锁定这个个参数是所要锁定顶点数据区偏移量按字节计算第 2个参数是要锁定顶点数据区大小仍用字节计算第 3个参数是个指向个 BYTE 数据类型指针指向要填充数据第 4个参数告诉顶点缓冲怎样锁定数据区
  这的后顶点数据就被用 memcpy 复制到顶点缓冲中了在顶点数据都在顶点缓冲中的后代码了 IDirect3DVertexBuffer::Unlock 来解除对顶点缓冲锁定被要求做这样锁定和解锁过程是顶点缓冲有可能在设备内存(译者:现阶段也就是指显存)中
  现在顶点缓冲中已经填充了顶点是渲染时候了请看 第 3步: 渲染


第 3步: 渲染到屏幕
  顶点缓冲中已经填充了顶点是渲染屏幕时候了渲染到屏幕首先要清空后缓冲成蓝色(译者:就是用蓝色做背景色)然后再 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, (CUSTOMVERTEX) );

  SetStreamSource 个参数告诉 Microsoft Direct3D 设备数据流资源第 2个参数是要被绑定到数据流资源顶点缓冲第 3个参数是每个单元(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 这个标志来介绍说明要渲染个 3角形带(TRIANGLELIST)第 2个参数是要读取得第个顶点索引值第 3个参数用来介绍说明有多少个基本类型要渲染只有个 3角形要画所以这个值被设为1
  (译者:上段中 基本类型原文为:primitive在 D3D 中用来介绍说明顶点所构成 3角形的间关系有 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个颜色区别顶点 3角形
  这章教程为你介绍说明了怎样使用顶点来渲染几何图形 教程 3: 使用材质 将介绍采制概念和怎样使用材质

(教程 2 结束)

________________________________________________________________
Built on Wednesday, October 04, 2000
翻译于:2001年6月12日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CopyRight:1995-2000 Microsoft Corporation. All rights reserved.
翻译:[email protected]    陕西咸阳  OICQ:65667466
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tags: 

延伸阅读

最新评论

发表评论