图形学 Direct3D的3D模型处理1
来源:互联网 发布:淘宝司法拍卖房产信息 编辑:程序博客网 时间:2024/06/05 10:13
下面大部分内容来自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的3D模型处理1
- 图形学 Direct3D的3D模型处理2 - 邻接三角形的信息及优化
- 图形学 Direct3D中手动创建3D模型
- direct3d 3d模型模板
- 3D图形学编程基础-基于Direct3D11-学习记录(二)光照模型的实现
- 关于计算机图形学的3d数学
- 3D图形学算法
- 3D图形学文章
- 3D图形学专业术语
- 3D图形学专业术语
- 3D图形学概念
- 3D 图形学
- Direct3d & opengl & 3d max的配置和使用
- 3D图形学的线性代数的通俗解释。
- 3D图形学基本概念澄清
- 3D图形学基本概念澄清
- 3D图形学坐标系变换
- 3D图形学坐标系变换
- TOJ 3349 Counting Divisor / 素数筛选法
- 关于Java中String的几个小问题
- linux内核树的建立 (转)
- CenOS 6.4下安装stardict和qstardict
- poj 1112 染色+DP
- 图形学 Direct3D的3D模型处理1
- opengl 教程(12) 投影矩阵
- java矩阵包
- opengl 教程(13) 摄像机坐标系
- 升级iOS7心得
- opengl 教程(14) 摄像机控制(1)
- OCP-1Z0-052-V8.02-114题
- 不回调ServiceConnection中onServiceConnected()方法的问题
- 开发与研发-奋斗~