装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

工具

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

广告



访客

 

上一次我们在Managed DirectX世界里接触到了Direct3D设备的概念,它是Direct3D中几乎所有功能的开始。从这次我要开始在DirectX中绘出3D图形了。3D图形常常用一组包围形状表面的多边形来表示,无论形状多么复杂,我们都可以用一定数目的多边形来逼近。目前用于游戏的显卡多使用三角形网格系统,即用一系列三角形来表示物体的表面。在电影级渲染中,还常常用到四边形网格。关于网格(mesh)这个重要的概念以后还会遇到,这次我将学习如何绘制三角形。

Direct3D支持的图元(Primitive)类型有点、线段、线条、三角、成片三角和三角扇形等。要绘制图元,必须将点集载入到数据流中。顶点缓冲区(Vertex Buffer)即是DirectX保存顶点数据的常用方式。在顶点缓冲区内我们可以对顶点进行各种操作,比如坐标变换、光照等。Direct3D支持灵活顶点格式(FVF),用户可以自行决定在一个顶点数据中包含那些数据,比如顶点的坐标、颜色、法向量等。可以自由搭配各种属性,以至于我们可用自定义的结构体来保存顶点数据。这次我选择的是一种已经预定义在DirectX类库中的类型:CustomVertex::TransformedColored。它包含顶点的坐标、经变换后的坐标以及顶点的漫反射颜色。

创建顶点缓冲区需要使用VertexBuffer类。要定义一个顶点缓冲区,需要下列参数:顶点的结构体类型、个数、设备、顶点缓冲区属性、顶点格式和顶点缓冲区的资源位置。顶点的结构体类型是一个System::Type类型参数(主要是获取顶点结构体的内存大小)。顶点缓冲区属性可以是Usage枚举中的任意值的组合,我这次就用None。顶点格式是对于灵活顶点格式的描述,必须准确指出顶点结构体中包含哪些数据。最后一个顶点缓冲区的资源位置表示将顶点缓冲区置于内存还是显存中。基于这些设置,就可以写出一个初始化顶点缓冲区的函数:

//顶点缓冲区全局对象
static VertexBuffer^ vb;

static Boolean InitializeVertexBuffer()
{
    //初始化一个三角形的顶点数组
    array<CustomVertex::TransformedColored>^ vertices =
        gcnew array<CustomVertex::TransformedColored>(3);

    vertices[0] = CustomVertex::TransformedColored(150.0, 50.0, 0.5, 1.0, 0xffffff00);
    vertices[1] = CustomVertex::TransformedColored(250.0, 250.0, 0.5, 1.0, 0xff00ff00);
    vertices[2] = CustomVertex::TransformedColored(50.0, 250.0, 0.5, 1.0, 0xff0000ff);
 
    try
    {
        //创建顶点缓冲区
        vb = gcnew VertexBuffer(
            typeid<CustomVertex::TransformedColored>,              
           
3,  /* 顶点个数 */
            d3dDevice,  /* 要使用的Direct3D设备 */
            Usage::None,  /* 顶点缓冲区属性 */
            CustomVertex::TransformedColored::Format,  /* 灵活顶点格式 */
            Pool::Default /* 顶点缓冲区资源位置,这里选择显存 */
        );

        //填充顶点缓冲区
        GraphicsStream^ gs = vb->Lock(0, 0, LockFlags::None);
  
        gs->Write(vertices);

        vb->Unlock();

        return true;
    }
    catch(DirectXException^)
    {
        return false;
    }

}

别忘了在CleanUp方法中清理使用过的VertexBuffer对象。接下来,我们需要在渲染函数中增加绘制图元的代码。注意:这些代码一定要放在对设备BeginScene函数和EndScene函数的调用之间,否则就会出错。

d3dDevice->SetStreamSource(0, vb, 0);
d3dDevice->VertexFormat = CustomVertex::TransformedColored::Format;
d3dDevice->DrawPrimitives(PrimitiveType::TriangleList, 0, 1);

最后,我们只要在main函数中添加调用创建顶点缓冲区函数的代码即可:

int Main()
{
    TestMDXForm^ f = gcnew TestMDXForm();
    if (DirectXProgram::InitializeDirect3D(f) &&
       
DirectXProgram::InitializeVertexBuffer())
    {
        //显示窗口
        f->Show();
        Application::DoEvents();

        Application::Run();
    }
    return 0;
}

其他的代码与上次的项目完全相同。运行看看绘制出来的效果吧:


随贴广告(测试期)
相关文章

打印 | 张贴于 2004-10-31 22:23:00 | Tag:技术随笔  Managed DirectX学习笔记

留言反馈

回复: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
翻译而已
2007-04-06 19:25:00 | [匿名用户:frank]
回复: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
很好,很期待有下篇。能不能用C#写啊?我很想了解渲染3D模型,如:圆柱、正方体、球体。希望能略指点一二
2006-12-13 22:16:00 | [匿名用户:来鑫]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
我好想学!
2006-09-11 10:37:00 | [匿名用户:曹雪华]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
怎么没有下一篇拉

加油啊
2005-09-23 11:15:00 | [匿名用户:kag_y]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
讲得不错,怎么这么点人来赞助呢,
2005-08-31 09:51:00 | [匿名用户:ray]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
赞一个!
顺便说一句:
是不是VB的很重要吗? ;)
2005-06-03 10:12:00 | [匿名用户:andrew]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
我也一样期待VB版的!
2005-01-20 23:20:00 | [匿名用户:涕淌]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
为什么不用VB来演示一下呢?

呵呵
2005-01-18 10:54:00 | [匿名用户:Rimbaud]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
希望老兄能出VB.NET版的DX
2004-11-06 15:46:00 | [匿名用户:baoye]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
DirectX开发毕竟还是要涉及底层和非托管的代码,VB.NET可以开发MDX,但一旦需要与非托管交互VB就要写很多麻烦的代码,而C++这时方便多了。
2004-11-05 20:49:00 | [匿名用户:Ninputer]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
作者应该是比较熟悉 vb.net 的了 为什么不用 vb.net 来做这个教程呢?
不解不解
2004-11-05 17:56:00 | [匿名用户:tintin]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
好!上半年我还在受课程的要求,自己用C++实现图形学的算法,痛苦,想起那些光照模型就头痛
2004-11-04 23:33:00 | [匿名用户:huangsuipeng(hsp-ec.net)]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
@YouFF

效果很想,但我的程序结构更像本地版DX的,而且是C++/CLI的,你都没处去找呢,呵呵。
2004-11-02 20:42:00 | [匿名用户:Ninputer]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
不是那个SDK里面有DEMO的代码么??
2004-11-02 08:34:00 | [匿名用户:YouFF]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
@sumtec

我也要想赞啊...只是觉得光说空话比较不好 :p
2004-11-01 21:57:00 | [匿名用户:Justin Shen]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
阅...嘎嘎..期待下篇
2004-11-01 08:57:00 | [匿名用户:cgyu]
re: Managed DirectX学习笔记(二)——创建顶点缓冲区 编辑
哎呀,这么好的东西竟然没有人来赞一个。我来赞一个!
2004-10-31 23:27:00 | [匿名用户:sumtec]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System