网页功能: 加入收藏 设为首页 网站搜索  
D3D教程-2:渲染顶点
发表日期:2007-01-22作者:[转贴] 出处:  

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();


  渲染顶点缓冲中的顶点数据需要几
我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 D3D教程-2:渲染顶点
本类热点文章
  DDraw和D3D立即模式编程手册
  矩阵求逆的快速算法
  本地化支持:OGRE+CEGUI中文输入:OGRE方..
  Direct3D中实现图元的鼠标拾取
  3D场景中的圆形天空顶
  OpenGL显卡编程
  一种高效的基于大规模地形场景的OCCLUS..
  一个完善的读取3DS文件例子
  如何制作一个可控制的人体骨骼模型
  Direct3D 入门之我见
  Slope(斜坡) 法线生成算法,在地形渲染..
  新手翻译的FAQ--可视和转换(学opengl两..
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00656