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

图形学 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学习资源

    8. **着色器编程**:Direct3D使用 HLSL(High-Level Shader Language)编写着色器,包括顶点着色器、像素着色器、几何着色器等,它们控制了图形的计算和颜色处理。 9. **Direct3D 11与Direct3D 12的区别**:Direct...

    Direct3D游戏编程入门教程

    Direct3D游戏编程入门教程是专门面向希望掌握Direct3D图形编程技术的程序员的教材,本书内容基于DirectX 9.0版本。本书详细介绍了Direct3D技术的历史背景、基础概念、3D程序设计的术语和概念,以及一些高级的编程...

    Direct3D网格模型

    Direct3D网格模型是计算机图形学中的一个重要概念,主要用于在3D环境中构建和展示复杂的几何形状。在游戏开发、虚拟现实、科学可视化等领域,Direct3D网格模型的应用广泛且至关重要。下面将详细介绍Direct3D网格模型...

    Direct3D Web文档

    2. **渲染管线**:Direct3D的渲染管线是处理图形数据并将其转化为屏幕图像的过程。它包括顶点处理(输入装配、顶点着色器)、几何处理(几何着色器、光栅化)和像素处理(像素着色器)等阶段。 3. **资源管理**:...

    Direct3D渐进网格模型处理

    Direct3D渐进网格模型处理是一项重要的图形技术,它旨在优化3D模型的渲染效率,减少CPU在处理大量几何数据时的负担。在游戏开发、虚拟现实应用以及其他高性能图形领域,这种技术尤其有价值,因为它能够实时地降低...

    Direct3D 学习范例

    Direct3D是微软开发的一种图形应用程序接口(API),主要用于创建高性能的2D和3D图形。这个"Direct3D 学习范例"是基于Visual Studio 2010的一个项目,它展示了如何利用Direct3D来模拟太阳、月亮和地球的运动,这涉及...

    计算机图形学——球的光照模型算法

    总结来说,"球的光照模型算法"是计算机图形学中模拟真实世界光照效果的关键技术,它涉及到法线计算、光源参数处理以及漫射光、镜面高光的计算。在C++和MFC环境中,通过图形库我们可以实现这一算法,进而创建出具有...

    Beginning Direct3D Game Programming Direct3D技术内幕

    《Direct3D游戏编程入门:Direct3D技术内幕》是一本专为初学者设计的教程,旨在引导读者深入了解和掌握Direct3D这一强大的3D图形编程接口。Direct3D是微软Windows平台上广泛使用的API,主要用于创建高质量的三维图形...

    Direct3D技术内幕

    Direct3D技术内幕是计算机图形学领域中关于微软Direct3D API的一本深入解析书籍,主要面向游戏开发人员、图形程序设计师以及对3D图形编程感兴趣的程序员。这本书详细阐述了Direct3D的核心概念、工作原理以及实用编程...

    Direct3D教程c#版

    1. **Direct3D基础知识**:首先,教程可能会介绍Direct3D的基础概念,包括设备创建、上下文管理、渲染目标和深度缓冲等。这些是进行图形绘制的基本元素,理解它们对于后续的学习至关重要。 2. **图元类型和绘制调用...

    c# direct3D教程

    Direct3D是微软开发的一个图形应用程序接口(API),主要用于创建高性能的3D图形,尤其是在游戏开发和专业可视化领域。在C#中使用Direct3D,开发者可以利用.NET框架的便利性和DirectX的强大功能来构建复杂的3D应用。...

    基于mfc的direct3d程序

    将Direct3D与MFC结合,可以利用MFC的窗口管理、事件处理和资源管理功能,同时利用Direct3D的强大图形渲染能力,构建高效且用户友好的3D应用。 在基于MFC的Direct3D程序中,首先需要理解MFC的基本架构和工作流程。...

    3D数据基础 图像学 direct3D资料打包.7z

    其中包含三份重要的文档:《Direct3D游戏编程入门教程.pdf》、《3D数学基础:图形与游戏开发.pdf》以及《计算机图形学 PPT完整版.ppt》。这些文件将带领我们探索3D图形编程的世界,特别是聚焦于Direct3D这一强大的...

    Beginning Direct3D Game Programming

    同时,书里还会涉及多边形裁剪、背面消除等图形学基本原理,这些都是3D渲染中不可或缺的部分。 为了实现动态的3D场景,你需要掌握动画和帧同步。这部分内容可能包括关键帧动画、骨骼动画以及如何使用定时器确保游戏...

    Direct3D教材和源代码

    1. **Direct3D架构**:Direct3D 是Windows API的一部分,它提供了一个层次化的、设备无关的方式来访问硬件加速的3D图形功能。它包括渲染管线,即数据从输入到屏幕显示的处理流程,包括顶点处理、几何变换、光栅化和...

    Direct3D起步-教程

    Direct3D是微软开发的一种图形应用程序接口(API),主要用于创建高性能的三维图形,尤其是在游戏开发和专业图形渲染领域。这个“Direct3D起步-教程”是为初学者设计的,旨在帮助他们理解Direct3D的基本概念和技术,...

    Direct3D Primer 5

    Direct3D是微软开发的一个图形应用程序接口(API),主要用于Windows平台上的高性能3D图形处理。它是Windows API的一部分,被广泛应用于游戏开发、科学可视化和专业图形设计等领域。通过Direct3D,开发者可以直接与...

    Direct3D游戏开发入门教程(附源代码)

    PDF格式的学习资料“学习Direct3D中的2D-Focus.On.2D.in.Direct3D.-.fly.pdf”可能涵盖了如何在Direct3D中处理2D图形。虽然Direct3D主要针对3D图形,但处理2D图像也是必要的,特别是在制作游戏界面、菜单和过场动画...

    精通direct3d图形及动画程序设计源代码下载

    1. **DirectX 3D9**: Direct3D 9是DirectX的一个版本,专注于3D图形处理。它包含了对硬件加速的支持,以及一系列改进的特性,如顶点和像素着色器、纹理压缩、多线程渲染等。这些特性使得Direct3D 9能够实现复杂的3D...

    direct3d9.0初级教程

    2. 图形管道(Graphics Pipeline):Direct3D中的图形管道是一个处理流水线,它将输入数据转化为屏幕上的像素。这个过程包括顶点处理、光栅化和像素着色等阶段。 3. 顶点缓冲区(Vertex Buffer):顶点缓冲区存储着...

Global site tag (gtag.js) - Google Analytics