·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
您现在的位置:天新网 > 软件开发 > 开发文摘 > .Net文摘
DX图形显示基本流程(基于MESH静态模型绘制----托管代码)
http://dev.21tx.com 2005年05月11日


MESH的得到一般使用Mesh.FromFile方法。当然它有很多个重载。

一般使用 public static Mesh FromFile(string, MeshFlags, Device, out ExtendedMaterial); 方法。要注意的是,MESH的读取要在初始D3D设备以后来作。在MESH的初始方法中都需要D3D设备为参数,以后的MESH绘制也使用此设备。

对D3D设备的初始化中设置一般的显示属性,比如:深度测试,多重采样,灯光渲染开关,等等。
PresentParameters presentParams = new PresentParameters();

presentParams.Windowed=true;

presentParams.SwapEffect = SwapEffect.Discard;

presentParams.EnableAutoDepthStencil=true;

presentParams.AutoDepthStencilFormat=DepthFormat.D16;

presentParams.MultiSample=MultiSampleType.NonMaskable;

MyDev = new Device(0, DeviceType.Hardware, this,CreateFlags.HardwareVertexProcessing, presentParams);

MyDev.RenderState.MultiSampleAntiAlias=true;

MyDev.RenderState.Lighting=true;

MyDev.RenderState.CullMode=Cull.None;

MyDev.RenderState.ZBufferEnable=true;

MyDev.RenderState.ZBufferFunction=Compare.LessEqual;

MyDev.RenderState.ZBufferWriteEnable=true;

MyDev.RenderState.Ambient=MaterColor;


PresentParameters presentParams = new PresentParameters();

presentParams.Windowed=true;

presentParams.SwapEffect = SwapEffect.Discard;

presentParams.EnableAutoDepthStencil=true;

presentParams.AutoDepthStencilFormat=DepthFormat.D16;

presentParams.MultiSample=MultiSampleType.NonMaskable;

MyDev = new Device(0, DeviceType.Hardware, this,CreateFlags.HardwareVertexProcessing, presentParams);

MyDev.RenderState.MultiSampleAntiAlias=true;

MyDev.RenderState.Lighting=true;

MyDev.RenderState.CullMode=Cull.None;

MyDev.RenderState.ZBufferEnable=true;

MyDev.RenderState.ZBufferFunction=Compare.LessEqual;

MyDev.RenderState.ZBufferWriteEnable=true;

MyDev.RenderState.Ambient=MaterColor;



对于灯光的设置,可以根据需要放在每侦渲染函数内调整,也可以把固定灯光放在绘制之前。



一般绘制一个MESH时候,其中每个模型块都采用相同的世界矩阵。在绘制MESH之前设置好WORLDMATRIX即可。有时一个场景内MESH太多,而有些MESH共同组成一个物体时,对于每个MESH调整WORLDMATRIX可能会非常麻烦。所以最好是按照对应相对坐标调整好这些MESH的坐标,之后对这一组MESH采用同样的WORLDMATRIX。在修改MESH顶点数据之前,先使用Mesh.Clone复制出一个自己控制顶点数据格式的MESH。

public Mesh Clone(MeshFlags, VertexFormats, Device);

根据你需要的 VertexFormats格式,便可以容易的遍历修改顶点数据。当然,在修改前不要忘记LOCK你要修改的数据流。



对于MESH里包含的材质和纹理,需要你手动来调整。在MESH的FROMFILE中,已经OUT出了一个包含纹理的材质组ExtendedMaterial。

我们要声明一个材质组,一个纹理组。

Texture[] meshTextures = new Texture[materials.Length];

Material[] meshMaterials = new Direct3D.Material[materials.Length];

之后分离材质和纹理。

for( int i=0; i<materials.Length; i++ )

{

meshMaterials[i] = materials[i].Material3D;

// Set the ambient color for the material. Direct3D

// does not do this by default.

meshMaterials[i].Ambient = meshMaterials[i].Diffuse;

// Create the texture.

meshTextures[i] = TextureLoader.FromFile(dev,materials[i].TextureFilename);

}





现在我们可以绘制MESH了。

for( int i=0; i<meshMaterials.Length; i++ )

{

// Set the material and texture for this subset.

device.Material = meshMaterials[i];

device.SetTexture(0, meshTextures[i]);



// Draw the mesh subset.

mesh.DrawSubset(i);

}

最后别忘记device.EndScene();device.Present();







在上边D3D设备初始的时候,我们启动了趁度测试,所以,在绘制每侦前,调用CLEAR函数时,一并要清理深度缓冲,否则绘制会一踏糊涂。





以上是基本MESH静态模型绘制。对于其他高级效果的绘制,以后再写。

上一篇: neoswiff编译器选项罗列
下一篇: 使用NUnit进行单元测试

英特尔 酷睿(TM)2双核,送指纹识别器一个,再赠两份好礼,请电800-858-2418

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
晨新科技 版权所有 Created by TXSite.net