好的资源 : http://dev.gameres.com/Program/Visual/DirectX/ManagedDirectX9_1.htm
(1) Device类是DirectX里的所有绘图操作所必须的。可以把这个类假想为真实的图形卡。场景里所有其他图形对象都依赖于device。你的计算机里可以有一个到几个device,在Mnaged DirctX3D里,你可以控制任意多个device。
例子:画一个矩形并且贴图(使用VertexBuffer)
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.LightCoral, 1.0f, 0);
device.BeginScene();//开始渲染
SetupMatrices();
device.SetTexture(0, texture);//为Device类对象device增加使用的第0个纹理
device.SetStreamSource(0, vertexBuffer1, 0);
device.VertexFormat = CustomVertex.PositionTextured.Format;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
device.EndScene();//渲染结束
device.Present();//更新显示区域,把后备缓存的D图形送到图形卡的显存中显示
画三维模型(使用mesh)
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.WhiteSmoke, 1.0f, 0);
device.BeginScene();
SetupMatrices();
for (int i = 0; i < meshMaterials1.Length; i++)//Mesh中可能有多个3D图形,逐一显示
{
device.Material = meshMaterials1[i];//设定3D图形的材质
device.SetTexture(0, meshTextures[i]);//设定3D图形的纹理
mesh.DrawSubset(i); break;//显示优化的3D图形
}
device.EndScene();
device.Present();
(2) VertexBuffer类
Direct3D已经包含了这种机制:顶点缓冲(vertex buffer)。顶点缓冲,就像他名字的意思一样:一块储存顶点的内存。顶点缓冲的机动性能完美实现共享场景里变经过变换的几何体。如何让我们在第一章编写的三角形程序使用顶点缓冲呢?
创建顶点缓冲同样简单,有三个构造函数能完成这个任务,我们依次来看看:
public VertexBuffer( Device device, int sizeOfBufferInBytes, Usage usage, VertexFormats vertexFormat, Pool pool);
public VertexBuffer( Type typeVertexType, int numVerts, Device device, Usage usage,VertexFormats vertexFormat, Pool pool);
以下是各参数的意义:
device——用来创建顶点缓冲的device,创建的顶点缓冲只能被这个device使用;
sizeOfBufferInBytes——所创建的顶点缓冲大小,以字节为单位。使用带有这个参数的构造函数创建的顶点缓冲可以存放任何类型的顶点;
typeVertexType——如果去要创建的顶点缓冲只储存一种类型的顶点,则使用这个参数。它的值可以是CustomVertex类中的顶点结构类型,也可以是自定义的顶点类型。且这个值不能为null;
numVert——指定了顶点缓冲的储存类型之后,也必须指定缓冲储存的顶点数量最大值。这个值必须大于0;
usage——定义如何使用顶点缓冲。并不会是所有Usage类型的成员都能使用,只有一下几个是正确的参数:
DoNotClip,Dynamic, Npatches, Points, PTPatches, SoftwareProcessing, WriteOnly;
vertexFormat—— 定义储存在顶点缓冲中的顶点格式。,如果创建的为通用缓冲的话,则使用VertexFormat.None;
pool——定位顶点缓冲使用的内存池位置,可以指定一下几个内存池位置:
Default, Managed, SystemMemory, Scratch。
(3) Mesh类--控制3d模型
Mesh可以用来储存任何类型的图形数据,但主要用来封装复杂的模型。Mesh类同样也有一些用来提高渲染物体性能的方法,对于不同的距离,需要优化纹理,代码如下:
mesh1 = Mesh.Clean(CleanType.Simplification, mesh, adjacency, adjacency);
mesh2 = new ProgressiveMesh(mesh1, adjacency, null, 1, MeshFlags.SimplifyVertex);//设置可简化的模型类
mesh2.NumberVertices = 1000;
mesh2.NumberFaces = 1000;
if(distance<10) //使用未优化Mesh
{ mesh2.NumberVertices = 1000;
mesh2.NumberFaces = 1000;
}
else //使用优化Mesh
{mesh2.NumberVertices = 100;
mesh2.NumberFaces = 100;
}