`
jgsj
  • 浏览: 959332 次
文章分类
社区版块
存档分类
最新评论

图形学 Direct3D的3D模型处理1

 
阅读更多

下面大部分内容来自DirectX龙书,整理了一下,不过没有太涉及模型格式问题。模型格式其实也是一些格式化的文档,保存了定点,单位向量,材质坐标等信息。这里主要讲怎么在DirectX里面怎么操作。

Mesh由几何图形组成,一般是由三角形组成。

Direct3D的.x的3d模型文件就是由三角形组成的。保存模型数据用ID3DXMesh,是有ID3DXBaseMesh集成而来的。

ID3DXBaseMesh 接口包括了顶点缓冲(vertex buffer)存储Mesh的顶点,和索引缓冲(index buffer)用来定义顶点的渲染顺序,以构成适用的三角形。如下面的函数:

HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* ppVB);
HRESULT ID3DXMesh::GetIndexBuffer(LPDIRECT3DINDEXBUFFER9* ppIB);

应用:

IDirect3DVertexBuffer9* vb = 0;
Mesh->GetVertexBuffer(&vb);

IDirect3DIndexBuffer9* ib = 0;
Mesh->GetIndexBuffer(&ib);

ID3DXMesh接口只支持三角形几何图形,因为ID3DXMesh的DrawSubse函数是默认调用D3DPT_TRIANGLELIST,画三角几何图形的函数参数。

Direct3D提供了锁读缓冲的功能,如下:可以通过参数ppData来读取定点缓冲和索引缓冲:

HRESULT ID3DXMesh::LockVertexBuffer(DWORD Flags, BYTE** ppData);
HRESULT ID3DXMesh::LockIndexBuffer(DWORD Flags, BYTE** ppData);

读完之后,用下面函数解锁:

HRESULT ID3DXMesh::UnlockVertexBuffer();
HRESULT ID3DXMesh::UnlockIndexBuffer();

以下是ID3DXMesh 的函数功能,用来读取mesh的各种信息的:

  • HRESULT GetDeclaration(D3DVERTEXELEMENT9
           Declaration[MAX_FVF_DECL_SIZE]);
    

    MAX_FVF_DECL_SIZE

    typedef enum {
          MAX_FVF_DECL_SIZE = MAXD3DDECLLENGTH + 1
    } MAX_FVF_DECL_SIZE;
    

    And MAXD3DDECLLENGTH定义在 d3d9types.h :

    #define MAXD3DDECLLENGTH 64
    
  • DWORD GetNumVertices();

    返回顶点数

  • DWORD GetNumBytesPerVertex();

    返回每定点的位数

  • DWORD GetNumFaces();

    返回三角形几何图形数量

mesh可以由一个或者多个子网组成。一个子网也就是一组三角形几何图形,可以用相同的属性渲染的。这里的属性是指:材质,纹理和渲染状态等。

子网可以用下标0,1,2...等来标识;而子网中的每个三角形几何图形有相对应的属性标识,标明该三角形属于哪个子网的。并额外用属性缓冲attribute buffer来存储标识号。这些标识号都与索引号是一一对应的,如索引号A,B,C表示三角形三个顶点,那么attribute buffer号i与其对应关系可以这样计算:

A = i · 3

B = i · 3 + 1

C = i · 3 + 2

如图:


用A[n]代表Attibute Buffer, 那么三角形0属于子网0,其Attribute Buffer号为0,即A[0],三角形1属于子网4,因为A[1]=4……三角形n属于子网2,A[n]=2;

Attibut Buffer同样可以锁定读取的:

DWORD* buffer = 0;
Mesh->LockAttributeBuffer(lockingFlags, &buffer);

      // Read or write to attribute buffer...

Mesh->UnlockAttributeBuffer();

下面看看如何在Direct3D中画模型

DrawSubset就是个画三角形几何图形的函数,可以带一个参数,这个参数为子网号。

Mesh->DrawSubset(0);//画子网号为0的所有三角形

所以我们可以用一个简单的循环就把所有模型都画出来。下面是个例子,而且每个子网都有自己的材质和纹理。

HR(mFX->BeginPass(0));

for(int j = 0; j < mMtrl.size(); ++j)
{
      HR(mFX->SetValue(mhMtrl, &mMtrl[j], sizeof (Mtrl)));

      if(mTex[j] != 0)
      {
            HR(mFX->SetTexture(mhTex, mTex[j]));
      }
      else
      {
            HR(mFX->SetTexture(mhTex, mWhiteTex));
      }

      HR(mFX->CommitChanges());
      HR(mMesh->DrawSubset(j));
}
HR(mFX->EndPass());

如果子网没有纹理的话,我们就把纹理设置为纯白色。因为材质颜色和光照颜色是作与运算的,所以白色值相当于1,1与任何数作与运算都等于任何数,也就是说没有纹理颜色的物体等于光照颜色。

// Combine the color from lighting with the texture color.
float3 color = (ambient + diffuse)*texColor.rgb + spec;

分享到:
评论

相关推荐

    精通Direct3D图形与动画程序设计 15_第十五章 粒子系统.rar

    1、SprayParticles 演示粒子系统的具体实现,粒子系统类的封装。 2、ComplexSample 一个综合性的示例程序,演示了摄影机类和场景漫游的实现,以及静态网格模型、动画网格模型、粒子系统的进一步封装和使用。

    《DirectX三维游戏编程》图书源代码

    基本空间变换,介绍计算机图形学的空间变换原理和算法。 第 5 章. Direct3D的绘制方法,介绍如何利用三维顶点、颜色、纹理等元素创建三维模型并绘制的方法。 第 6 章. Alpha融合,介绍利用Alpha通道的透明渲染方法...

    精通DirectX.3D图形与动画程序设计.pdf

    第一部分介绍了direct3d程序设计基础,包括三维坐标变换、光照处理、纹理贴图、雾化效果、文件模型、文本和字体等内容。第二部分介绍了direct3d程序设计的相关高级技术,包括多层纹理映射、纹理坐标自动生成与变换、...

    精通DirectX.3D图形与动画程序设计.part4

    第一部分介绍了Direct3D程序设计基础,包括三维坐标变换、光照处理、纹理贴图、雾化效果、文件模型、文本和字体等内容。第二部分介绍了Direct3D程序设计的相关高级技术,包括多层纹理映射、纹理坐标自动生成与变换、...

    DirectX3D游戏编程指南

    但是,该初始化过程仍然假定程序员已十分熟悉基本的图形学概念及Direct3D的一些基本类型。本章的前几小节将讲述这些必备知识。在您掌握了这些基础知识之后,本章的剩余部分将主要讲解Direct3D的初始化过程。

    DirectX游戏开发终极指南百度云下载地址大小130MB

    《DirectX游戏开发终极指南》涵盖了游戏开发过程和方方面面,书中以一个名为Straned的第一人称射击游戏开发过程为主题展开介绍,首先介绍了DirectX和Direct3D图形学,然后逐章介绍了游戏引擎和完整游戏的开发过程。...

    WPF高级实战课程《知产代理数字化解决方案》下载

    在WPF应用程序中无论是2D还是3D的图形或者文字内容都会被转换为3D三角形、材质和其他Direct3D对象,并由硬件负责渲染,因此它能够更好的利用系统的图像处理单元GPU,从硬件加速中获得好处。 4、声明式编程 WPF引入一...

    DirectX游戏开发终极指南

    本书涵盖了游戏开发过程和方方面面,书中以一个名为straned的第一人称射击游戏开发过程为主题展开介绍,首先介绍了directx 和direct3d图形学,然后逐章介绍了游戏引擎和完整游戏的开发过程。主要内容涉及到基本的...

    游戏编程--大师技巧

     第七章 高级DirectDraw和位图图形  真彩色模式下工作  双缓冲  动态画面  页面变换  应用图形变换器  剪切基础  采用位图  备用画面  位图的放旋转和缩放  离散采样理论  色彩效果  人工色彩变换或者...

    directx+3d

    很好的图形学代码 02_第二章 Direct3D程序设计基础 03_第三章 坐标系与基本图元 04_第四章 顶点坐标变换 05_第五章 光照与材质 06_第六章 纹理映射基础 07_第七章 使用文件模型 08_第八章 深度测试与Alpha混合 09_第...

    CUDA编程指南5.0

    3.2.9.2 Direct3D互操作性 70 3.2.9.3 SLI(速力)互操作性 82 3.3 版本和兼容性 82 3.4 计算模式 83 3.5 模式切换 84 3.6 Windows上的Tesla计算集群模式 85 第四章硬件实现 87 4.1 SIMT 架构 87 4.2 硬件多线程 88 ...

    OPenGL编程书籍

    在一课我们将教你绘制3D的图形字体,它们可像一般的3D模型一样被变换。 15.图形字体的纹理映射: 这一课,我们将在上一课的基础上创建带有纹理的字体,它真的很简单。 16.看起来很酷的雾 这一课是基于第7课的代码...

    Nehe的OpenGL教程电子书

    在一课我们将教你绘制3D的图形字体,它们可像一般的3D模型一样被变换。 15.图形字体的纹理映射: 这一课,我们将在上一课的基础上创建带有纹理的字体,它真的很简单。 16.看起来很酷的雾 这一课是基于第7...

    VC与Labview、Matlab编程论文资料[2].rar

    基于VC_Maya_Matlab的图形学算法实验平台.pdf 基于VC_MFC的滑动轴承设计软件开发.pdf 基于VC__NET的串行通信的机器人控制系统设计.pdf 基于VC_与LabVIEV的微机采样与保护算法虚拟测试软件的研制.pdf 基于VC_与Matlab...

Global site tag (gtag.js) - Google Analytics